我比较两个日期;一个作为UTC字符串返回(作为Ajax响应的一部分),第二个作为本地浏览器时间返回:
基本上,我想查看返回的日期(endTime)是否在此之前发生。我的代码在下面,我认为我做得对,但它不起作用。
var isActive = true;
var buffer = 30000; // 30 seconds
var endTime = new Date(Date.parse(response.endTime)); // Fri Oct 23 2015 12:01:14 GMT-0400 (EDT)
var now = new Date(); // Thu Oct 22 2015 20:01:31 GMT-0400 (EDT)
var nowUtc = new Date(now).toUTCString(); // "Fri, 23 Oct 2015 00:01:31 GMT"
var nowTimeMs = new Date(nowUtc).getTime(); // 1445558491000
var endTimeMs = endTime.getTime() + buffer; // 1445616104000
if( nowTimeMs > endTimeMs ){
isActive = false;
}
isActive应保持为真,但它是错误的。我觉得我一直在看这个太长时间而且错过了很简单的事情。我呢?
感谢任何有用的提示。
更新 根据回复,我认为我会更新我的问题。比较两个日期的最佳方法是什么:
new Date(); // Thu Oct 22 2015 21:51:53 GMT-0400 (EDT)
...另一个是日期的字符串表示形式:
"2015-10-23 01:49:27"
我认为从String中创建有效Date对象的最佳方法是使用此代码。
isThisActive:function(p){
var isActive = true;
var buffer = 30000;
var pEndTime = myObj.parseStringAsDate(p.callEndTime);
var now = new Date();
var offset = now.getTimezoneOffset() * 60000;
now.setTime( now.getTime() + offset );
var nowTimeMs = now.getTime();
var endTimeMs = pEndTime.getTime() + buffer;
if( nowTimeMs > endTimeMs ){
isActive = false;
}
return isActive;
},
parseStringAsDate:function(str){
var dateTimeStr = str.split(" ");
var dateStr = dateTimeStr[0].split("-");
var year = dateStr[0];
var month = dateStr[1];
var day = dateStr[2];
var timeStr = dateTimeStr[1].split(":");
var hours = timeStr[0];
var minutes = timeStr[1];
var seconds = timeStr[2];
return new Date( year,month,day,hours,minutes,seconds);
}
因为" pEndTime"在UTC中我将偏移量应用于"现在"日期对象,但即使这不起作用。问题出在哪里?我以为这会解决它。
解决: 我发布的最新代码确实有效。我只是得到了response.endTime的错误值(它没有被转换为正确的军事时间)。谢谢大家的意见。我尽可能多地尝试升级尽可能多的有用回复。
答案 0 :(得分:1)
我认为问题在于:
var endTime = new Date(Date.parse(response.endTime));
respnonse.endTime是UTC,对吗?但是,当您将其解析为Date值时,Date.parse会假定它在本地时区(GMT-0400,如示例代码中所示)。这意味着endDate获取错误的值
答案 1 :(得分:1)
您不应该使用Date构造函数或Date.parse(执行相同的操作)来解析日期字符串。编写自己的解析函数(如下所示)或使用维护良好的库。
要解析OP中的格式,您可以使用:
// Parse Thu Oct 22 2015 20:01:31 GMT-0400 (EDT)
function parseMMMDY(s) {
var b = s.split(/\W/);
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 sign = /GMT-\d{4}/i.test(s)? 1 : -1;
var min = +b[5] + (sign * b[8].slice(0,2) * 60 ) + (sign * b[8].slice(-2));
return new Date(Date.UTC(b[3], months[b[1].toLowerCase().slice(0,3)], b[2], b[4], min, b[6]));
}
document.write(parseMMMDY('Thu Oct 22 2015 20:01:31 GMT-0400 (EDT)'));

答案 2 :(得分:1)
我通常在项目中使用moment.js与格式化日期时间相关,尤其是在报告中(我在金融领域工作)。您的项目中必须有一个库,但它提供了许多其他功能
抱歉,这是您的新更新。我还没有足够的人口和#39;发表评论:P
答案 3 :(得分:0)
var endTime = new Date(Date.parse(response.endTime)); // Fri Oct 23 2015 12:01:14 GMT-0400 (EDT)
var now = new Date(); // Thu Oct 22 2015 20:01:31 GMT-0400 (EDT)
您提到的endTime
似乎没有返回UTC日期。它看起来正在使用(EDT),所以也许你不必将它转换为UTC。