我正在做一些非常简单的事情:我得到一个表示过期日期的字符串,并使用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这样的外部库。
答案 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>