2015-06-04 5 views
3

У меня есть строка, которая хранится в UTC. Я пытаюсь посмотреть, не наступит ли это время после текущего времени UTC. Я использую momentjs, а метод isAfter() возвращает неверное значение, когда разница в 1 час.Moment .isAfter неправильно возвращается

Переменная active_time происходит в 15:00 utc. Current_time установлен в 16:00 utc. Поэтому я думаю, active_time.isAfter(current_time) должен вернуть false, но он возвращает true. Как я могу вернуть его false?

jsFiddle ссылка: http://jsfiddle.net/Ln1bz1nx/

Код:

//String is already in utc time 
var active_time = moment('2015-06-04T15:00Z', 'YYYY-MM-DD[T]HH:mm[Z]'); 

//Convert current time to moment object with utc time 
var current_time = moment(moment('2015-06-04T16:00Z').utc().format('YYYY-MM-DD[T]HH:mm[Z]')); 

console.log('active_time =',active_time); 
console.log('current_time =',current_time); 
console.log(active_time.isAfter(current_time)); //Why does this return true? 
+0

Возвращает 'false' мне: http://jsfiddle.net/Ln1bz1nx/3/ –

+0

Weird. Это всегда «правда» для меня. Я использую Macbook, я не знаю, может ли это что-то с этим делать. – Mdd

+0

Я не получаю надежных результатов от isAfter. Если я использую .unix() в оба момента, я могу сравнить, но в противном случае, если они находятся в разных часовых поясах или происходят из разных источников, это не работает надежно. –

ответ

5

Даже если первая строка даты МЫ, вам все еще нужно поставить момент в режим Utc, прежде чем сравнивать. Посмотрите на документы здесь: http://momentjs.com/docs/#/parsing/utc/

//String is already in utc time, but still need to put it into utc mode 
 
var active_time = moment.utc('2015-06-04T15:00Z', 'YYYY-MM-DD[T]HH:mm[Z]'); 
 

 
//Convert current time to moment object with utc time 
 
var current_time = moment.utc('2015-06-04T16:00Z', 'YYYY-MM-DD[T]HH:mm[Z]'); 
 

 
console.log('active_time =',active_time.format()); 
 
console.log('current_time =',current_time.format()); 
 
console.log(active_time.isAfter(current_time));
<script src="https://rawgit.com/moment/moment/develop/moment.js"></script>

+0

Спасибо! Мне было непонятно, как включить active_time в режим utc. Благодарю. – Mdd

2

Посмотрите на метод toDate, чтобы увидеть, что внутренний JS дата:

console.log('active_time =',active_time.toDate()); 
console.log('current_time =',current_time.toDate()); 
console.log(active_time.isAfter(current_time)); //Why does this return true? 

active_time = Thu Jun 04 2015 15:00:00 GMT-0700 (Pacific Daylight Time) 
current_time = Thu Jun 04 2015 09:00:00 GMT-0700 (Pacific Daylight Time) 
true 

Это будет зависеть от того, какой часовой пояс вы находятся в

+0

Есть ли способ проверить это? Ответ, который я получаю, имеет время в формате 'YYYY-MM-DD [T] HH: mm [Z]' уже в UTC по сравнению с моим часовым поясом. – Mdd

+0

Используйте момент.utc(), чтобы создать дату как дату UTC. См. Momentjs.com/docs/#/parsing/utc/ –

4

Если ваши даты ISO860 1 или timestamp, не используйте moment.isAfter. Это в 150 раз медленнее, чем сравнение 2 фиников объектов: http://jsperf.com/momentjs-isafter-performance

var active_time = new Date('2015-06-04T15:00Z'); 
var current_time = new Date('2015-06-04T16:00Z'); 

console.log('active_time =',active_time); 
console.log('current_time =',current_time); 
console.log(active_time > current_time); 
Смежные вопросы