#javascript #timezone #momentjs #moment-timezone
#javascript #Часовой пояс #momentjs #момент-часовой пояс
Вопрос:
Я изо всех сил пытаюсь увидеть разницу между этими двумя строками. Есть ли какие-либо?
const date1 = moment
.utc("2021-12-07T10:00:00")
.tz("Europe/London")
.format("YYYY-MM-DDTHH:mm:ssZ");
const date2 = moment
.tz("2021-12-07T10:00:00", "Europe/London")
.format("YYYY-MM-DDTHH:mm:ssZ");
console.log(date1); // "2021-12-07T10:00:00 00:00"
console.log(date2); // "2021-12-07T10:00:00 00:00"
Codepen: https://codepen.io/tan-aki/pen/QWMwRqw?editors=1112
Спасибо!
Комментарии:
1. Какую разницу вы ожидаете?
2. ХОРОШО, возможно, вопрос был сформулирован неправильно, они действительно достигают той же цели, это данность. Но есть ли разница в способе достижения цели?
Ответ №1:
Да, в этом синтаксисе есть разница. Прежде чем объяснять разницу, мы должны посмотреть на часовой пояс и указанное время.
Часовой пояс: Европа /Лондон
Время: 2021-12-07T10:00:00
Для Лондона в декабре летнее время (летнее время) не действует. Таким образом, зона будет GMT 0 (UTC).
Чтобы увидеть разницу, мы должны принять значение даты, когда действует летнее время.
Рассмотрим 2021-09-07T10:00:00
const date1 = moment
.utc("2021-09-07T10:00:00")
.tz("Europe/London")
.format("YYYY-MM-DDTHH:mm:ssZ");
const date2 = moment
.tz("2021-09-07T10:00:00", "Europe/London")
.format("YYYY-MM-DDTHH:mm:ssZ");
console.log(date1); // "2021-12-07T11:00:00 01:00"
console.log(date2); // "2021-12-07T10:00:00 01:00"
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.33/moment-timezone-with-data-10-year-range.min.js"></script>
Час date1
11, когда date2
10.
date1
объяснение:
- момент учитывает «2021-09-07T10:00:00» в UTC -> «2021-09-07T10:00:00 00:00»
- Время преобразуется в
Europe/London
zone -> «2021-09-07T11:00:00 01:00» - Форматированная строка -> «2021-09-07T11:00:00 01:00»
date2
объяснение:
- момент рассмотрим «2021-09-07T10:00:00» в Европе / Лондоне -> «2021-09-07T10:00:00 01:00»
- Форматированная строка -> «2021-09-07T10:00:00 01:00»
Давайте попробуем форматировать строку, включая информацию о зоне
const date1 = moment
.utc("2021-09-07T10:00:00Z")
.tz("Europe/London")
.format("YYYY-MM-DDTHH:mm:ssZ");
const date2 = moment
.tz("2021-09-07T10:00:00Z", "Europe/London")
.format("YYYY-MM-DDTHH:mm:ssZ");
console.log(date1); // "2021-12-07T11:00:00 01:00"
console.log(date2); // "2021-12-07T11:00:00 01:00"
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.33/moment-timezone-with-data-10-year-range.min.js"></script>
См. При построении времени с tz()
помощью ; если в строке нет информации о зоне, информация о зоне просто применяется. В противном случае дата преобразуется в соответствующую зону. В таком случае дата увеличивается или уменьшается в зависимости от зоны (добавляется 1 час для Европы / Лондона).
date1
и date2
в последнем фрагменте эквивалентно, но вы должны быть осторожны с информацией о зоне, форматированием. Всегда старайтесь включать информацию о зоне, если вы конвертируете между разными зонами. Также полезно передать форматирующую строку в конструктор. Это значительно снижает вероятность сбоя.