如何在JavaScript中验证时间戳

34

如何使用Javascript验证时间戳并接受多种格式,例如YYYY-MM-DD HH:mm:ss.S,YYYY-MM-DD HH:mm:ss AM / PM。


Date.js?请参见http://stackoverflow.com/questions/2408202/jquery-datejs-is-there-validation-for-full-date - Alex K.
8个回答

60

你可以像这样验证一个字符串是否是有效的时间戳:

var valid = (new Date(timestamp)).getTime() > 0;

var valid = (new Date('2012-08-09')).getTime() > 0; // true
var valid = (new Date('abc')).getTime() > 0; // false

经过多年后重新审视这个答案,验证日期仍然具有挑战性。 然而,一些观点认为内置解析器接受了许多输入格式,其中很多与此问题关系不大。

这里的问题是验证多种格式的时间戳,如果日期解析器无法帮助您,则需要将时间戳转换为可比较的通用格式。 如何转换取决于输入的格式,在不兼容的情况下,需要开发量身定制的转换算法。

要么使用内置的日期解析器,如上所述,否则,您将不得不手动解析输入并相应地进行验证。


1
Date.parse中,“valid”指的是Date constructor可以解析的日期格式。这个解析结果在不同的浏览器上可能会有所不同。 - David Hellsing
2
谢谢,但是如果输入格式不符合解析器的要求,仍然需要事先进行转换。 - Jørgen
3
注意:这会返回 true,即使日期字符串是“4”,在技术上它是一个有效的时间戳,但在您的应用程序上下文中可能不是一个有效的日期。 - Jason
1
var valid = Date.parse(timestamp) > 0; 将会得到相同的结果。 - dina
2
当在if语句中使用时,我相信您甚至可以删除> 0并只使用if ((new Date(timestamp))。getTime()){console.log(“这是一个日期!”);} - taykay08
显示剩余4条评论

11

@Jørgen的解决方案不错,但如果你有一个在1970年1月1日之前的日期,你的时间戳将是一个负数,但也是一个有效的时间戳。

function isValidTimestamp(_timestamp) {
    const newTimestamp = new Date(_timestamp).getTime();
    return isNumeric(newTimestamp);
}

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

我依据以下SO答案进行数字验证。
例如:
isValidTimestamp('12/25/1965') // true

6

每个有效的数字都是一个时间戳。如果它满足有效整数数字的条件,那么它也将满足有效时间戳的条件。

时间戳 = 自1970/01/01以来的毫秒数


4

3
W3Schoola很糟糕,而且Date.parse非常不可靠,因为它取决于实现方式。应该手动解析日期字符串。 - RobG
1
你能告诉我为什么w3schools很糟糕吗?你能给我举一个Date.parse不可靠的例子吗? - Srinivas
w3fools 提供了一些提示。在 ECMA-262 ed 3 中,Date.parse 完全依赖于实现,在 ES5 浏览器中应支持修改后的 ISO8601 长格式(但有些浏览器不支持)。Date.parse('2012-02-01') 在 IE < 9 和 Safari 中失败,Date.parse('2012/02/01') 则没有问题,但在大多数版本的 Firefox 中失败。有些浏览器无法解析 '01-02-2012',但可以解析 '01/02/2012',所有浏览器都将它们视为奇特的美国日期格式,而不考虑系统设置。我已经放弃跟踪并手动解析日期。 - RobG

1

如果不事先知道日期字符串的格式,或者至少知道它是有限数量格式之一,就无法通用地解析日期字符串。

如果日期组件始终以ISO8601格式(yyyy-mm-dd)表示,时间为24小时制或12小时制带有AM或PM,则应该能够轻松分离出时间,查找AM或PM,然后根据是否存在来处理时间为12或24小时制。

时区必须指定为UTC(Z)或小时+/- UTC,缩写如EST具有歧义性(且未标准化)。


1
/**
 * Determine whether string is timestamp
 *
 * @example
 *
 * isTimestamp('1606205966448'); // true
 * isTimestamp(1606205966448); // true
 * isTimestamp('1606205966448qwe'); // false
 * isTimestamp('2020-11-24T08:19:26.448Z'); // false
 *
 * @param {string|number} n
 * @returns {boolean}
 */
function isTimestamp(n) {
  const parsed = parseFloat(n);

  return !Number.isNaN(parsed) && Number.isFinite(parsed) && /^\d+\.?\d+$/.test(n);
}

export default isTimestamp;

0
通过使用 new Date().getTime();,你可以做到这一点。
并且像这样做。
var getDate="12-12-2012";
var myDate=getDate.split("-");
var getDate=myDate[1]+"/"+myDate[0]+"/"+myDate[2];
alert(new Date(getDate).getTime());

0

警告! Jørgen的答案在1970年之前不起作用。

getTime将在不是有效日期时返回NaN(不是数字),因此我们将使用内置函数isNaN进行检查,并使用!反转该值。

!isNaN(new Date("1969-02-13").getTime())

处理日期可能会很麻烦。建议使用经过实战检验的库,例如date-fns或类似的库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接