Получаем начало и конец дня в Javascript: учимся учётом GMT
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы определить момент начала и завершения текущего дня, можно использовать следующий код:
let sunUp = new Date();
sunUp.setHours(0, 0, 0, 0); // Начало дня.
let lightsOut = new Date();
lightsOut.setHours(23, 59, 59, 999); // Конец дня.
Переменная sunUp
указывает на начало дня, а lightsOut
– на его окончание.
Заботимся о временных зонах
Понимание временных зон играет важную роль при определении начала и окончания дня. Для работы со всемирным координированным временем (UTC), используйте следующий код:
let dawnUTC = new Date();
dawnUTC.setUTCHours(0, 0, 0, 0); // Начало дня по UTC.
let duskUTC = new Date();
duskUTC.setUTCHours(23, 59, 59, 999); // Конец дня по UTC.
Методы dawnUTC.toUTCString()
и duskUTC.toUTCString()
позволяют получить строковые представления времени в формате UTC.
Работа с библиотеками
Для более удобной работы с временными зонами и форматированием дат можно воспользоваться библиотеками:
dayjs
позволяет просто работать с UTC:dayjs.utc().startOf('day')
иdayjs.utc().endOf('day')
.Luxon's DateTime
облегчает получение строк в формате ISO:.local().startOf('day').toUTC().toISO()
и.local().endOf('day').toUTC().toISO()
.
Выбирайте библиотеку, которая наиболее читаема и упрощает архитектуру вашего кода.
Остерегайтесь потенциальных ловушек
Разработка программного обеспечения полна неожиданностей. Например:
- Переход на летнее время может влиять на расчёт начала и конца дня.
- Високосные секунды, хотя и редки, могут влиять на вычисления, поэтому устанавливаем конец дня в
23:59:59.999
. - Когда вы взаимодействуете с пользователем, обработка временных данных должна быть особенно точной.
Визуализация
Сравним понятие времени с книжным шкафом, где каждый том — это отдельный день:
Книжный шкаф:
[🌞-1 янв, 🌞-2 янв, 🌞-3 янв, ..., 🌞-31 дек]
Каждый том имеет свое начало (рассвет) и конец (закат):
const today = new Date(); // 🌞-Том на сегодняшний день
Открываем том на начало дня:
today.setHours(0, 0, 0, 0); // Рассвет: первая страница
Закрываем том на конец дня:
today.setHours(23, 59, 59, 999); // Закат: последняя страница
Получаем:
Начало дня: 📖 Первая страница тома
Конец дня: 📚 Последняя страница тома
Каждый день — это история от рассвета до заката.
Форматирование дат
За форматирование дат, у вас будут следующие методы:
new Date().toISOString()
для получения строки в формате ISO.- Чтобы представить местное время в виде UTC, разделите строку по 'GMT' и добавьте 'UTC':
new Date().toString().split('GMT')[0] + ' UTC'
. - Всегда проверяйте результаты и их форматирование, отслеживайте развертывание вашего кода, особенно при работе с форматированием дат.
Советы по выбору библиотек
Перед тем, как обращаться к внешним библиотекам, оцените все плюсы и минусы. Возможно, стандартный объект Date
в JavaScript вполне справится с вашими задачами. Однако, если вам нужно решить сложные задачи, рассмотрите использование библиотек, как Dayjs и Luxon, которые предлагают удобный синтаксис и управление временными зонами. date-fns
также предлагает решения для специализированных задач, например startOfDay
. Изучите их документацию, чтобы следовать последним обновлениям и лучшим практикам.
Полезные материалы
- Date – JavaScript | MDN — полезная информация про объект Date в JavaScript.
- How do I get a timestamp in JavaScript? – Stack Overflow — обсуждение о возможностях получения временных меток в JavaScript.
- JavaScript Date Reference — удобный справочник по Date объекту на W3Schools.
- How to initialize a JavaScript Date to a particular time zone – Stack Overflow — дискуссия о работе с временными зонами.
- Everything You Need to Know About Date in JavaScript | CSS-Tricks — обзор основных и продвинутых аспектов работы с датами в JavaScript.
- Moment.js | Docs — прекрасное место для начала изучения парсинга, валидации и форматирования дат.
- date-fns – удобная для работы с датами библиотека для JavaScript — документация по функции startOfDay библиотеки date-fns как альтернативе Moment.js.