Javascript日期比较不符合预期

时间:2016-04-10 03:55:20

标签: javascript date

我得到一个SQL日期 - 不是日期时间 - 对象被推入我的Javascript代码,我需要看看它是否在今天之前。这是我的代码(相关部分):

todaysDate = new Date();
todaysDate.setHours(0,0,0,0);
var date = Date.parse(row[3]);
// date.setHours(0,0,0,0);
if (date < todaysDate) {
    alert("date is before today");
    dueDate = '<small class="text-danger">';
} else {
    alert("date is after today");
    dueDate = '<small class="text-muted">';
}

row [3]是SQL日期的来源。因此,除了今天的日期之外,这适用于所有事情。如果没有评论专栏,它会认为今天的日期已经过去了。使用注释行,我的代码会中断。有任何想法如何解决这个问题?不知道我做错了什么。

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您的日期字符串类似于“2016-04-10”且您的时区位于GMT以西,比如-04:00,则在符合ECMAScript 2016的浏览器中,您将获得“2016-04-09T19”的日期:00:00-0400" 。

当您使用new Date()创建日期并将小时数设置为零(假设您在4月10日所在的位置)时,您将获得“2016-04-10T00:00:00-0400”的日期

因此,相比之下,他们有不同的时间价值。

您需要的是将从数据库中获取的字符串视为本地字符串,或者获取UCT日期,以便:

var dateString = '2016-04-10';
var parsedDate = new Date(dateString);

var todayUTCDate = new Date();
todayUTCDate.setUTCHours(0,0,0,0);

document.write(parsedDate + '<br>' + todayUTCDate);

并非所有浏览器都根据ECMAScript 2015解析字符串,因此应始终手动解析它们。使用库,或编写一个小函数,例如

// Parse date string in format 'yyyy-mm-dd' as local date
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2]);
}

并替换:

var date = Date.parse(row[3]);

使用:

var date = parseISOLocal(row[3]);

然后在比较中,比较时间值:

if (+date < +todaysDate) {

if (date.getTime() < todaysDate.getTime()) {

答案 1 :(得分:0)

使用日期对象的getTime()

  

getTime()方法返回1970年1月1日午夜到指定日期之间的毫秒数。

您可以比较毫秒并执行操作

date.getTime() > todaysDate.getTime()

还要确保Date.parse返回有效日期。