Обновлено: мой местный часовой пояс — UTC+1.
У меня есть строка даты: 2024-07-01T00:00:00.000Z
.
Эта строка даты имеет 'Z'
в конце, что означает, что она находится в формате UTC (если я правильно понимаю).
Когда я бегу
moment('2024-07-01T00:00:00.000Z').toISOString()
-> '2024-07-01T00:00:00.000Z' // returns
Круто, я этого и ожидаю.
Но когда я хочу получить начало этого дня для этого момента:
moment('2024-07-01T00:00:00.000Z').startOf('day').toISOString();
=> '2024-06-30T23:00:00.000Z' // returns
Вопрос: Почему он возвращается на час раньше, смещаясь на день от моей исходной даты, которая была обозначена в формате UTC?
Я подозреваю, что это связано с моим смещением UTC +1. По какой причине предполагается, что '2024-07-01T00:00:00.000Z'
на 1 час опережает UTC?
Большое спасибо!
Кстати, моя вторая версия 2.29.4
Проверьте Местное, UTC и смещенное
По умолчанию момент анализирует и отображает местное время. Если вы хотите проанализировать дату как UTC, используйте moment.utc . Если вы хотите передать смещение во времени, вам нужно использовать moment.parseZone, который будет разрешаться в UTC, если смещение не указано. Вы также можете переключаться между UTC и локальным режимом, вызывая .local
и .utc
на своем экземпляре. А если вы хотите проверить, работаете ли вы с датой UTC или нет, вы можете вызвать creationData().isUTC
и получить текущий режим.
Вы находитесь в часовом поясе, опережающем UTC на один час. Так что если вы это сделаете
moment('2024-07-01T00:00:00.000Z')
Вы анализируете данную временную метку (где Z
определяет, что она находится в формате UTC) в экземпляр moment
. Поскольку вы находитесь в формате UTC+1 и момент по умолчанию использует местное время, это 2024-07-01T01:00:00
по вашему местному времени.
Когда вы сейчас это сделаете .startOf('day')
, вы перейдете к началу дня 2024-07-01T00:00:00.000
, опять же по местному времени. И, наконец, .toISOString()
создает представление этой временной метки в формате UTC, что, конечно же, 2024-06-30T23:00:00.000Z
Если вы хотите, чтобы полученный экземпляр момента находился в формате UTC, вместо этого используйте moment.utc(...)
.
Кстати: momentjs считается устаревшим и больше не поддерживается, и его авторы предлагают больше не использовать его в новых проектах.
moment.js всегда использует часовой пояс вашей системы для вычислений. Смещения во входном или выходном формате не имеют значения.