Рубрики
Без рубрики

Работа с часовыми поясами в веб-разработке

Я не буду лгать тебе, имея дело с датой и временем – одна из самых сложных районов, которые должны … Теги с JavaScript, WebDev, программированием.

Я не буду лгать тебе, имея дело с датой и временем – одна из самых сложных районов, с которыми люди должны иметь дело, в программировании, это не отличается. Если ваше приложение работает с событиями, которые принадлежат пользователям в разных точках мира, вам необходимо добавить часовые появления и, возможно, рецидив, чтобы сохранить события, которые могут произойти более одного раза, в этой статье мы собираемся охватывать некоторые подходы для решения этого Вид приложений:

  • Как хранить даты в БД.
  • Как справиться с рецидивом.
  • Где конвертировать время для местного времени пользователей.
  • Библиотеки, которые могут помочь с этими задачами.

Давайте попадаем в это.

Как хранить даты в БД

Наиболее распространенный подход к сохранению дат в базе данных, когда у вас есть пользователи в разных местах, это экономия времени в UTC (Скоординированное универсальное время), которое является главным временем для часов и регулирования времени, но это не всегда лучшее решение, которое вы должны проверить вашу конкретное использование случая; например:

  • Откуда пользователи спасают даты?
  • Все пользователи должны сохранить даты или только один админ?
  • Где происходит события?

Например, недавно мне пришлось провести плагин телевизионного расписания для церкви в моей стране, учитывая, что события происходят только в одном месте, срок экономии даты в UTC были бы перенесением, потому что на самом деле не нужно, поэтому я спас его в Церковная местная чаймозона.

Но с другой стороны, в моей работе у меня было случай, когда пользователи могут сэкономить и редактировать события по всему миру, в этом случае было удобнее сохранить в UTC

Как управлять рецидивом даты

Когда я сначала сталкиваюсь с проблемой в веб-разработке, я всегда ищу приложения, которые я использую, потому что они дают мне пользовательский опыт, интерфейс, а иногда и API, если приложение готово интегрировать со сторонними приложениями. Поэтому я немедленно открыл свой браузер и искал для Google Calendar.

У них довольно простой интерфейс для спасения рецидива и они упомянули RRULE в их документации API. RRULE является стандартом для решения рецидива, и в большинстве языков программирования есть несколько реализаций, в JavaScript rrule.js это ответ.

Вот пример код, чтобы иметь событие каждую неделю до 30 сентября 2021 года

// To create the rrule
const rule = new RRule({
  freq: RRule.WEEKLY,
  dtstart: new Date(Date.UTC(2021, 8, 18, 8, 17, 0)),
  until: new Date(Date.UTC(2021, 8, 30, 8, 17, 0)),
  count: 30,
  interval: 1
});

// to get the RRule in string
rule.toString();
// DTSTART:20210918T081700Z
// RRULE:FREQ=WEEKLY;UNTIL=20210930T081700Z;COUNT=30;INTERVAL=1;WKST=MO

// to get the ocurrence
rule.all();

Вы можете сохранить строку RRULE в поле в базе данных. Но я думаю, что лучше сохранить каждое свойство RRULE как отдельное поле ( Частота , Интервал , так далее) Чтобы запросить события из базы данных лучше.

Где конвертировать время для местного времени пользователей?

Время преобразования – это визуальный аспект, и даже если вы обслуживаете API для мобильных и веб-приложений, лучше освободить свой бэкэндный код из этих преобразований и пусть Frontend обрабатывает их. Вы можете обнаружить локальный часовой пояс пользователя непосредственно из веб-браузера, используя Intl API.

Intl.DateTimeFormat().resolvedOptions().timeZone

Это очень приемлемо Поддержка браузера И вы можете прочитать больше об этом в MDN Отказ

Другой вариант будет просить пользователю указать свой часовой пояс с предварительно выбранным нынешним часовым поясом.

Для преобразования из UTC или TimeZone вы сохранили в базе данных в часовой пояс пользователя, как только мы получим его, у нас есть несколько хороших вариантов в JavaScript: Луксон , дата-FNS Также рекомендуется обернуть функциональные возможности из этих библиотек в центральном месте в случае необходимости измениться по любой причине, что было бы проще проверить и двигаться, если вы сталкиваетесь с аналогичной ситуацией в другом приложении.

Чтобы проиллюстрировать вот пример обертки, который я сделал, чтобы управлять преобразованиями часовых поясов, чтобы дать вам представление:

import { DateTime } from "luxon";
export const ISO_TIME_FORMAT = "HH:mm";

export function useTime(zone, serverTimezone = "UTC") {
  const timeZone = zone;
  ...

  /**
   * Transform a JS Date in users' timezone to ISO date in UTC
   * @param {Date} date
   * @returns {Object}
   */
  const getIsoUtcDateTime = (date) => { ... };

  /**
   * Transform DB date and time in ISO to a JS Date in users' timezone
   * @param {String} isoDate
   * @param {String} isoTime
   * @returns {Object}
   */
  const getLocalDateTimeFromISO = (isoDate, isoTime) => { ... };

  return {
      ...
      getIsoUtcDateTime,
      getLocalDateTimeFromISO
  }

Я опускаю подробности реализации, потому что я просто хочу показать вам общий аспект пособия, которую принесет обертку. Вот главная функция Ресурс Определен для того, чтобы принять пользователь и разум базы данных только один раз, а функции, которые он возвращается, будет использовать эти часовые появления для выполнения преобразований.

Чтобы использовать нашу обертку, предполагая, что дата и время сохраняются как строки ISO "ГГГГ-ММ-ДД" и "HH: мм" Формат, который мы можем действовать следующим образом:

import { useTime } from "./useTime";
import constants from "./constants";

const { getLocalDateTimeFromISO } = useTime(user.timezone, constants.SERVER_TIMEZONE);

// ... code to fetch events would go here

// transform iso dates to users' timezone
const eventsInLocal = events.map((event) => {
   const { date, time } = getLocalDateTimeFromISO(event.date, event.time);
   event.date = date;
   event.time = time;
   return event;
}

Тестирование

Чтобы проверить поведение в разработке, если мы принимаем часовой пояс из браузера, вы можете имитировать другой часовой пояс в браузере в инспекторе, нажав три точки в конце верхней панели в инспекторе> Дополнительные инструменты> Датчики.

Это откроет раздел в нижней части инспектора браузера с возможностью переопределения текущего местоположения и расширением TimeZone:

Теперь у нас есть часовой пояс нашего браузера в Азия/Токио и Новая дата () будет вести себя так, как мы были в Токио (Аригато)

Заключение

Каждый раз, когда мы преодолеваем тяжелую задачу, и мы преодолеем, мы выравниваем наш наш эмблер, если я смогу дать номер к точкам, касающимся даты с суммой ваших навыков, которые я не представляю, но это было бы высоким числом 😂. К счастью, у нас есть люди, которые проложили способ дать нам стандарты, как UTC и Rrule.

Спасибо за чтение, я надеюсь, что статья может сэкономить вам некоторое время, если у вас есть какие-либо вопросы, какие комментарии открыты, или если вам нравится Twitter а также мой Github Где я делаю некоторые эксперименты и проекты.

Хорошего дня.

Ресурсы

Фото Djim Loic на Бессмысленно

Оригинал: “https://dev.to/jesusantguerrero/dealing-with-timezones-in-web-development-2dgg”