Каким бы ни было ваше мнение о JavaScript, все думают, что обработка даты — это беспорядок. Реализация Date () объекта была скопирована непосредственно из Java в 1995 году. Два года спустя Java отказалась от нее, но она осталась в JavaScript для обратной совместимости.
Вот проблемы, с которыми мы сталкиваемся Date ():
он поддерживает только UTC и местное время пользователя
нет поддержки негригорианских календарей
переход на летнее время непредсказуем
синтаксический анализ дат из строк ненадежен
API неуклюжий
Dateобъекты изменчивы: дата будет меняться по мере применения методов
Раньше самой популярной альтернативой была библиотека дат moment.js. Однако это было переведено в режим обслуживания и не должно использоваться в новых проектах. Они рекомендуют несколько альтернатив, но у каждой из них есть свои плюсы и минусы.
Объект Date () нельзя удалить из JavaScript, но новая Temporalвозможность находится на этапе 2 процесса утверждения стандартов TC39. Обсуждаемые здесь свойства и методы могут быть изменены, но API должен появиться в браузерах и средах выполнения
Временное время
Temporalявляется статическим глобальным объектом верхнего уровня (например, Math).
Его основные цели:
предсказуемое поведение в разных браузерах и во время выполнения
более простые API для вычисления даты и времени
поддержка негригорианских календарей
поддержка всех часовых поясов, включая арифметику перехода на летнее время
парсинг строго определенных строк
сделать все объекты неизменяемыми
API является всеобъемлющим и может измениться, но вы можете рассчитывать на следующие ключевые функции в
Текущая дата и время
Temporal.nowвозвращает текущую дату/время, которые можно передать другим методам для предоставления дополнительной информации. Например:
// exact time since the Unix epoch on 1 Janary, 1970 UTC
Temporal.now.instant () ;
Temporal.now.instant ().epochSeconds;
Temporal.now.instant ().epochMilliseconds;
// current time zone
Temporal.now.timeZone () ;
// time in current location, e.g.
//
Temporal.now.zonedDateTimeISO () ;
// time in another time zone, e.g.
//
Temporal.now.zonedDateTimeISO ('Europe/London’) ;
Создание мгновенной даты/времени
Объект Temporal.Instantпредставляет один момент времени с точностью до наносекунды. Его можно создать из строк в формате ISO 8601 или нескольких секунд, миллисекунд или микросекунд:
const
t1 = Temporal.Instant.from ('
t2 = Temporal.Instant.from ('
t3 = Temporal.Instant.fromEpochSeconds (1.0e8),
t4 = Temporal.Instant.fromEpochMilliseconds (1.0e10),
t5 = Temporal.Instant.epochNanoseconds (1.0e12) ;
Создание даты/времени с учетом зоны
Объект Temporal.ZonedDateTimeпредставляет собой часовой пояс и дату/время с учетом календаря в тот момент, когда это произошло (или произойдет) в определенном регионе. Можно использовать самые разные конструкторы:
new Temporal.ZonedDateTime (
1234567890000, // epoch nanoseconds
Temporal.TimeZone.from ('America/Los_Angeles’), // timezone
Temporal.Calendar.from ('iso8601') // default calendar
) ;
Temporal.ZonedDateTime.from ('
Temporal.Instant ('
Temporal.ZonedDateTime.from ({
timeZone: 'America/New_York’
year: 2025,
month: 1,
day: 7,
hour: 9,
minute: 30,
second: 1,
millisecond: 2,
microsecond: 3,
nanosecond: 4
}) ;
Создание простых дат и времени
Не всегда необходимо использовать точные моменты времени, поэтому Temporal API предоставляет объекты, не зависящие от часовых поясов. Их можно использовать для более простых мероприятий, таких как встреча сегодня в 14:00.
Temporal.PlainDateTimeотносится к календарной дате и времени
Temporal.PlainDateотносится к определенной календарной дате
Temporal.PlainTimeотносится к определенному времени суток
Temporal.PlainYearMonthотносится к дате без компонента дня, например «встреча в апреле 2021 года».
Temporal.PlainMonthDayотносится к дате без компонента года — например, «день Пи — 14 марта».
Все имеют похожие конструкторы:
// create a new PlainDateTime
// both are 4 May 2021 at 1:14pm and 15 seconds
new Temporal.PlainDateTime (2022, 5, 4, 13, 14, 15) ;
Temporal.PlainDateTime.from ('
// create a new PlainDate
// both are 4 May, 2021
new Temporal.PlainDate (2022, 5, 4) ;
Temporal.PlainDate.from ('
// create a new PlainTime
// both are 1:14pm and 15 seconds
new Temporal.PlainTime (13, 14, 15) ;
Temporal.PlainTime.from ('13:14:15') ;
// create a new year PlainYearMonth
// both are April 2021
new Temporal.PlainYearMonth (2021, 4) ;
Temporal.PlainYearMonth.from ('2019−04') ;
// create a new PlainMonthDay
// both are 14 March
new Temporal.PlainMonthDay (3, 14) ;
Temporal.PlainMonthDay.from ('03−14') ;
Извлечение значений
Все Temporalобъекты могут возвращать дискретные значения об определенной дате/времени. Например, используя ZonedDateTime:
const t1 = Temporal.ZonedDateTime.from ('
t1.year; // 2025
t1.month; // 12
t1.day; // 7
t1.hour; // 3
t1.minute; // 24
t1.second; // 30
t1.millisecond; // 0
t1.microsecond; // 0
t1.nanosecond; // 0
К другим полезным свойствам относятся:
dayOfWeek (1 в понедельник до 7 в воскресенье)
dayOfYear (от 1 до 365 или 366)
weekOfYear (от 1 до 52, а иногда и 53)
daysInMonth (28, 29, 30 или 31)
daysInYear (365 или 366)
inLeapYear (trueили false)
Сравнение и сортировка дат
Все Temporalобъекты можно сравнивать с помощью compare () функции, которая возвращает целое число. Например, чтобы сравнить два ZonedDateTimeобъекта:
// returns:
// -1 if t1 is before t2
// 0 if t1 and t2 are the same
// 1 is t1 is after t2
Temporal.ZonedDateTime.compare (t1, t2) ;
compare () может использоваться как sort () функция массива для упорядочения даты/времени в возрастающем хронологическом порядке (от самого раннего к последнему):
const t = [
'
'
'
].map (d => Temporal.ZonedDateTime.from (d))
.sort (Temporal.ZonedDateTime.compare) ;
Расчет даты
Предусмотрено несколько методов для выполнения вычислений даты для любого объекта Temporal. Все возвращают новый Temporal того же типа при передаче Temporal.Durationобъекта, который определяет период в years, months, days, hoursи т. д.
const t1 = Temporal.ZonedDateTime.from ('
// add 8 hours 30 minutes
t1.add ({ hours: 8, minutes: 30 }) ;
// subtract 5 days
t1.subtract ({ days: 5 }) ;
// round to nearest month
t1.round ({ smallestUnit: 'month’ }) ;
Обратите внимание, что Plainдаты и время могут переноситься. Например, добавление 24 часов к любому PlainTimeвернет объект с идентичным значением.
Методы until () и since () возвращают Temporal.Durationобъект, описывающий время до или после определенной даты/времени:
// mounths until t1
t1.until ().months;
// weeks since t1
t1.since ().weeks;
Наконец, equals () метод может определить, эквивалентны ли два значения даты/времени:
const
d1 = Temporal.PlainDate.from ('
d2 = Temporal.PlainDate.from ('
d1.equals (d2) ; // false
Форматирование дат с помощью API интернационализации
IntlХотя API JavaScript (Internationalization) не является частью Temporal API, он предоставляет DateTimeFormat () конструктор, который можно использовать для форматирования объектов Temporal или Date:
const d = new Temporal.PlainDate (2022, 3, 14) ;
// 3/14/2022
new Intl.DateTimeFormat ('
// 14/3/2022
new Intl.DateTimeFormat ('
// miércoles, 14 de abril de 2022
new Intl.DateTimeFormat ('
О времени?
Объект Date () уже четверть века вызывает недовольство разработчиков. Хотя нет никаких гарантий Temporal, что эта функция быстро станет стандартной, будущее дат JavaScript выглядит немного ярче.
Вы можете попробовать Temporalсегодня с помощью экспериментального полифилла, но не используйте его в производственной среде (пока)!