比较不同时区的两个日期

时间:2015-10-23 01:07:54

标签: javascript

我比较两个日期;一个作为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的错误值(它没有被转换为正确的军事时间)。谢谢大家的意见。我尽可能多地尝试升级尽可能多的有用回复。

4 个答案:

答案 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。