下面的代码有什么问题?
也许只比较日期而不是时间会更简单。我也不知道该怎么做,我搜索了,但我找不到我的确切问题。
顺便说一句,当我在警报中显示两个日期时,它们显示的完全相同。
我的代码:
window.addEvent('domready', function() {
var now = new Date();
var input = $('datum').getValue();
var dateArray = input.split('/');
var userMonth = parseInt(dateArray[1])-1;
var userDate = new Date();
userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
if (userDate > now)
{
alert(now + 'n' + userDate);
}
});
有没有更简单的方法来比较日期而不包括时间?
当心时区
立即使用日期对象来表示只是一个日期会让您陷入一个巨大的过度精度问题。您需要管理时间和时区以将它们拒之门外,并且它们可以随时潜入。 这个问题的公认答案落入了陷阱。
javascript 日期有
no notion of timezone
。这是一个时刻(从纪元开始滴答),带有方便的(静态)函数,用于与字符串进行相互转换,默认情况下使用设备的“本地”时区,或者,如果指定,UTC 或其他时区。要用日期对象表示 just-a-date™,您希望您的日期表示相关日期开始时的 UTC 午夜。这是一个常见且必要的约定,它使您可以使用日期而不考虑日期他们创作的季节或时区。因此,您需要非常警惕地管理时区的概念,无论是在创建午夜 UTC 日期对象时还是在序列化它时。很多人对控制台的默认行为感到困惑。如果您向控制台喷一个日期,您看到的输出将包括您的时区。这只是因为控制台在您的日期调用
toString()
,而toString()
为您提供本地表示。基础日期has no timezone
! (只要时间与时区偏移相匹配,您仍然有一个午夜 UTC 日期对象)反序列化(或创建午夜 UTC 日期对象)
这是舍入步骤,有两个“正确”答案。大多数时候,您会希望您的日期反映用户的本地时区。 我在这里的日期是几号。。新西兰和美国的用户可以同时点击,通常会得到不同的日期。在这种情况下,这样做...
有时,国际可比性胜过当地的准确性。在这种情况下,这样做...
反序列化日期
电汇上的日期通常采用 YYYY-MM-DD 格式。要反序列化它们,请执行此操作...
序列化
在创建时注意管理时区后,现在需要确保在转换回字符串表示时将时区排除在外。 所以你可以安全地使用...
toISOString()
getUTCxxx()
getTime() //returns a number with no time or timezone.
.toLocaleDateString("fr",{timeZone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
并完全避免其他一切,尤其是......
getYear()
,getMonth()
,getDate()
所以回答你的问题,晚了7年......
See it running...
2022 年更新...带测试的免费内容...
下面的代码现在是一个 npm 包, Epoq 。代码在 github 上。别客气 :-)
2019 年更新...免费内容...
鉴于此答案的受欢迎程度,我已将其全部放入代码中。以下函数返回一个包装的日期对象,并且只公开那些可以安全地与 just-a-date™ 一起使用的函数。
使用 Date 对象调用它,它将解析为反映用户时区的 JustADate。用字符串调用它:如果字符串是指定时区的 ISO 8601,我们将四舍五入时间部分。如果未指定时区,我们会将其转换为反映当地时区的日期,就像日期对象一样。