moment.tz (дата: строка,часовой пояс: строка) ПРОТИВ момента.utc(дата: строка).tz(часовой пояс: строка)

#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 объяснение:

  1. момент учитывает «2021-09-07T10:00:00» в UTC -> «2021-09-07T10:00:00 00:00»
  2. Время преобразуется в Europe/London zone -> «2021-09-07T11:00:00 01:00»
  3. Форматированная строка -> «2021-09-07T11:00:00 01:00»

date2 объяснение:

  1. момент рассмотрим «2021-09-07T10:00:00» в Европе / Лондоне -> «2021-09-07T10:00:00 01:00»
  2. Форматированная строка -> «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 в последнем фрагменте эквивалентно, но вы должны быть осторожны с информацией о зоне, форматированием. Всегда старайтесь включать информацию о зоне, если вы конвертируете между разными зонами. Также полезно передать форматирующую строку в конструктор. Это значительно снижает вероятность сбоя.