Какие особенности работы с датами в JavaScript

Ответ

Работа с датами в JavaScript имеет несколько ключевых особенностей:

  1. Объект Date - основной инструмент для работы с датами. Создается через new Date(). Может принимать разные форматы:
new Date() // текущая дата
new Date('2023-01-01') // из строки
new Date(2023, 0, 1) // год, месяц (0-11), день
  1. Месяцы нумеруются с 0 (0 - январь, 11 - декабрь)

  2. Часовые пояса - Date использует локальный часовой пояс системы. Для UTC используйте методы:

date.getUTCHours()
date.toISOString() // формат YYYY-MM-DDTHH:mm:ss.sssZ
  1. Библиотеки - для сложных операций лучше использовать библиотеки:
  • Moment.js (устаревший)
  • date-fns (современная альтернатива)
  • Day.js (легковесная)
  1. Форматирование - встроенные методы ограничены, для сложного форматирования лучше использовать Intl.DateTimeFormat:
new Intl.DateTimeFormat('ru-RU').format(date)

Ответ 18+ 🔞

А, ну давай поговорим про даты в JavaScript, это же просто пиздец, а не тема! Ну вот сидишь ты такой, пишешь код, всё вроде летит, а потом бац — надо с датами поработать. И тут начинается, блядь, цирк с конями, ёпта.

Смотри, главный наш герой тут — это объект Date. Создаёшь его, и вроде как всё есть. Но это как купить конструктор «Лего» без инструкции — детали вроде есть, а собрать нихуя не получается.

new Date() // Ну, текущая дата, тут всё просто, блядь
new Date('2023-01-01') // Из строки — а вот тут уже засада может быть
new Date(2023, 0, 1) // Год, месяц, день... ОЙ, ПОДОЖДИ!

Вот на этом моменте все и обосрались в первый раз. Месяцы, сука, нумеруются с нуля! Нуля, Карл! Январь — это 0, а декабрь — 11. Кто это придумал? Человек с хуем вместо мозгов? Ядрёна вошь! Сидишь, пишешь new Date(2023, 1, 14) — думаешь, 14 февраля, день всех влюблённых... а на деле получаешь 14 марта! Пиздец и сраное разочарование.

А потом всплывает тема часовых поясов. Это вообще отдельный вид искусства, блядь. Твой Date живёт по времени твоего компа. А сервер, ёбаный в рот, может быть в другой полосе. И начинается: «почему у меня на три часа меньше?». Чтоб тебя чих-пых в сраку! Для этого есть UTC-методы, чтобы не ебать мозги.

date.getUTCHours() // Вот эти часы уже нормальные, мировые
date.toISOString() // А это чтоб красиво отправить на сервер, формат такой международный

Но если тебе нужно что-то посерьёзнее, чем просто сегодняшнюю дату получить, то нативные средства — это как пытаться забить гвоздь микроскопом. Терпения ноль, ебать. Все умные люди берут библиотеки.

Раньше все орали «Moment.js! Moment.js!». А щас на него смотрят как на деда, который рассказывает про войну — уважают, но использовать уже не будут. Он большой, неповоротливый, овердохуища весит.

Сейчас модно использовать date-fns — она как швейцарский нож, модульная, берёшь только то, что надо. Или Day.js — вообще лёгкая, как пёрышко, почти как Moment, но без этого сраного раздутия.

Ну и наконец, форматирование. Захотел ты вывести дату по-русски, красиво: «15 февраля 2023 г.». Нативный JS тебе такое выдаст только через жопу. Раньше бы писал свои функции, склеивал куски... Сейчас можно использовать Intl.DateTimeFormat. Это уже нормально, встроенная в язык хуйня.

new Intl.DateTimeFormat('ru-RU').format(date) // И будет тебе счастье, почти

Короче, работа с датами — это всегда волнение, ебать. То месяц не тот, то время съехало, то ещё какая-нибудь хуйня. Главное — не пытайся изобретать велосипед, бери проверенные библиотеки и не еби себе мозг. Всё уже давно придумано, иногда, правда, ебланами.