- Date JS: Текущая Дата и Время в Javascript
- 1. Использовать конструктор new Date() без передачи дополнительных параметров
- 2. Использовать конструктор new Date() с передачей временной метки, выраженной в миллисекундах
- 3. Передать дату в объект Date — в формате строки
- 4. Передать набор параметров в объект Date
- Как Поменять Временную Зону?
- Объект Date: Форматирование
- Javascript: Текущая дата и время (все методы получения)
- Установка Компонентов Даты и Времени
- Как Получить Текущее Время из Объекта Javascript Date?
- Форматирование Даты и Времени в Соответствии с Разными Языками
- Метод Intl.DateTimeFormat()
- Как Сравнить 2 Даты
- Использование Библиотеки Moment.js
- Дата и Время
- Создание
- Получение компонентов даты
- Установка компонентов даты
- Автоисправление даты
- Преобразование к числу, разность дат
- Бенчмаркинг
- Форматирование и вывод дат
- Разбор строки, Date.parse
Date JS: Текущая Дата и Время в Javascript
В этом посте хочу затронуть тему работы с датами в Javascript, которая, при первом приближении, может показаться сложной.
Для работы с датами Javascript предоставляет разработчикам встроенный функционал в виде объекта Date .
Экземпляр объекта Date — это момент времени. Методы объекта позволяют управлять не только датами, но и временем.
Рассмотрим 4 способа создать новый объект Date.
1. Использовать конструктор new Date() без передачи дополнительных параметров
Для создания нового объекта Date требуется вызвать конструктор:
Это позволит нам получить новый экземпляр объекта Date , содержащий текущий момент времени.
В качестве нулевой (базовой) даты, Javascript использует 1 Января 1970 00:00:00 UTC . Текущий момент времени — количество миллисекунд, прошедших с нулевой даты.
2. Использовать конструктор new Date() с передачей временной метки, выраженной в миллисекундах
Вероятно, вы сталкивались с временной меткой Unix, которая использует ту же нулевую дату, но представлена не в миллисекундах, а секундах.
Мы можем передать временную метку Unix в объект Date и получить соответствующий момент времени следующим образом:
Если мы передадим 0 в объект Date , то получим нулевую дату 1 Января 1970.
Можно также использовать встроенный метод Date.now() , чтобы получить текущую временную метку в миллисекундах и передать ее в объект Date .
3. Передать дату в объект Date — в формате строки
Мы также можем использовать строчные выражения для передачи в объект Date и получения соответствующего момента времени. В этом случае в объекте Date будет автоматически использоваться метод parse для определения даты и времени, которые мы в него передаем.
Также есть возможность использовать метод Date.parse() , который возвращает временную метку в миллисекундах.
4. Передать набор параметров в объект Date
Еще один способ создать новый экземпляр объекта Date – передать в него набор значений, соответствующих году, месяцу (первый месяц равен 0), дню, часу, минутам, секундам и миллисекундам.
Во всех случаях, указанных выше, мы получаем дату, привязанную к временной зоне нашего компьютера. То есть, используя одинаковые входные данные на разных компьютерах, можно получить разные результаты.
Javascript использует UTC в качестве базовой временной зоны, и производит автоматическую конверсию в локальную временную зону вашего компьютера.
Как Поменять Временную Зону?
У нас есть 2 варианта изменения временной зоны при создании нового экземпляра объекта Date:
- Использование формата “+Часы”
- Передать название временной зоны в скобках
Важно учитывать, что, если во 2-м случае вы передадите название временной зоны в неверном формате, Javascript автоматически будет использовать зону UTC. При этом вы не получите сообщения об ошибке.
В первом случае, при передаче часов в неверном формате, Javascript оповестит вас ошибкой “Invalid Date”.
Объект Date: Форматирование
Объект Date содержит ряд методов, которые возвращают дату и время в формате строки:
Javascript: Текущая дата и время (все методы получения)
Для получения значений даты и времени используются следующие методы:
Также есть возможность сразу получать значения даты и времени привязанных не локальной зоне компьютера пользователя, а к зоне UTC.
Установка Компонентов Даты и Времени
Для установки отдельных компонентов даты или времени можно использовать следующие методы:
Другие методы установки отдельных компонентов объекта Date :
Методы setHours() , setMinutes() и setSeconds() помимо базовых значений принимают значения минут, секунд или миллисекунд для более точных установок. Формат ввода выглядит следующим бразом:
Стоить помнить, что если мы укажем обновленное значение часов следующим образом date.setHours(72) , то это приведет к обновлению нашей даты (прибавится 3 дня).
Как Получить Текущее Время из Объекта Javascript Date?
Для получения текущего времени, выраженного в миллисекундах можно использовать метод Date.now() вместо более длинного варианта new Date().getTime() .
Форматирование Даты и Времени в Соответствии с Разными Языками
API Интернационализации (Internationalization API) используется для форматирования даты и времени в соответствии с нужным языком.
В качестве примера, можно привести различия в формате написания дат в России (первым идет день — 31.01.2020) и США (первым идет месяц — 01.31.2020).
Все методы интернационализации дат, времени, а также других единиц (валют) доступны в объекте Intl .
Метод Intl.DateTimeFormat()
В этом посте нас интересует метод Intl.DateTimeFormat() , который используется для форматирования даты и времени.
Рассмотрим следующий пример:
Давайте получим дату в локальном формате:
Теперь получим дату в формате, который используется в США. Для этого используем параметр en-Us (английский язык, используемый в США (US)):
Как Сравнить 2 Даты
Самый простой способ сравнить 2 даты – использовать метод Date.getTime() .
Также для сравнения дат можно использовать условия if :
Использование Библиотеки Moment.js
Рассмотрим несколько примеров ее использования.
Сначала устанавливаем пакет с помощью команды npm install moment .
Список опций форматирования доступен в документации библиотеки (пара примеров):
Один из методов библиотеки, которые часто приходится использовать – fromNow() , который возвращает количество времени, которое прошло с указанной даты.
Я использую этот метод для отображения времени, которое прошло с даты публикации постов в блоге.
Javascript var, let и const (в чем отличие и когда использовать)?
Тернарный оператор (условный оператор Javascript).
Источник
Дата и Время
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/date.
Для работы с датой и временем в JavaScript используются объекты Date.
Создание
Для создания нового объекта типа Date используется один из синтаксисов:
Создаёт объект Date с текущей датой и временем:
Создаёт объект Date , значение которого равно количеству миллисекунд (1/1000 секунды), прошедших с 1 января 1970 года GMT+0.
Если единственный аргумент – строка, используется вызов Date.parse (см. далее) для чтения даты из неё.
new Date(year, month, date, hours, minutes, seconds, ms)
Дату можно создать, используя компоненты в местной временной зоне. Для этого формата обязательны только первые два аргумента. Отсутствующие параметры, начиная с hours считаются равными нулю, а date – единице.
Год year должен быть из 4 цифр.
Отсчёт месяцев month начинается с нуля 0.
Дата задана с точностью до миллисекунд:
Получение компонентов даты
Для доступа к компонентам даты-времени объекта Date используются следующие методы:
getFullYear() Получить год (из 4 цифр) getMonth() Получить месяц, от 0 до 11. getDate() Получить число месяца, от 1 до 31. getHours(), getMinutes(), getSeconds(), getMilliseconds() Получить соответствующие компоненты.
Некоторые браузеры реализуют нестандартный метод getYear() . Где-то он возвращает только две цифры из года, где-то четыре. Так или иначе, этот метод отсутствует в стандарте JavaScript. Не используйте его. Для получения года есть getFullYear() .
Дополнительно можно получить день недели:
getDay() Получить номер дня в неделе. Неделя в JavaScript начинается с воскресенья, так что результат будет числом от 0(воскресенье) до 6(суббота).
Все методы, указанные выше, возвращают результат для местной временной зоны.
Существуют также UTC-варианты этих методов, возвращающие день, месяц, год и т.п. для зоны GMT+0 (UTC): getUTCFullYear() , getUTCMonth() , getUTCDay() . То есть, сразу после «get» вставляется «UTC» .
Если ваше локальное время сдвинуто относительно UTC, то следующий код покажет разные часы:
Кроме описанных выше, существуют два специальных метода без UTC-варианта:
Возвращает число миллисекунд, прошедших с 1 января 1970 года GMT+0, то есть того же вида, который используется в конструкторе new Date(milliseconds) .
Возвращает разницу между местным и UTC-временем, в минутах.
Установка компонентов даты
Следующие методы позволяют устанавливать компоненты даты и времени:
- setFullYear(year [, month, date])
- setMonth(month [, date])
- setDate(date)
- setHours(hour [, min, sec, ms])
- setMinutes(min [, sec, ms])
- setSeconds(sec [, ms])
- setMilliseconds(ms)
- setTime(milliseconds) (устанавливает всю дату по миллисекундам с 01.01.1970 UTC)
Все они, кроме setTime() , обладают также UTC-вариантом, например: setUTCHours() .
Как видно, некоторые методы могут устанавливать несколько компонентов даты одновременно, в частности, setHours . При этом если какая-то компонента не указана, она не меняется. Например:
Автоисправление даты
Автоисправление – очень удобное свойство объектов Date . Оно заключается в том, что можно устанавливать заведомо некорректные компоненты (например 32 января), а объект сам себя поправит.
Неправильные компоненты даты автоматически распределяются по остальным.
Например, нужно увеличить на 2 дня дату «28 февраля 2011». Может быть так, что это будет 2 марта, а может быть и 1 марта, если год високосный. Но нам обо всем этом думать не нужно. Просто прибавляем два дня. Остальное сделает Date :
Также это используют для получения даты, отдалённой от имеющейся на нужный промежуток времени. Например, получим дату на 70 секунд большую текущей:
Можно установить и нулевые, и даже отрицательные компоненты. Например:
Преобразование к числу, разность дат
Когда объект Date используется в числовом контексте, он преобразуется в количество миллисекунд:
Важный побочный эффект: даты можно вычитать, результат вычитания объектов Date – их временная разница, в миллисекундах.
Это используют для измерения времени:
Бенчмаркинг
Допустим, у нас есть несколько вариантов решения задачи, каждый описан функцией.
Как узнать, какой быстрее?
Для примера возьмём две функции, которые бегают по массиву:
Чтобы померить, какая из них быстрее, нельзя запустить один раз walkIn , один раз walkLength и замерить разницу. Одноразовый запуск ненадёжен, любая мини-помеха исказит результат.
Для правильного бенчмаркинга функция запускается много раз, чтобы сам тест занял существенное время. Это сведёт влияние помех к минимуму. Сложную функцию можно запускать 100 раз, простую – 1000 раз…
Померяем, какая из функций быстрее:
Теперь представим себе, что во время первого бенчмаркинга bench(walkIn) компьютер что-то делал параллельно важное (вдруг) и это занимало ресурсы, а во время второго – перестал. Реальная ситуация? Конечно реальна, особенно на современных ОС, где много процессов одновременно.
Гораздо более надёжные результаты можно получить, если весь пакет тестов прогнать много раз.
В современных браузерах (кроме IE9-) вызов performance.now() возвращает количество миллисекунд, прошедшее с начала загрузки страницы. Причём именно с самого начала, до того, как загрузился HTML-файл, если точнее – с момента выгрузки предыдущей страницы из памяти.
Так что это время включает в себя всё, включая начальное обращение к серверу.
Его можно посмотреть в любом месте страницы, даже в , чтобы узнать, сколько времени потребовалось браузеру, чтобы до него добраться, включая загрузку HTML.
Возвращаемое значение измеряется в миллисекундах, но дополнительно имеет точность 3 знака после запятой (до миллионных долей секунды!), поэтому можно использовать его и для более точного бенчмаркинга в том числе.
Для измерения с одновременным выводом результатов в консоли есть методы:
- console.time(метка) – включить внутренний хронометр браузера с меткой.
- console.timeEnd(метка) – выключить внутренний хронометр браузера с меткой и вывести результат.
Параметр «метка» используется для идентификации таймера, чтобы можно было делать много замеров одновременно и даже вкладывать измерения друг в друга.
В коде ниже таймеры walkIn , walkLength – конкретные тесты, а таймер «All Benchmarks» – время «на всё про всё»:
При запуске этого примера нужно открыть консоль, иначе вы ничего не увидите.
Современные интерпретаторы JavaScript делают массу оптимизаций, например:
- Автоматически выносят инвариант, то есть постоянное в цикле значение типа arr.length , за пределы цикла.
- Стараются понять, значения какого типа хранит данная переменная или массив, какую структуру имеет объект и, исходя из этого, оптимизировать внутренние алгоритмы.
- Выполняют простейшие операции, например сложение явно заданных чисел и строк, на этапе компиляции.
- Могут обнаружить, что некий код, например присваивание к неиспользуемой локальной переменной, ни на что не влияет и вообще исключить его из выполнения, хотя делают это редко.
Эти оптимизации могут влиять на результаты тестов, поэтому измерять скорость базовых операций JavaScript («проводить микробенчмаркинг») до того, как вы изучите внутренности JavaScript-интерпретаторов и поймёте, что они реально делают на таком коде, не рекомендуется.
Форматирование и вывод дат
Во всех браузерах, кроме IE10-, поддерживается новый стандарт Ecma 402, который добавляет специальные методы для форматирования дат.
Это делается вызовом date.toLocaleString(локаль, опции) , в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.
Пример с почти всеми параметрами даты и русским, затем английским (США) форматированием:
Вы сможете подробно узнать о них в статье Intl: интернационализация в JavaScript, которая посвящена этому стандарту.
Методы вывода без локализации:
toString() , toDateString() , toTimeString() Возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему – читаемость человеком. Метод toString возвращает дату целиком, toDateString() и toTimeString() – только дату и время соответственно.
toUTCString() То же самое, что toString() , но дата в зоне UTC.
toISOString() Возвращает дату в формате ISO Детали формата будут далее. Поддерживается современными браузерами, не поддерживается IE8-.
Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например Moment.JS или написать свою функцию форматирования.
Разбор строки, Date.parse
Все современные браузеры, включая IE9+, понимают даты в упрощённом формате ISO 8601 Extended.
Этот формат выглядит так: YYYY-MM-DDTHH:mm:ss.sssZ , где:
- YYYY-MM-DD – дата в формате год-месяц-день.
- Обычный символ T используется как разделитель.
- HH:mm:ss.sss – время: часы-минуты-секунды-миллисекунды.
- Часть ‘Z’ обозначает временную зону – в формате +-hh:mm , либо символ Z , обозначающий UTC. По стандарту её можно не указывать, тогда UTC, но в Safari с этим ошибка, так что лучше указывать всегда.
Также возможны укороченные варианты, например YYYY-MM-DD или YYYY-MM или даже только YYYY .
Источник