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