Date — JavaScript — Дока
Кратко
Скопировано
Date
— класс для работы со временем. В основном используется для отображения и вычисления.
Время отображается в двух форматах:
- UTC — время по Гринвичу;
- В текущей часовой зоне (например, UTC+3 для Москвы).
Поэтому часть методов для взаимодействия со временем имеют два формата — для UTC и для текущей часовой зоны.
🧐
Часовая зона или часовой пояс — правильный перевод английского timezone. В русскоязычной разработке также часто говорят таймзона.
Как понять
Скопировано
Класс Date
используется для отображения даты в различных форматах. Там, где нужно находить разницу между датами, Date
тоже прекрасно справится.
Пример
Скопировано
Создадим новый экземпляр даты:
const currentDate = new Date('August 14, 2022 14:15:30')
const currentDate = new Date('August 14, 2022 14:15:30')
Получаем различные части даты:
console. log(currentDate.getDay())// 0console.log(currentDate.getHours())// 14console.log(currentDate.getTime())// 1660475730000console.log(currentDate.getFullYear())// 2022console.log(currentDate.toISOString())// 2022-08-14T11:15:30.000Z
console.log(currentDate.getDay())
// 0
console.log(currentDate.getHours())
// 14
console.log(currentDate.getTime())
// 1660475730000
console.log(currentDate.getFullYear())
// 2022
console.log(currentDate.toISOString())
// 2022-08-14T11:15:30.000Z
💡
Установленная дата и метод to
имеют разные значения из-за часовой зоны автора текста.
Установим новую дату:
currentDate.setMonth(0, 1)console.log(currentDate.toLocaleDateString())// 01.01.2022
currentDate.setMonth(0, 1)
console.log(currentDate.toLocaleDateString())
// 01.01.2022
Также можно создавать дату в формате UTC:
const utcDate = new Date(Date. UTC(2022, 8, 14, 14, 15, 30))console.log(utcDate.toISOString())// 2022-09-14T14:15:30.000Z
const utcDate = new Date(Date.UTC(2022, 8, 14, 14, 15, 30))
console.log(utcDate.toISOString())
// 2022-09-14T14:15:30.000Z
Как пишется
Скопировано
Date
может немного запутать, часть параметров начинают отчёт с нуля, а часть с 1.
Например, при установке месяца, отчёт идёт с 0, где 0 — это январь. При выводе дня недели возвращаемое значение также начинается с 0 и означает воскресенье.
Исключением из этого правила являются параметры, связанные с годом и днём месяца (первое число месяца — 1).
Основные методы
Скопировано
Создание
Скопировано
Создать новый экземпляр класса можно несколькими способами:
new
создаёт экземплярDate ( ) Date
с текущей датой и временем.new
создаётDate ( значение ) Date
с переданным значением времени. Значение должно быть в формате, который распознается методомDate
, то есть быть совместимым с IETF RFC 2822 или с ISO8601.. parse ( ) new
создаёт классDate ( год , , день , часы , минуты , секунды , миллисекунды ) Date
в местной часовой зоне. Год и месяц являются обязательными параметрами. Остальные параметры, начиная с часов, будут по умолчанию равны 0, а день — 1.new
создаётDate ( миллисекунды ) Date
со временем в миллисекундах. Количество миллисекунд измеряется с 1 января 1970 года UTC.
const millisecondsDate = new Date(120000)console.log(millisecondsDate.toISOString())// 1970-01-01T00:02:00.000Z
const millisecondsDate = new Date(120000)
console.log(millisecondsDate.toISOString())
// 1970-01-01T00:02:00.000Z
💡
Дата 1 января 1970 года досталась нам в наследство от UNIX. Именно в 1970 году началась разработка этой системы. Это время называется POSIX временем, Unix временем или Unix timestamp.
Получение значений
Скопировано
get
— возвращает год;Full Year ( ) get
— возвращает месяц с 0 до 11;Month ( get
— возвращает день месяца с 1 до 31;Date ( ) get
— возвращает порядковый номер дня недели с 0 до 6;Day ( ) get
— возвращает часы с 0 до 23;Hours ( ) get
— возвращает минуты от 0 до 59;Minutes ( ) get
— возвращает секунды от 0 до 59;Seconds ( ) get
— возвращает миллисекунды от 0 до 999.Milliseconds ( )
Все вышеперечисленные методы возвращают значения для текущей часовой зоны. Если необходимо вернуть время по Гринвичу, то нужно в метод добавить UTC: get
, get
, get
, get
, get
, get
,get
, get
.
Есть два метода, которые не привязаны к часовой зоне:
get
возвращает значение в миллисекундах, прошедших с 1 января 1970 года, соответствующее указанной дате по UTC.Time ( )
const currentDate = new Date(2022, 11)console.log(currentDate.toISOString())// 2022-11-30T21:00:00.000Zconsole.log(currentDate.getTime())// 1672520400000
const currentDate = new Date(2022, 11)
console.log(currentDate.toISOString())
// 2022-11-30T21:00:00.000Z
console.log(currentDate.getTime())
// 1672520400000
get
возвращает смещение в минутах между текущей часовой зоной и UTC.Timezone Offset ( )
const currentDate = new Date()console.log(currentDate.getTimezoneOffset())// -180
const currentDate = new Date()
console.log(currentDate.getTimezoneOffset())
// -180
Установка значений
Скопировано
Также, как и с получением значений, у многих методов есть присваивание значений в локальной часовой зоне и UTC. Для локальной:
set
устанавливает год, значения месяца и дня необязательны.Full Year ( год , месяц , день ) set
устанавливает месяц, передавать день необязательно.Month ( месяц , день ) set
устанавливает день месяца.Date ( день ) set
устанавливает часы. Значения минут, секунд, миллисекунд необязательны.Hours ( часы , минуты , секунды , миллисекунды ) set
— устанавливает минуты. Секунды и миллисекунды необязательны.Minutes ( минуты , секунды , миллисекунды ) set
устанавливает секунды. Миллисекунды передавать необязательно.Seconds ( секунды , миллисекунды ) set
— устанавливает миллисекунды.Milliseconds ( миллисекунды )
Для UTC аналогичные методы, только добавляем UTC после set. Например, set
.
И метод, который относится только к UTC:
set
устанавливает значение, которое равно количеству миллисекунд, прошедших с 1 января 1970 года.Time ( значение )
Разбор даты
Скопировано
Метод Date
используется для разбора (ещё говорят парсинга) строкового представления даты. Возвращает значение, равное количеству миллисекунд, прошедших с 1 января 1970 года.
Переданное значение должно быть совместимым с IETF RFC 2822 или с ISO8601.
console.log(Date.parse('2022-11-30T21:00:00.000Z'))// 1669842000000console.log(Date.parse('2022-11-30T21:00:00.000Z')) // 1669842000000
⚠️
В некоторых браузерах, метод Date
может вернуть результат в миллисекундах, даже если введённое значение, не является совместимым с форматами. Поэтому, если вы не уверены в формате поданного значения, стоит проверить вывод во всех необходимых браузерах.
Форматирование даты
Скопировано
Для отображения Date
в различных форматах существует метод to
.
Локаль — это необязательный параметр, который является строкой или массивом строк с языковой меткой BCP 47. Например,
или de
. Локаль хранит региональные настройки о формате дат, номеров, адресов.
Опции — необязательный параметр с объектом настроек. Доступные свойства:
locale
— алгоритм поиска локали, используется для выбора подходящей локали. Принимает значенияMatcher lookup
илиbest fit
. По умолчанию
. best fittime
— значение используемого часовой зоны. Все браузеры должны принимать значениеZone UTC
, значение по умолчанию равно значению часовой зоны среды выполнения. Формат принимаемого значения может различаться в различных браузерах.hour12
— значение, которое определяет, использовать ли 12-часовой формат вывода. Принимаетtrue
илиfalse
.format
— алгоритм поиска формата, используется для выбора формата отображения. Принимает значенияMatcher basic
илиbest fit
.best fit
.time
— формат названия часовой зоны. ПринимаетZone Name long
илиshort
.weekday
— значение дня недели. Принимаетnarrow
,short
иlong
.era
— значение эры. Принимаетnarrow
,short
иlong
.year
— значение года. Принимаетnumeric
и2
.- digit month
— значения месяца. Принимаетnumeric
,2
,- digit narrow
,short
иlong
.day
— значения дня. Принимаетnumeric
и2
.- digit hour
— значения часа. Принимаетnumeric
и2
.- digit minute
— значения минут. Принимаетnumeric
и2
.- digit second
— значения секунд. Принимаетnumeric
и2
.- digit
Браузеры обязаны поддерживать следующие наборы настроек отображения:
weekday
,year
,month
,day
,hour
,minute
,second
weekday
,year
,month
,day
year
,month
,day
year
,month
month
,day
hour
,minute
,second
hour
,minute
Некоторые браузеры могут поддерживать форматы вывода сверх этих наборов, но данный момент необходимо уточнять в спецификации браузеров.
Отобразим в двух форматах:
const currentDate = new Date('August 14, 2022 14:15:30')const options = { hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long'}console.log(currentDate.toLocaleDateString('ru-RU', options))// 14.08.2022, 14:15:30 Москва, стандартное времяconsole.log(currentDate.toLocaleDateString('en-US', options))// 8/14/2022, 2:15:30 PM Moscow Standard Time
const currentDate = new Date('August 14, 2022 14:15:30')
const options = {
hour: 'numeric', minute: 'numeric', second: 'numeric',
timeZoneName: 'long'
}
console.log(currentDate.toLocaleDateString('ru-RU', options))
// 14.08.2022, 14:15:30 Москва, стандартное время
console.log(currentDate.toLocaleDateString('en-US', options))
// 8/14/2022, 2:15:30 PM Moscow Standard Time
Получение текущего времени
Скопировано
Date
— метод, который возвращает текущее время в миллисекундах, прошедших с 1 января 1970 года UTC.
Метод очень похож на new
, но, так как нет ключевого слова new
, экземпляр класса не создаётся, возвращается только число:
console.log(Date.now())// 1661370397669
console.log(Date.now())
// 1661370397669
Математические операции
Скопировано
Найдём количество дней между 1 января 2022 и 31 декабря 2022.
Полученное значение = количество дней в году — 1.
const utcDateOne = new Date(Date.UTC(2022, 0, 1, 0, 0, 0))const utcDateTwo = new Date(Date.UTC(2022, 11, 31, 0, 0, 0))console.log(utcDateOne.toUTCString())// Sat, 01 Jan 2022 00:00:00 GMTconsole.log(utcDateTwo.toUTCString())// Sat, 31 Dec 2022 00:00:00 GMTconst result = utcDateTwo - utcDateOneconsole.log(result)// 31449600000 миллисекундconsole.log(result / (1000 * 60 * 60 * 24))// 364
const utcDateOne = new Date(Date.UTC(2022, 0, 1, 0, 0, 0))
const utcDateTwo = new Date(Date. UTC(2022, 11, 31, 0, 0, 0))
console.log(utcDateOne.toUTCString())
// Sat, 01 Jan 2022 00:00:00 GMT
console.log(utcDateTwo.toUTCString())
// Sat, 31 Dec 2022 00:00:00 GMT
const result = utcDateTwo - utcDateOne
console.log(result)
// 31449600000 миллисекунд
console.log(result / (1000 * 60 * 60 * 24))
// 364
⚠️
Математические операции необходимо выполнять со временем в формате UTC. Обычные операции не учитывают летнее время часовых зон, поэтому результаты могут быть некорректны.
Автокоррекция даты
Скопировано
Date
имеет интересное свойство: этот класс автоматически исправляет некорректно введённые значения. Например, при попытке установки 32 декабря, Date
прибавит 1 день к максимальному корректному значению (31 декабря) и установит корректную дату.
const newDate = new Date()newDate.setFullYear(2022, 11, 32)console.log(newDate.toISOString())// 2023-01-01T14:41:49.635Z
const newDate = new Date()
newDate. setFullYear(2022, 11, 32)
console.log(newDate.toISOString())
// 2023-01-01T14:41:49.635Z
С минусом тоже сработает. Только Date
будет вычитать значение:
const newDate = new Date()newDate.setFullYear(1996, -11, 24)console.log(newDate.toISOString())// 1995-02-24T05:17:21.204Z
const newDate = new Date()
newDate.setFullYear(1996, -11, 24)
console.log(newDate.toISOString())
// 1995-02-24T05:17:21.204Z
Также можно установить нулевое значение там, где Date
возвращает ненулевые значения. Например, для дня месяца. Тогда класс просто вычтет 1 день.
const newDate = new Date('August 14, 2022 14:15:30')newDate.setDate(0)console.log(newDate.toISOString())// 2022-07-31T11:15:30.000Z
const newDate = new Date('August 14, 2022 14:15:30')
newDate.setDate(0)
console.log(newDate.toISOString())
// 2022-07-31T11:15:30.000Z
// Обе переменных представляют одну и ту же датуconst dateOne = new Date(Date. UTC(2022, 11, 31, 0, 0, 0))const dateTwo = new Date(Date.UTC(2022, 12, 0, 0, 0, 0))console.log(dateOne.toISOString())console.log(dateTwo.toISOString())// 2022-12-31T00:00:00.000Z// 2022-12-31T00:00:00.000Z
// Обе переменных представляют одну и ту же дату
const dateOne = new Date(Date.UTC(2022, 11, 31, 0, 0, 0))
const dateTwo = new Date(Date.UTC(2022, 12, 0, 0, 0, 0))
console.log(dateOne.toISOString())
console.log(dateTwo.toISOString())
// 2022-12-31T00:00:00.000Z
// 2022-12-31T00:00:00.000Z
Альтернативы
Скопировано
Вместо использования to
можно использовать класс Intl
.
const currentDate = new Date('August 14, 2022 14:15:30')const options = { year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long'}console. log(new Intl.DateTimeFormat('ru-RU', options).format(currentDate))// 14.08.2022, 14:15:30 Москва, стандартное времяconsole.log(new Intl.DateTimeFormat('en-US', options).format(currentDate))// 8/14/2022, 2:15:30 PM Moscow Standard Time
const currentDate = new Date('August 14, 2022 14:15:30')
const options = {
year: 'numeric', month: 'numeric', day: 'numeric',
hour: 'numeric', minute: 'numeric', second: 'numeric',
timeZoneName: 'long'
}
console.log(new Intl.DateTimeFormat('ru-RU', options).format(currentDate))
// 14.08.2022, 14:15:30 Москва, стандартное время
console.log(new Intl.DateTimeFormat('en-US', options).format(currentDate))
// 8/14/2022, 2:15:30 PM Moscow Standard Time
На практике
Скопировано
Ксения Субботина советует
Скопировано
🛠 Intl
и to
реализовывают похожую функциональность, но есть небольшая разница в использовании.
Их реализация в браузерах также может отличаться, так как нет строгой спецификации и каждый браузер может интерпретировать требования по-разному. Поэтому нет универсального решения, что именно использовать.
Основные отличия:
В поддержке браузеров.
Intl
поддерживается не всеми древними браузерами.. DateTime Format Вы можете использовать
Intl
для форматирования групп дат. В отличие от. DateTime Format to
, он позволяет установить формат один раз.Locale Date String ( )
const dateOne = new Date('August 14, 2022 14:15:30')const dateTwo = new Date('December 26, 1991 02:00:30')const options = { year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long', timeZone: 'UTC'}const formatter = new Intl. DateTimeFormat('ru-RU', options)console.log(formatter.format(dateOne))// 14.08.2022, 11:15:30 Всемирное координированное времяconsole.log(formatter.format(dateTwo))// 26.12.1991, 0:00:30 Всемирное координированное время
const dateOne = new Date('August 14, 2022 14:15:30')
const dateTwo = new Date('December 26, 1991 02:00:30')
const options = {
year: 'numeric', month: 'numeric', day: 'numeric',
hour: 'numeric', minute: 'numeric', second: 'numeric',
timeZoneName: 'long',
timeZone: 'UTC'
}
const formatter = new Intl.DateTimeFormat('ru-RU', options)
console.log(formatter.format(dateOne))
// 14.08.2022, 11:15:30 Всемирное координированное время
console.log(formatter.format(dateTwo))
// 26.12.1991, 0:00:30 Всемирное координированное время
- Различный ввод/вывод. Так как стандарт не является строгим, то передаваемые параметры могут отличаться. Особенно это касается часовых зон. Значения вывода по умолчанию также могут отличаться.
const date = new Date(1660475730000)console. log(date.toLocaleString('en-US'))// 8/14/2022, 2:15:30 PMconsole.log(new Intl.DateTimeFormat('en-US').format(date))// 8/14/2022
const date = new Date(1660475730000)
console.log(date.toLocaleString('en-US'))
// 8/14/2022, 2:15:30 PM
console.log(new Intl.DateTimeFormat('en-US').format(date))
// 8/14/2022
Поэтому, если вам не так критично поддерживать браузеры, с маленьким процентом использования клиентами, то я советую использовать Intl
.
🛠 Если вам не хватает функциональности, представленной классом Date
, например, недостаточно его возможностей форматирования или парсинга, то можно посмотреть в сторону библиотек day.js или date-fns.
❌ Раньше золотым стандартом была библиотека moment.js. Сейчас использовать её не рекомендуется, так как она сильно увеличивает размер собранного приложения. Не добавляйте её в новые проекты.
fns — современная служебная библиотека JavaScript для работы с датами
date-fns — современная служебная библиотека JavaScript для работы с датамиdate-fns
date-fns предоставляет наиболее полный, но простой и последовательный набор инструментов для управления датами JavaScript в браузере и Node. js .
Документация
Примеры
- Дата формата
- I18n
- Состав и FP
import { format, formatDistance, formatRelative, subDays } from 'date-fns' format(new Date(), "'Сегодня' eeee") //=> "Сегодня суббота" formatDistance(subDays(новая дата(), 3), новая дата(), {addSuffix: true}) //=> "3 дня назад" formatRelative(subDays(новая дата(), 3), новая дата()) //=> "в прошлую пятницу в 19:26"
Почему дата-fns?
Модульный
С помощью стиля «функция для каждого файла» вы можете выбрать только то, что вам нужно, и не перегружать свой проект бесполезной функциональностью.
Он хорошо работает с современными сборщиками модулей, такими как webpack , Browserify и Rollup , а также поддерживает встряхивание деревьев.
Native Date
date-fns использует собственный тип
Date
и не изобретает велосипед. Он не расширяет основные объекты в целях безопасности.Функции в date-fns работают предсказуемо и придерживаются поведения ECMAScript в крайних случаях.
Immutable & Pure
date-fns построен с использованием чистых функций и всегда возвращает новый экземпляр даты вместо изменения переданного.
Помогает предотвратить ошибки и избежать длительных сеансов отладки.
TypeScript и Flow
date-fns поддерживает как TypeScript , так и Flow .
Типы генерируются из исходного кода и входят в состав пакета, поэтому они всегда актуальны.
FP
Подмодуль функционального программирования представляет собой лучшую альтернативу цепочке: композиция; что делает ваш код чистым и безопасным и не раздувает вашу сборку.
I18n
При поддержке замечательного сообщества date-fns имеет десятки локалей. Только те, которые вы используете, будут включены в ваш проект.
Непротиворечивый
date-fns всегда возвращает дату в том же часовом поясе, независимо от того, что было передано — метка времени, строка или объект даты.
API настроен на предсказуемый порядок имен и аргументов.
Надежный
date-fns учитывает часовые пояса и летнее время.
Это соответствует семантическому управлению версиями, поэтому всегда совместимо с предыдущими версиями.
Каждая сборка CI проверяет более 650 000 примеров примерно в 400 часовых поясах.
Простой
Лучший API — это несуществующий API. С date-fns у вас всегда есть одна функция, которая делает одно дело.
API однозначен, и всегда есть единственный подход к проблеме.
Fast
В дополнение к маленькому размеру, date-fns работает быстро. Вы можете быть уверены, что ваши пользователи получат лучший пользовательский опыт.
Документы
Каждая функция date-fns имеет подробное описание с примерами. Документация доступна как онлайн на веб-сайте, так и в автономном режиме благодаря аннотациям JSDoc.
Еще больше!
date-fns находится в активной разработке, и мы постоянно добавляем новые функции.
Testimonials
jrop
date-fns — это модульный путь к манипулированию датой/временем. Где я работы, это помогло нам уменьшить размеры пакетов, особенно потому, что мы можем включить только те функции, которые нам нужны.
Николас Кирхер
date-fns дал нам возможность напрямую работать с объектами даты, не беспокоясь о преобразовании или мутациях. это настоящая игра чейнджер на даты.
Мильян Алексич, автор Vuikit
Саша и Леша Косс сделали то, что любой имеет дело с датами в JS когда-либо хотел, но не было времени, знаний или храбрость! Из-за таких звезд, как date-fns, сообщество разработчиков стать удивительной вселенной. Спасибо!
Оставить отзыв
Спонсоры
Идет загрузка…
Хотите стать спонсором проекта, добавить свое (компанию) имя в зал славы и поддержать разработчиков?
Спонсор date-fnsПосмотреть всех участников
Авторы
Загрузка. ..
Внести вклад в date-fns
Документация
GitHub
Сообщество
Sasha02 JavaScript Jobs
3
3 Шпаргалка по дате JavaScript
Дата
Конструктор
// Сейчас
новая дата()
// мс с начала эпохи
новая дата (1419785527580)
// Формат даты
новая дата ("17 мая 1995 г., 03:24:00")
// Формат даты ISO
новая дата ("2013-03-01T01:10:00")
новая дата(2014, 2, 1, 13, 0, 59, 0)
Конструктор
новая дата(
2014,
2,
1,
13,
0,
59,
0)
Дата Год Месяц День час Мин. сек Милли
Месяцы имеют нулевой индекс (например, январь равен 0
).
Преобразование
Метод Результат d.toString()
"Пн, 29 декабря 2014 г., 00:58:28 GMT+0800 (PHT)"
d.toTimeString()
"00:58:46 GMT+0800 (PHT)"
d.toUTCString()
"Вс, 28 декабря 2014 г., 16:58:59 по Гринвичу"
d.toDateString()
"Чт, 10 января 2013 г."
d.toISOString()
"2013-01-09T16:00:00.000Z"
d.toLocaleString()
"29.12.2014, 00:57:31"
d.toLocaleTimeString()
"00:57:31"
d.getTime()
1419785527580
Доступ
Добытчики
Метод Результат . getDate()
1..31
.getDay()
0..6
(вс..сб) .getFullYear()
2014
.getMonth()
0..11
.getHours()
.getMinutes()
.getSeconds()
.getMilliseconds()
.getTime()
мс с эпохи .getTimezoneOffset()
Также доступны версии
UTC (например, .getUTCDate()
, .getUTCDay()
и т. д.).
Сеттеры
Метод Результат .
новая дата(
2014,
2,
1,
13,
0,
59,
0)
0
). d.toString()
"Пн, 29 декабря 2014 г., 00:58:28 GMT+0800 (PHT)"
d.toTimeString()
"00:58:46 GMT+0800 (PHT)"
d.toUTCString()
"Вс, 28 декабря 2014 г., 16:58:59 по Гринвичу"
d.toDateString()
"Чт, 10 января 2013 г."
d.toISOString()
"2013-01-09T16:00:00.000Z"
d.toLocaleString()
"29.12.2014, 00:57:31"
d.toLocaleTimeString()
"00:57:31"
d.getTime()
1419785527580
. getDate()
1..31
.getDay()
0..6
(вс..сб) .getFullYear()
2014
.getMonth()
0..11
.getHours()
.getMinutes()
.getSeconds()
.getMilliseconds()
.getTime()
.getTimezoneOffset()
.getUTCDate()
, .getUTCDay()
и т. д.). .