Основы объекта Date в JavaScript, часть 3: Использование статических методов

Эта статья представляет собой стенограмму моей бесплатной серии YouTube об основах веб-разработки. Если вы предпочитаете смотреть, а не читать, не стесняйтесь посетить мой канал Dev Newbs.

Привет, мои друзья-новички! Еще один эпизод о методах Date здесь. Сегодня мы рассмотрим методы STATIC объекта Date. Их три, и я объясню и продемонстрирую каждую из них. Давай начнем.

Первый статический метод вызывается now () и возвращает количество миллисекунд, прошедших с 1 января 1970 г., 00:00:00 UTC. Возвращаемое значение - примитивное целочисленное значение.

Этот метод был указан в 5-м издании спецификации EcmaScript, поэтому все еще возможно, что некоторые старые версии браузеров не поддерживают его. Хотя, думаю, с таким случаем вы не столкнетесь. Но если вы каким-то образом это сделаете, вы можете просто переопределить проблему, используя нестатический метод getTime ().

Давайте теперь посмотрим на несколько примеров этого статического метода.

console.log(Date.now());
console.log(Date.now());
console.log(Date.now());
console.log(Date.now());
console.log(Date.now());
// 1626156551132
// 1626156551133
// 1626156551133
// 1626156551133
// 1626156551133

Некоторые браузеры, например Firefox, обеспечивают пониженную точность времени при использовании метода Date.now (). Это означает, что он предлагает защиту от различных атак по времени и отпечатков пальцев путем округления точного значения до определенной точности.

Я проверял в разных браузерах, и Chrome не обеспечивает такого поведения. Как видите, одни и те же миллисекунды можно получить несколько раз - я полагаю, это зависит от текущей загрузки процессора.

Второй статический метод называется parse (), и, судя по его названию, его задача состоит в том, что он анализирует строковое представление даты. В случае успеха он возвращает количество миллисекунд с 1 января 1970 г., 00:00:00 по всемирному координированному времени. Если синтаксический анализ завершился неудачно, потому что строка не распознается или дата содержит недопустимые значения даты, вместо этого возвращается константа «NaN».

Этот метод исторически не очень надежен, и до версии EcmaScript 5 реализация синтаксического анализа полностью зависела от поставщика. Он до сих пор не совсем унифицирован, но, по крайней мере, наиболее распространенные форматы можно анализировать в каждой реализации браузера. Официально упрощенный формат ISO 8601 должен поддерживаться всеми реализациями, но, к счастью, набор форматов для синтаксического анализа больше этого. Я покажу все кейсы, которые смог придумать, на примерах. Как упоминалось ранее, возвращаемое значение - это число, представляющее миллисекунды, прошедшие с начала UNIX Epoch. Теперь к этим примерам ...

// uses 00:00:00.000 in local time
console.log(Date.parse("2021-07-07"));
// 1625616000000
// uses 00:00:00.000 in UTC/GMT
console.log(Date.parse("07 Jul 2021"));
// 1625608800000
// these 2 use local time
console.log(Date.parse("2021-07-07T22:19:38"));
// 1625689178000
console.log(Date.parse("Wed, 07 Jul 2021 22:19:38"));
// 1625689178000
// these 2 use explicitly specified UTC/GMT
// parse() method can only handle GMT, not UTC or any other time zone shortcut
console.log(Date.parse("07 Jul 2021 20:19:38 GMT"));
// 1625689178000
console.log(Date.parse("Wed, 07 Jul 2021 20:19:38 GMT"));
// 1625689178000
// specifying UTC/GMT time zone by +00:00
console.log(Date.parse("2021-07-07T20:19:38.054+00:00"));
// 1625689178054
// specifying CET time zone by +02:00
console.log(Date.parse("2021-07-07T22:19:38.054+02:00"));
// 1625689178054
// Z - represents GMT/UTC in ISO 8601 format
console.log(Date.parse("2021-07-07T20:19:38.054Z"));
// 1625689178054

Я разделил все форматы, которые можно разобрать, на три группы. Первый указывает только год, месяц и день, остальные используют значения по умолчанию. Интересно то, что в первом формате используется местное время, а во втором - GMT / UTC.

Во второй группе находятся форматы, в которых также указываются часы, минуты и секунды, но не упоминаются миллисекунды. Ситуация следующая. Если часовой пояс GMT не указан явно, вместо него используется местный часовой пояс. Также интересно наблюдать за странным поведением синтаксического анализа. Он обрабатывает ярлык GMT, но не может обрабатывать UTC или любой другой ярлык часового пояса, например CET.

Последняя группа также определяет миллисекунды. Часовой пояс UTC или, скорее, GMT можно указать как минимум двумя способами. Мы можем использовать стандартный и универсальный «+00: 00» или мы можем использовать ярлык «Z». И это все, что касается статического метода parse ().

Последний метод - это метод UTC (), который принимает параметры, аналогичные конструктору Date, но обрабатывает их как UTC. Возвращает количество миллисекунд, прошедших с UNIX Epoch.

Метод UTC () ведет себя точно так же, как конструктор Date, даже при обработке значений года из диапазона от 0 до 99. Подсказка: он обрабатывает их так, как если бы вы вводили значения из диапазона от 1900 до 1999.

Давайте посмотрим на несколько примеров, и позже я расскажу вам больше об этом методе.

// this date is specified in local time (GMT+0100)
let endDate = new Date(2021,11,31,23,59,59,999);
console.log(endDate.getTime());
// 1640991599999
console.log(endDate);
// Fri Dec 31 2021 23:59:59 GMT+0100 (stredoeurópsky štandardný čas)
// this date is specified in UTC (GMT+0000)
let utcDate = Date.UTC(2021,11,31,23,59,59,999);
console.log(utcDate);
// 1640995199999
console.log(new Date(utcDate));
// Sat Jan 01 2022 00:59:59 GMT+0100 (stredoeurópsky štandardný čas)
// this date is specified in UTC (GMT+0000)
// 23 months - 12 months = 11 months
// year 2020 + 12 months = year 2021
let wrongUtcDate = Date.UTC(2020,23,31,23,59,59,999);
console.log(wrongUtcDate);
// 1640995199999
console.log(new Date(wrongUtcDate));
// Sat Jan 01 2022 00:59:59 GMT+0100 (stredoeurópsky štandardný čas)

Фактически этот метод отличается от конструктора Date только двумя вещами. Во-первых, вместо местного времени используется всемирное время. А во-вторых, он возвращает число как значение времени вместо объекта Date.

Если какой-либо параметр по какой-либо причине выходит за пределы допустимого диапазона, метод принимает значение. Так, например, если вы введете 23 в качестве месяца, год увеличится на единицу, а затем вычтет 12 месяцев из значения 23, получив значение 11, которое затем будет использоваться в качестве значения для позиции месяца. Довольно круто, если вы спросите меня.

Но это все, что у меня есть для вас сегодня. Так что я боюсь, что нам придется покончить с этим. Надеюсь, вам понравилось.

Как всегда, спасибо за ваше постоянное внимание, и я увижу вас в следующий раз с методами, которые фактически форматируют объект Date так, как нам нужно.

Больше контента на plainenglish.io