我想比较以不同格式和时区给出的两个不同的时间对象。
输入结构化英语:
IF "Mon Sep 15 2014 18:20:52 GMT+0200 (CEST)" is greater than "2014-09-04T13:57:33.338Z"
预期产出:
True
如何在JavaScript中实现这一目标?
答案 0 :(得分:2)
在JavaScript中使用Date.parse(myDateObject)
将不同的日期格式转换为Unix时间戳(尽管最后的3位数字不是unix时间戳的一部分,但是是毫秒)。
e.g:
if (Date.parse("Mon Sep 15 2014 18:20:52 GMT+0200 (CEST)") > Date.parse("2014-09-04T13:57:33.338Z")) {}; // evaluates to true
答案 1 :(得分:2)
您可以使用Date.parse(dateObject)
将日期转换为Unix时间戳并对其进行测试。您可以查看documentation about it。
您还可以使用外部库,例如Moment.js。该库允许您比较日期,而无需将其转换为时间戳或其他格式。
您只需将日期和compare it转到另一个:
moment("Mon Sep 15 2014 18:20:52 GMT+0200 (CEST)").isAfter('2014-09-04T13:57:33.338');
如果你愿意,我可以让你自己探索这个精彩的图书馆。
时刻网站:http://momentjs.com/
希望这两个解决方案能为您提供帮助:)
答案 2 :(得分:1)
不要指望Date对象正确或一致地解析日期和时间字符串。如果您有许多不同的格式可以支持,有许多库可以帮助,但如果您只有一两个,那么支持它们并不难。
要解析UTC ISO 8601格式字符串,例如'2014-09-04T13:57:33.338Z':
function parseISOUTC(s) {
// Get the parts
var b = s.split(/\D+/);
// Return a new Date
return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6]));
}
解析像'2014年9月15日星期一18:20:52 GMT + 0200(CEST)'这样的字符串需要更多的工作:
function parseMDYHMSO(s) {
// Get the parts
var b = s.split(/[ :]/);
// Convert the month name to a number
var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,
jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};
var month = months[b[1].toLowerCase()];
// Get the offset
var sign = s.indexOf('+') == -1? 1 : -1;
var offset = b[7].substr(4,2) * 60;
offset += +b[7].substr(6,2);
// Create a new Date
return new Date(Date.UTC(b[3], month, b[2], b[4], +b[5] + sign*offset, b[6]));
}
所以现在你有两个日期对象。如果你只想比较时间部分,那么得到每个时间,分钟和秒,并比较它们:
var d0 = parseISOUTC('2014-09-04T13:57:33.338Z');
// 2014-09-15T16:20:52.000Z
var d1 = parseMDYHMSO('Mon Sep 15 2014 18:20:52 GMT+0200 (CEST)');
d0.getUTCHour(); // 13
d1.getUTCHour(); // 16
d0.getUTCMin(); // 57
d1.getUTCMin(); // 20
d0.getUTCMin(); // 33
d1.getUTCMin(); // 52
您也可以使用普通的 getHour , getMinute 等方法,但UTC的方法可以清楚地表明您正在使用相同的偏移量。
您也可以使用带偏移的时间部分执行上述操作并忽略日期。将小时,分钟和秒转换为秒,应用偏移量,允许日期边界并比较结果。