下面的代码有什么问题?
也许比较日期而不是时间会更简单 . 我不知道怎么做,我搜索,但我找不到我的确切问题 .
顺便说一句,当我在警报中显示两个日期时,它们显示完全相同 .
我的代码:
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);
}
});
是否有更简单的方法来比较日期而不包括时间?
15 回答
我发现哪个对我来说比较两个日期没有时间是使用Date对象的setHours方法并将小时,分钟,秒和毫秒设置为零 . 然后比较两个日期 .
例如,
date2
将设置为小时,分钟,秒和毫秒为零,但date1将它们设置为创建date1的时间 . 要消除date1上的小时,分钟,秒和毫秒,请执行以下操作:现在,您只需将两个日期作为日期进行比较,而无需担心时间元素 .
这个怎么样?
它允许您比较日期的日期部分,而不会影响变量的值:
请注意时区
使用日期对象直接表示只是一个日期会让你陷入一个巨大的超额精度问题 . 您需要管理时间和时区以防止它们出现,并且他们可以在任何步骤中潜入 . The accepted answer to this question falls into the trap.
javascript日期没有时区概念 . 它是一个时刻(自纪元以来的刻度),使用方便的(静态)函数进行字符串转换,使用设备的"local"时区,或者,如果指定,则使用UTC . 要使用日期对象表示日期, you want your dates to represent UTC midnight at the start of the date in question. 这是一种常见且必要的约定,可让您使用日期而不管其创建的季节或时区 . 因此,在创建午夜UTC日期对象以及序列化时,您需要非常警惕地管理时区的概念 .
Deserializing (or creating midnight UTC Date objects)
大多数情况下,您希望您的日期反映用户的时区 . Click if today is your birthday . 新西兰和美国的用户同时点击并获得不同的日期 . 在这种情况下,这样做......
有时,国际可比性胜过当地的准确性 . 在这种情况下,这样做......
Deserialize a date
通常,电线上的日期将采用YYYY-MM-DD格式 . 要反序列化它们,请执行此操作...
Serializing
在创建时注意管理时区,现在需要确保在转换回字符串表示时保留时区 . So you can safely use...
toISOString()
getUTCxxx()
getTime() //returns a number with no time or timezone.
.toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
And totally avoid everything else, especially...
getYear()
,getMonth()
,getDate()
所以回答你的问题,7年来为时已晚......
See it running...
使用Moment.js
如果您可以选择包含第三方库,那么绝对值得一看Moment.js . 它使得
Date
和DateTime
更容易使用 .例如,查看一个日期是否在另一个日期之后,但不包括它们的时间,您将执行以下操作:
传递给
isAfter
的第二个参数是进行比较的精度,可以是year
,month
,week
,day
,hour
,minute
或second
中的任何一个 .只需使用.toDateString进行比较,如下所示:
这将仅返回日期部分而不是时间或时区,如下所示:
因此,两种日期都可以用这种格式进行比较,同时没有时间的一部分 .
这可能是一个更简洁的版本,还要注意在使用parseInt时应始终使用基数 .
查看MDC parseInt页面以获取有关基数的更多信息 .
JSLint是一个很棒的工具,用于捕捉丢失的基数和许多其他可能导致模糊和难以调试错误的事情 . 它迫使您使用更好的编码标准,以避免未来的头痛 . 我在我编写的每个JavaScript项目中使用它 .
date.js库对于这些东西很方便 . 它使所有JS日期相关的脚本更容易 .
这就是我这样做的方式:
因为我不喜欢将h / m / s / ms设置为0,因为它可能导致准确转换到本地时区的问题与更改的
date
对象(我猜是这样),让我在这里介绍一下,写的不久前,lil功能:+
:易于使用,使基本比较操作完成(比较没有时间的日,月和年) .-
:看来这与"out of the box"思维完全相反 .用法:
datecompare(date1, '===', date2)
用于平等检查,datecompare(date1, '>', date2)
进行更大的检查,!datecompare(date1, '>', date2)
用于较少或相等的检查此外,显然,您可以在地方切换
date1
和date2
以实现任何其他简单比较 .确保将
userDate
与4位数年份构建为setFullYear(10, ...) !== setFullYear(2010, ...)
.在发布这个问题的同时,我已经决定发布另一个解决方案,因为我没有发现它非常令人满意,至少根据我的需要:
我用过这样的东西:
通过这种方式,我可以使用我想要的格式的日期进行处理 . 但这只是为了我的需要,但我决定发布它,也许它会帮助某人
您可以使用总计ms的一些算术运算 .
我喜欢这个,因为没有对原始日期进行更新,并且比字符串拆分和比较更快 .
希望这有帮助!
比较日期的有效且正确的方法是:
它忽略了时间部分,它适用于不同的时区,你也可以比较相等
==
. 86400000是一天中的毫秒数(= 24*60*60*1000
) .请注意,等于运算符
==
应该 never 用于比较Date对象,因为当你期望一个相等的测试工作因为它比较两个Date对象(并且不比较两个日期)时它会失败,例如:注意:如果要比较时间部分设置为零的Date对象,则可以使用
date1.getTime() == date2.getTime()
,但几乎不值得进行优化 . 直接比较Date对象时,可以使用<
,>
,<=
或>=
,因为这些运算符首先通过在运算符进行比较之前调用.valueOf()
来转换Date对象 .我知道这个问题已经得到了解答,这可能不是最好的方法,但在我的场景中它的工作完美,所以我认为这可能会对像我这样的人有所帮助 .
如果你有
date string
为并且您只想将日期部分与JS中的另一个Date对象进行比较,
那么你必须使用
new Date("2018-01-01T18:19:12.543");
string
到Date
对象这是诀窍: -
我使用了JS的
Date object
的toDateString()
,它仅返回Date字符串 .注意:在比较日期时,不要忘记使用
.valueOf()
功能 .有关更多信息
.valeOf()
在这里reference快乐的编码 .
这会有所帮助 . 我设法得到这样的 .