Я не буду лгать тебе, имея дело с датой и временем – одна из самых сложных районов, с которыми люди должны иметь дело, в программировании, это не отличается. Если ваше приложение работает с событиями, которые принадлежат пользователям в разных точках мира, вам необходимо добавить часовые появления и, возможно, рецидив, чтобы сохранить события, которые могут произойти более одного раза, в этой статье мы собираемся охватывать некоторые подходы для решения этого Вид приложений:
- Как хранить даты в БД.
- Как справиться с рецидивом.
- Где конвертировать время для местного времени пользователей.
- Библиотеки, которые могут помочь с этими задачами.
Давайте попадаем в это.
Как хранить даты в БД
Наиболее распространенный подход к сохранению дат в базе данных, когда у вас есть пользователи в разных местах, это экономия времени в 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”