Класс Date: работа с датой и временем в JavaScript

При разработке нередко возникает необходимость работать с датой и временем. В этой статье мы рассмотрим класс для работы с датой Date в JavaScript и изучим, как получать и устанавливать компоненты даты, форматировать, а также выполнять арифметические операции с датами.

Класс Date и создание объекта даты

Для работы с датой и временем в JavaScript существует специальный класс Date. Он предоставляет методы и свойства, которые позволяют производить различные манипуляции с датой и временем: создание текущей либо конкретной даты, ее изменение, получение определенных компонентов. Помимо этого, класс позволяет производить различные арифметические действия над датой и временем.

Для создания объекта даты в JavaScript можно использовать несколько различных способов:

  1. Создание текущей даты производится самым простым способом — вызовом конструктора без аргументов. В этом случае конструктор создаст объект, содержащий текущую дату и время:
const currentDate = new Date();
console.log(currentDate); // Thu Jun 22 2023 21:13:42 GMT+0300 (Москва, стандартное время)
  1. Если необходимо создать объект конкретной даты, конструктору можно передать аргумент в виде строки с указанием определенной даты и времени.
const specificDate = new Date('2024-08-12 14:30'); 
console.log(specificDate); // Mon Aug 12 2024 14:30:00 GMT+0300 (Москва, стандартное время)
  1. Создать конкретную дату можно также и иным способом — передачей в конструктор нескольких аргументов. Эти аргументы представлены в виде отдельных чисел, указывающих части даты в таком порядке: год, месяц, день, часы, минуты, секунды:
const specificDate = new Date(2024, 3, 10, 11, 20, 15);
console.log(specificDate); // Wed Apr 10 2024 11:20:15 GMT+0300 (Москва, стандартное время)

Здесь нужно обратить внимание, что числа месяцев (второй аргумент) берут отсчет от 0 (январь) до 11 (декабрь). В нашем примере число 3 означает апрель.

Стоит отметить, что объекты класса Date в JavaScript представляют дату и время в виде числовых значений, основанных на временной зоне, установленной на устройстве, где выполняется скрипт. Внутри объекта Date время представлено в виде количества миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC. Это значение называется «временной меткой» или «таймстампом».

Методы класса Date для получения компонентов даты

Класс Date предоставляет различные методы для получения отдельных компонентов даты:

  • getFullYear() — возвращает год в формате, состоящем из четырех цифр (например, 2023);
  • getMonth() — получение номера месяца от 0 (январь) до 11 (декабрь);
  • getDate() — извлекает день месяца от 1 до 31;
  • getDay() — получение дня недели от 0 до 6, где 0 соответствует воскресенью, 1 — понедельнику и так далее, а 6 — субботе;
  • getHours() — количество часов от 0 до 23;
  • getMinutes() — количество минут от 0 до 59;
  • getSeconds() — количество от 0 до 59;
  • getMilliseconds() — количество миллисекунд от 0 до 999;
  • getTime() — извлечение количества миллисекунд, прошедших с 1 января 1970 г. UTC.

Текущее время в миллисекундах также можно получить и без создания объекта Date — с помощью метода Date.now(). Результат будет аналогичен вызову метода getTime() у объекта.

const currentDate = new Date();
console.log(currentDate); // Sat Jun 24 2023 11:57:48 GMT+0300 (Москва, стандартное время)

console.log(currentDate.getFullYear()); // 2023
console.log(currentDate.getMonth()); // 5
console.log(currentDate.getDate()); // 24
console.log(currentDate.getDay()); // 6
console.log(currentDate.getHours()); // 11
console.log(currentDate.getMinutes()); // 57
console.log(currentDate.getSeconds()); // 48
console.log(currentDate.getMilliseconds()); // 361
console.log(currentDate.getTime()); // 1687597068361
console.log(Date.now()); // 1687597068361

Вышеперечисленные методы возвращают значения, соответствующие текущему часовому поясу (таймзоне). У каждого из этих методов есть альтернативный метод, содержащий в своем названии «UTC» после «get». Поэтому, если необходимо получить значения даты в UTC, нужно воспользоваться этими методами: getUTCFullYear(), getUTCMonth(), getUTCDate(), getUTCDay(), getUTCHours(), getUTCMinutes(), getUTCSeconds(), getUTCMilliseconds().

Методы класса Date для установки компонентов даты

Для установки компонентов даты в объекте класса Date также есть специальные методы:

  • setFullYear() — устанавливает значение года;
  • setMonth() — задает номер месяца от 0 (январь) до 11 (декабрь);
  • setDate() — установка значения дня в месяце;
  • setHours() — задать количество часов;
  • setMinutes() — установить количество минут;
  • setSeconds() — установка количества секунд;
  • setMilliseconds() — задает количество миллисекунд;
  • setTime() — создает дату с компонентами, рассчитанными по количеству миллисекунд, прошедших с 1 января 1970 г. UTC.
const date = new Date();
    
// зададим значение каждого компонента
date.setFullYear(2025);
date.setMonth(10);
date.setDate(18);
date.setHours(14);
date.setMinutes(27);
date.setSeconds(38);
date.setMilliseconds(0);

console.log(date); // Tue Nov 18 2025 14:27:38 GMT+0300 (Москва, стандартное время)

// установим значения компонентов с помощью метода setTime()
date.setTime(1832599428468);
console.log(date); // Thu Jan 27 2028 18:23:48 GMT+0300 (Москва, стандартное время)

Так же, как и методы получения компонентов, методы установки имеют альтернативные варианты (кроме setTime()) для установки дат в UTC: setUTCFullYear(), setUTCMonth(), setUTCDate(), setUTCDay(), setUTCHours(), setUTCMinutes(), setUTCSeconds(), setUTCMilliseconds().

Форматирование даты

Для форматирования даты в определенный текстовый формат в классе Date также существует несколько методов:

  • toLocaleString() — вернет строку, представляющую полное локализованное представление даты и времени, включая как дату, так и время.
  • toLocaleDateString() — возвращает строку, представляющую дату в локализованном формате. Формат даты будет зависеть от языка и настроек локали на устройстве пользователя.
  • toLocaleTimeString() — получение строки, представляющей время в формате, соответствующем языковым и региональным настройкам пользователя.
const date = new Date();

// получим данные по умолчанию, исходя из настроек локали
console.log(date.toLocaleString()); // 24.06.2023, 14:59:12
console.log(date.toLocaleDateString()); // 24.06.2023
console.log(date.toLocaleTimeString()); // 14:59:12

Методы toLocaleDateString(), toLocaleTimeString() и toLocaleString() принимают два необязательных аргумента, которые позволяют настраивать формат вывода даты и времени в соответствии с требованиями. Опишем эти аргументы:

  • locales — первый аргумент, определяющий локаль или список локалей, для которых должно выполняться форматирование. Это может быть строка с языковым кодом (например, 'en-US' для английского языка в США) или массив языковых кодов (например, ['en-US', 'ru-RU'] для английского и русского языков);
  • options — второй аргумент, представляющий собой объект с дополнительными параметрами форматирования. Некоторые из наиболее используемых параметров включают:
    • timeZone — временная зона, в которой должно выполняться форматирование времени;
    • weekday — формат вывода дня недели (возможные значения — narrow, short и long);
    • year — формат вывода года (numeric, 2-digit);
    • month — формат вывода месяца (numeric, 2-digit, narrow, short, long);
    • day — формат вывода дня месяца (numeric, 2-digit);
    • hour — формат вывода часов (numeric, 2-digit);
    • minute — формат вывода минут (numeric, 2-digit);
    • second — формат вывода секунд (numeric, 2-digit).
const date = new Date();

const options = {
  timeZone: 'UTC',
  weekday: 'long',
  year: 'numeric',
  month: 'short',
  day: 'numeric',
  hour: 'numeric',
  minute: '2-digit',
  second: 'numeric'
};

const formattedDateTime = date.toLocaleString('en-US', options);
console.log(formattedDateTime); // Saturday, Jun 24, 2023, 12:15:01 PM

Арифметические операции с датами

Напишем пример, каким образом можно выполнять арифметические операции с датами с помощью нативного JavaScript. Допустим, нам необходимо вычислить разницу между двумя заданными датами в определенных единицах (месяцы, дни, часы, минуты, секунды):

// функция для вычисления разницы между двумя датами
function getDateDifference(date1, date2, unit) {
    const timeDiff = date2.getTime() - date1.getTime();

    switch (unit) {
        case 'days':
            return Math.floor(timeDiff / (1000 * 60 * 60 * 24));
        case 'months':
            let months;
            months = (date2.getFullYear() - date1.getFullYear()) * 12;
            months -= date1.getMonth();
            months += date2.getMonth();
            return months <= 0 ? 0 : months;
        case 'hours':
            return Math.floor(timeDiff / (1000 * 60 * 60));
        case 'minutes':
            return Math.floor(timeDiff / (1000 * 60));
        case 'seconds':
            return Math.floor(timeDiff / 1000);
        default:
            return null;
    }
}

// создадим две даты
const startDate = new Date(2022, 0, 15); // 15 января 2022 года
const endDate = new Date(2023, 4, 20); // 20 мая 2023 года

// вызывая функцию getDateDifference(), вычислим разницу между датами
const differenceInDays = getDateDifference(startDate, endDate, 'days');
console.log(differenceInDays); // 490 дней

const differenceInMonths = getDateDifference(startDate, endDate, 'months');
console.log(differenceInMonths); // 16 месяцев

const differenceInHours = getDateDifference(startDate, endDate, 'hours');
console.log(differenceInHours); // 11760 часов

const differenceInMinutes = getDateDifference(startDate, endDate, 'minutes');
console.log(differenceInMinutes); // 705600 минут

const differenceInSeconds = getDateDifference(startDate, endDate, 'seconds');
console.log(differenceInSeconds); // 42336000 секунд

Заключение

В этой статье мы рассмотрели основы работы с классом Date в JavaScript и познакомились с его различными методами. Возможностей этого класса может быть достаточно для некоторых несложных задач. Однако, если вы ищете более удобные и функциональные способы форматирования, изменения дат, работы с таймзонами, рекомендуется использовать специализированные библиотеки, такие как Moment.js.

Оцените статью
DevReflex
Добавить комментарий