У вас когда-нибудь была возможность увидеть свое приложение из другого часового пояса? Вы думали о том, чтобы настроить ваше приложение так, чтобы оно выглядело одинаково из любой точки мира? Или, может быть, вы действительно хотите, чтобы он выглядел по-разному в разных часовых поясах?
Что ж, если ваше приложение имеет дело с датами, вам, вероятно, потребуется выполнить некоторые корректировки часового пояса. В противном случае вы столкнетесь с поврежденным пользовательским интерфейсом и приложением-зомби.
Итак, в этой статье я поделюсь своими знаниями о том, как реализовать настройку часового пояса в вашем приложении, чтобы оно выглядело одинаково в любом часовом поясе мира. Я использую библиотеку Moment.js, облегченную библиотеку данных JavaScript для разбора, проверки, манипулирования и форматирования дат, реализованную в приложении Javascript.
Какое время начала в этом году?
Допустим, вы разрабатываете приложение с коллегой, который не находится в том же часовом поясе, что и вы. И вы просматриваете одно и то же приложение учетной записи пользователя. Вы оба просите API отправить вам данные, начиная с даты «2020 01 01 00:00».
С Moment.js вы можете получить это с помощью:
const startTime = moment().startOf('year').valueOf()
Теперь, например, в часовом поясе Израиля это приведет к отметке времени startTime = 1577829600000, но по восточному времени (США и Канада) это приведет к отметке времени startTime = 1577854800000. Таким образом, каждый из вас будет получать данные из разных часовых поясов, что означает, что вы оба отправляете на сервер разные карты времени. Теперь, если на сервере не реализован какой-либо механизм часового пояса и он расположен, например, по восточному времени (США и Канада), вы получите
moment(1577829600000).format(‘YYYY MM DD HH:mm’)
для Израиля и
moment(1577854800000).format('YYYY MM DD HH:mm')
по восточному времени.
что означает «2019 12 31 17:00» для Израиля и «2020 01 01 00:00» для восточного времени соответственно. Это приведет к неправильным датам для нелокального пользователя учетной записи.
Возможное решение
Чтобы решить эту проблему, мы должны представить приложение в заданном часовом поясе пользователя. Это означает, что любой пользователь установит часовой пояс приложения в параметрах настроек. При этом часовой пояс останется неизменным независимо от того, в каком часовом поясе вы открываете приложение.
Итак, если я разрабатываю приложение календаря, например, и устанавливаю часовой пояс, например, Европа/Амстердам, он останется в этом часовом поясе во всем мире. То есть, если я открою свой календарь, например, в Нью-Йорке или в Израиле, я увижу точно такой же календарь.
А для приведенного выше примера с Moment.js это довольно просто. Вам просто нужно получить правильную метку времени с установленной строкой часового пояса:
const startTime = moment().tz('Europe/Amsterdam').startOf('year').valueOf()
Это даст отметку времени 1577833200000 независимо от того, где используется приложение.
Поэтому везде, где у меня есть дата в моем приложении, я всегда буду использовать
moment(time).tz(timezoneString).format(momentForamt)
Важно отметить
При работе с объектами Date, такими как, например, «новая дата (2020, 0, 1)», мы должны учитывать, что это даст нам время по местному времени UTC. Таким образом, реализуя
moment(new Date(2020, 0, 1)).tz('Europe/Amsterdam').format('YYYY MM DD HH:mm')
например, это приведет к «2019 12 31 23:00» по часовому поясу Израиля, а не к «2020 01 01 00:00», как ожидалось. Таким образом, работа с временными метками, а не с объектами Date, может решить эту проблему.
Ссылки по теме
- Момент.js — https://momentjs.com/
- Дата — веб-документы MDN — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Контакты
Надеюсь, это помогло вам реализовать обработку часовых поясов в вашем приложении.
Спасибо за чтение,
Зои Кац,
Разработчик интерфейса