2015-10-23 3 views
1

Я сравниваю две даты; один возвращаемый как строка 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" 

Я полагаю, что лучший способ создать действительный Объект Date из String использует этот код.

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 Я применил смещение к «сейчас» Date объекта, но даже это не работает. Где проблема здесь? Я думал, это решит.

РЕШЕННЫЙ: Последний код, который я разместил, действительно работал. Я просто получал неправильные значения для response.endTime (он не был преобразован в правильное военное время). Спасибо всем за ваш вклад. Я пытался обновить как можно больше полезных ответов.

+0

Вы можете распечатать 'response.endTime'? – jkris

+0

Здесь он регистрируется непосредственно из ответа: «2015-10-23 01:49:27» – fumeng

+0

Как обрабатывается вторая строка? Это не в стандартизованном формате, в основном строки даты без часового пояса рассматриваются как локальные, но не всегда (например, ES5). – RobG

ответ

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)'));

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.

+0

Я слышал, откуда вы пришли, и я тоже это думал. Но разве это не совсем другое? Поскольку код по-прежнему не работает, когда я прекращаю преобразование «endTime» в UTC. – fumeng

+1

Пожалуйста, ** не разбирайте строки с Date.parse или конструктором Date ** (что то же самое). Строка, о которой идет речь, не является форматом, указанным в ECMAScript 2015, и даже если бы это было так, это не гарантирует, что он будет правильно разобран. В общем случае синтаксический анализ строки даты является ** зависимым от реализации **, нет стандарта, который требует правильной обработки строки в OP. – RobG

1

Я думаю, что проблема здесь:

вар = Конечное = новая дата (Date.parse (response.endTime));

respononse.endTime - UTC, право? Но когда вы анализируете его до значения Date, Date.parse предполагает, что он находится в локальном часовом поясе (GMT-0400, как в вашем примере кода). Это означает, что endDate получает неправильное значение

1

Я обычно использую moment.js в моих проектах, связанных с форматированием времени даты, особенно в отчетах (I» м, работающих в области финансов).У вас должна быть еще одна библиотека в вашем проекте, но она предоставляет множество других функций.

Извините, это для вашего нового обновления. Мне не хватает «популяции», чтобы оставить комментарий: P

Смежные вопросы