比较没有时区的javascript日期

时间:2015-09-11 18:04:36

标签: javascript date

我正在做一些非常简单的事情:我得到一个表示过期日期的字符串,并使用JavaScript来确定过期日期是否已经过去。我的方法如下:

var dateStringFromJson = "2015-09-11T11:21:48.113";
var expirationDate = new Date(Date.parse(dateStringFromJson));
if (expirationDate > new Date()) {
    // Expiration not up
}

如果我在到期前的某个时间执行此功能,比如上午10点50分,则比较将失败,并且该功能将表现为过期日期已达到。

我确信这个问题与JavaScript的时区转换有关。我在UTC-7但是我的客户可能在美国的任何时区,因此时区特定的修复在这里不起作用。除非绝对必要,否则我也不想在项目中添加像moment.js这样的外部库。

2 个答案:

答案 0 :(得分:2)

如果日期格式一致,您可以手动解析日期:

var DATE_STRING = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d{3})$/;
var match = DATE_STRING.exec(dateStringFromJson);

var expirationDate = new Date();
expirationDate.setFullYear(+match[1]);
expirationDate.setMonth(+match[2] - 1);
expirationDate.setDate(+match[3]);
expirationDate.setHours(+match[4]);
expirationDate.setMinutes(+match[5]);
expirationDate.setSeconds(+match[6]);
expirationDate.setMilliseconds(+match[7]);

考虑将时间戳放在UTC中,这就是它的解析方式。 (并在末尾添加一个Z来表示。)

答案 1 :(得分:2)

使用函数来本地化json字符串。解析没有时区的日期字符串时,它假定它是UTC。有关localizeDateStr()函数如何工作的解释,请参阅我的answer类似问题。

function localizeDateStr(date_to_convert_str) {
  var date_to_convert = new Date(date_to_convert_str);
  var local_date = new Date();
  date_to_convert.setHours(date_to_convert.getHours() + (local_date.getTimezoneOffset() / 60));
  return date_to_convert;
}

function checkExpired() {
  var dateString = document.getElementById('date').value;
  var expirationDate = localizeDateStr(dateString);
  if (expirationDate > new Date()) {
    alert("Expiration not up.");
  } else {
    alert("Expired!");
  }
}
Expiration Datetime:
<input id="date" type="text" value="2015-09-11T11:21:48.113" />
<button id="btn" onclick="checkExpired()">Is expired?</button>