#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>