Я сравниваю две даты; один возвращаемый как строка 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 (он не был преобразован в правильное военное время). Спасибо всем за ваш вклад. Я пытался обновить как можно больше полезных ответов.
Вы можете распечатать 'response.endTime'? – jkris
Здесь он регистрируется непосредственно из ответа: «2015-10-23 01:49:27» – fumeng
Как обрабатывается вторая строка? Это не в стандартизованном формате, в основном строки даты без часового пояса рассматриваются как локальные, но не всегда (например, ES5). – RobG