Проверьте, совпадает ли дата строки iso или раньше, чем через час, используя момент

#javascript #momentjs

Вопрос:

У меня есть строка даты в формате ISO и строка в формате ЧЧ:мм. Я хочу знать, совпадает ли час даты ISO строки или перед строкой в формате ЧЧ:мм.

Пример:

 const isoDateString = '2021-09-28T07:30:00Z' // UTC
const hour = '07:30' // not UTC
-> result true

---

const isoDateString = '2021-09-28T07:30:00Z' // UTC
const hour = '08:30' // not UTC
-> result false
 

Я использую moment, и это мой код:

 const TIME_FORMAT = 'HH:mm'

const isoDateString = '2021-09-28T09:30:00Z'
const hour = '07:30'

const isHourSameOrBeforeIsoString = moment(
  moment(isoDateString).format(TIME_FORMAT),
).isSameOrBefore(moment(hour, TIME_FORMAT));
console.log(isHourSameOrBeforeIsoString)
 

Это не работает. В обоих случаях он возвращает значение false. Почему?

Комментарии:

1. скорее всего, это проблема с часовым поясом, так как hour переменная не указывает его

2. @KrzysztofKrzeszewski я тоже пытался const isHourSameOrBeforeIsoString = moment( moment(isoDateString).format(TIME_FORMAT), ).isSameOrBefore(moment.utc(hour, TIME_FORMAT)) . Все то же самое, это не работает

Ответ №1:

Используйте moment.utc() при построении строки даты iso, потому что вы должны обрабатывать ее, как в UTC.

Я также добавил TIME_FORMAT внутри moment конструктора отформатированную строку даты iso.

 const TIME_FORMAT = 'HH:mm'

const isoDateString = '2021-09-28T09:30:00Z'
const hour = '07:30'

const isHourSameOrBeforeIsoString = moment(
  moment.utc(isoDateString).format(TIME_FORMAT), TIME_FORMAT
).isSameOrBefore(moment(hour, TIME_FORMAT));

console.log(isHourSameOrBeforeIsoString) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> 

Ответ №2:

Вот более разумный способ проверить, на мой взгляд:

Логика, которую вы имели, была правильной, но причина, по которой она возвращает false, заключается в том, что ваш isoDateString возвращает 8:30, а час, с которым вы его сравниваете, составляет 7:30, как упоминал Кшиштоф в своем комментарии, это может быть проблема с часовым поясом:

 var format = 'hh:mm'

// var time = moment() gives you current time. no format required.
var time = moment('2021-09-28T09:30:00Z',format),
  testTime = moment('07:30', format);

console.log(moment(time).format(format));
console.log(moment(testTime).format(format));
  
if (time.isSameOrBefore(testTime)) {

  console.log('is before')

} 
if(time.isSameOrAfter(testTime)){

  console.log('is after')

} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" referrerpolicy="no-referrer"></script>