DanLevy.net

Тест:14 вопросов о JavaScript Date

Научись впечатлять гостейJS‑викторинами! ✨

Hero image for Тест:14 вопросов о JavaScript Date

Насколько хорошо вы знаете класс Date?

План

Класс Date в JavaScript известен своей коварной API. Он унаследован из Java, а, вероятно, вдохновлён древними неолитическими методами измерения времени.

Борьба с Date заставляет многих разработчиков без вопросов обращаться к сторонним библиотекам. Хотя это часто безопасный и надёжный выбор, такие библиотеки редко нужны для простого форматирования дат или локализации!

Этот тест создан, чтобы проверить (и углубить) ваши знания нативного API Date. Используйте зелёные кнопки для подсказок и объяснений! К концу задания вы, надеемся, укрепите понимание работы Date в JavaScript.

ПРИМЕЧАНИЕ: Предполагается, что все примеры работают в локальном часовом поясе GMT‑7.

👇 14 вопросов ниже 👇

Что будет включено в вывод?

const d1 = new Date(2020, 1, 1)
console.log(d1)

Аргумент month начинается с нуля. Диапазон 0‑11 (для западных календарей).

‘February’ имеет индекс 1. (Думайте об этом как о поиске в массиве.)

Что будет включено в вывод?

const d2 = new Date(2020, 0, 1)
console.log(d2)

Аргумент month считается с нуля. Диапазон — 0‑11 (для западных календарей).

‘January’ имеет индекс 0. (Это как поиск в массиве.)

Что будет включено в вывод?

const d3 = Date('Thu, 01 Jan 1970 00:00:00 GMT')
console.log(d3)

Не забудьте ключевое слово new! Date — это класс, его нужно вызывать с new.

Date('...') без new игнорирует переданное значение. Похоже, что он всегда возвращает текущие дату и время, как new Date() (без аргументов).

Это распространённый подводный камень, который легко упустить, даже при ревью кода.

Что будет включено в вывод?

const date = new Date(2020)
console.log(date.getFullYear())

Экземпляр Date, созданный с единственным целочисленным аргументом, интерпретируется как значение Unix Epoch. Epoch — это количество миллисекунд, прошедших с 1 янв 1970 года.

Значение 2020 (миллисекунд) соответствует 2 секундам после 1 янв 1970 года.

Поскольку наш локальный часовой пояс имеет отрицательное смещение ‑7 часов, получаем Wed Dec 31 1969 17:00:02 GMT-0700 (Mountain Standard Time).

Можно обойти смещение локального часового пояса, используя .getUTCFullYear().

Какое значение будет выведено в консоль?

const d1 = new Date('2020-01-01')
const d2 = new Date('2020-01-01T00:00')
console.log(d1.getFullYear(), d2.getFullYear())

Строка без значения времени T может выглядеть как Jan 1st, 2020 - но строки, содержащие только дату, интерпретируются как UTC, и при переводе в наш локальный часовой пояс (GMT-7) мы всё ещё находимся в 2019.

Строки даты и времени без явного часового пояса интерпретируются в локальном времени.

Формат T00:00 заставляет второе значение интерпретировать как полночь локального времени.

Первая дата интерпретируется как Tue Dec 31 2019 17:00:00 GMT-0700 (Mountain Standard Time). Вторая дата интерпретируется как Wed Jan 01 2020 00:00:00 GMT-0700 (Mountain Standard Time).

Выберите неправильный метод форматирования:

Метод toLocaleFormat() не является стандартным! Он может выглядеть знакомо, потому что пришёл из древней сторонней библиотеки.

Ознакомьтесь с toLocaleDateString docs методом. Его поведение задокументировано в Intl.DateTimeFormat.

Что будет включено в вывод?

var date = Date.UTC('2020-01-02T00:00')
console.log(date.toUTCString())

Вы получите TypeError: date.toUTCString is not a function, поскольку Date.UTC() возвращает целое число в миллисекундах, а не экземпляр даты.

Что будет включено в вывод?

const d = Date.UTC(2020, 0, 1)
console.log(d)

Вспомогательный метод Date.UTC не возвращает экземпляр даты. Он возвращает целое число в миллисекундах.

Что будет включено в вывод?

// Assume local TZ is -07:00
const d = new Date(Date.UTC(2020, 0, 1))
console.log(d.getTimezoneOffset())

Дата будет неявно представлена в локальном времени, с (по‑сути) неизменным .getTimezoneOffset().

Date‑объекты не хранят данные о часовом поясе. Они хранят количество миллисекунд, прошедших с эпохи Unix (1 янв 1970). Часовой пояс учитывается при разборе и выводе строк даты. Поведение по умолчанию определяется автоматически на основе настроек локали системы или браузера.

Что будет включено в вывод?

const d = new Date(2020, 0, 1)
d.setDate(1)
console.log(d)

Метод .setDate() устанавливает день месяца, исходя из текущего месяца данного экземпляра.

Если передать значение, выходящее за пределы количества дней в месяце, значение месяца будет скорректировано (например, setDate(32) в январе будет вычислено как 1 февраля.)

Что будет включено в вывод?

const d = new Date(2020, 0, 1)
d.setMonth(1)
console.log(d)

Метод .setMonth() задает месяц указанного экземпляра даты.

Аргумент month считается с нуля и имеет диапазон 0‑11 (для западных календарей.)

Что будет включать вывод?

const d = new Date(2020, 0, 1)
d.setMonth(12)
console.log(d)

Метод .setMonth() задаёт месяц у указанного экземпляра даты.

Аргумент month считается с нуля, диапазон значений — 0‑11 (для западных календарей).

Здесь мы видим, что год меняется на 2021, потому что setMonth(12) на 1 больше, чем 11 (декабрь).

Что будет включено в вывод?

const d = new Date(2020, 0, 1)
d.setMonth(13)
console.log(d)

Метод .setMonth() устанавливает месяц у указанного экземпляра даты.

Аргумент month считается с нуля, диапазон 0‑11 (для западных календарей).

Здесь мы видим, что месяц и год скорректированы до февраля 2021 года, потому что setMonth(13) на 2 больше 11 (декабря).

Что будет включать вывод?

const d = new Date(2020, 0, 1)
d.setMonth(-1)
console.log(d)

Метод .setMonth()([https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth]) устанавливает месяц указанного экземпляра даты.

Аргумент месяца считается с нуля и может принимать значения от 0 до 11 (по западному календарю).

Здесь мы видим, как месяц и год откатываются к декабрю 2019 года, потому что setMonth(-1) меньше 0 (январь).