Как преобразовать дату в UTC?
У меня возникла проблема с обработкой диапазона дат, введенного пользователем на веб-сайте. Пользователь может ввести диапазон дат в следующем формате:
2009-1-1 to 2009-1-3
Однако сервер, на который необходимо отправить эти даты для дальнейшей обработки, ожидает, что все даты и время будут представлены в формате UTC.
Например, если пользователь находится на Аляске, его часовой пояс отличается от UTC, и полученный диапазон дат нужно преобразовать в следующий формат:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Я использую объект Date
в JavaScript, и мне нужно знать, как преобразовать первый "локализованный" диапазон дат в формат, который сможет правильно обработать сервер.
Как мне выполнить это преобразование? Буду признателен за любые подсказки или примеры кода!
5 ответ(ов)
В приведенном коде создается объект Date
, в котором используется текущее время. Затем с помощью Date.UTC
формируется временная метка в формате UTC. Код выводит сначала эту временную метку в виде объекта Date
, а затем текущую дату и время в ISO-формате.
Вот что происходит:
- Создается новый объект
Date
, содержащий текущее время. Date.UTC
используется для получения времени в формате UTC, основанного на значениях текущего года, месяца, дня и времени.- В консоль выводится объект
Date
, созданный на основе UTC временной метки. - Также выводится текущая дата и время в ISO-формате с помощью метода
toISOString()
.
Таким образом, вывод позволяет вам увидеть текущее время в обоих форматах: как объект Date
и в формате ISO.
Вы можете добавить методы к объекту Date
в JavaScript, чтобы преобразовать даты в массив в формате UTC или в строку формата ISO. Вот пример реализации таких методов:
Date.prototype.toUTCArray = function() {
var D = this;
return [
D.getUTCFullYear(),
D.getUTCMonth(),
D.getUTCDate(),
D.getUTCHours(),
D.getUTCMinutes(),
D.getUTCSeconds()
];
}
Date.prototype.toISO = function() {
var tem, A = this.toUTCArray(), i = 0;
A[1] += 1; // Месяцы в JavaScript начинаются с 0, поэтому увеличиваем на 1.
while (i++ < 5) { // Изменяем цикл, чтобы не превышать границы массива.
tem = A[i];
if (tem < 10) A[i] = '0' + tem; // Добавляем ноль перед числами меньше 10.
}
return A.splice(0, 3).join('-') + 'T' + A.join(':');
}
Объяснение:
toUTCArray
: Этот метод возвращает массив, содержащий год, месяц, число, часы, минуты и секунды в формате UTC. Учтите, что месяцы начинаются с 0, поэтому вы можете работать с ними непосредственно.toISO
: Этот метод представляет собой преобразование даты в строку формата ISO 8601. Вначале он вызываетtoUTCArray
, чтобы получить массив с компонентами даты. Затем он добавляет 1 к месяцу и форматирует числа, добавляя ноль, если они меньше 10, чтобы обеспечить двухзначный формат. Наконец, он соединяет части в строку формата ISO.
Пример использования:
var date = new Date();
console.log(date.toUTCArray()); // [2023, 9, 6, 12, 0, 0] (пример значения)
console.log(date.toISO()); // '2023-10-06T12:00:00'
Убедитесь, что вы правильно использовали индексы и размер массива в методе toISO
.
Я решил проблему, при которой дата остается неизменной, независимо от установленного временного пояса на стороне клиента. Возможно, кому-то это будет полезно.
Мой случай использования:
Я создаю приложение для задач (to-do app), где вы задаете дату для своей задачи. Эта дата должна оставаться постоянной, независимо от того, в каком временном поясе вы находитесь.
Пример. Вы хотите позвонить другу в 8 утра 25 июня.
Вы создаете эту задачу за 5 дней до этого (20 июня), находясь в Китае.
Затем в тот же день вы летите в Нью-Йорк на несколько дней.
И вот 25 июня, находясь всё еще в Нью-Йорке, вы просыпаетесь в 7:30 утра (что означает, что вы должны получить уведомление о задаче через 30 минут, хотя в Китае уже 13:30, когда вы создавали задачу).
Таким образом, задача игнорирует временные зоны. Это означает: «Я хочу сделать это в 8 утра, независимо от того, в каком временном поясе я буду».
Что я делаю — пусть будет так: «Я предполагаю, что вы всегда находитесь в Лондонском времени — UTC».
Что это значит: когда пользователь выбирает какую-либо дату в своем часовом поясе, я конвертирую эту дату в ту же дату в UTC, т.е. если вы выбираете 8 утра в Китае, я конвертирую это в 8 утра по UTC.
Затем, когда вы в следующий раз открываете приложение, я читаю дату, сохраненную в UTC, и конвертирую ее в ту же дату в вашем текущем временном поясе — например, я конвертирую 8 утра по UTC в 8 утра в Нью-Йорке.
Это решение означает, что дата может означать что-то другое в зависимости от того, где вы находитесь, когда устанавливаете ее, и где вы ее читаете, но она остается постоянной так, что создается ощущение, что вы всегда находитесь в одном и том же часовом поясе.
Давайте напишем немного кода:
Сначала у нас есть 2 основные функции для конвертации из/в UTC, игнорируя временную зону:
export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
const timestamp = Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds(),
);
return new Date(timestamp);
}
export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
return new Date(
utcDate.getUTCFullYear(),
utcDate.getUTCMonth(),
utcDate.getUTCDate(),
utcDate.getUTCHours(),
utcDate.getUTCMinutes(),
utcDate.getUTCSeconds(),
utcDate.getUTCMilliseconds(),
);
}
Затем я сохраняю/читаю эту дату следующим образом:
function saveTaskDate(localDate: Date) {
// Я конвертирую вашу локальную календарную дату так, чтобы она выглядела так, будто вы выбрали ее в UTC где-то около Лондона
const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
api.saveTaskDate(utcDate);
}
function readTaskDate(taskUtcDate: Date) {
// Я конвертирую эту UTC дату в 'посмотреть в вашем локальном временном поясе', как будто вы сейчас в UTC где-то около Лондона
const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);
// эта дата будет иметь тот же календарный день, что и та, которую вы выбрали ранее
// независимо от того, где вы ее сохраняли и где находитесь сейчас
}
Для того чтобы преобразовать дату в формате UTC в JavaScript, вы можете использовать метод toUTCString()
у объекта Date
. Вот пример, как это можно сделать:
var myDate = new Date(); // Задайте здесь вашу дату в любом часовом поясе.
var utcDate = myDate.toUTCString();
В этом коде переменная myDate
содержит текущую дату и время в локальном часовом поясе, а utcDate
содержит ту же дату и время, но в формате UTC (всемирное координированное время). Вы можете заменить new Date()
на любой другой объект Date
, чтобы получить UTC-строку для указанной даты.
Ваш код должен работать в большинстве современных браузеров. Он возвращает строку в формате ISO 8601, например, 2012-07-28T00:00:00.000Z
в Firefox 6.0. Обратите внимание, что при создании объекта Date
из строки формата YYYY-MM-DD
, вы получаете дату с временем, установленным на полночь в формате UTC.
Как отформатировать дату в JavaScript?
Преобразование Unix-метки времени в формат времени в JavaScript
Где найти документацию по форматированию даты в JavaScript?
Форматирование даты в JavaScript в виде yyyy-mm-dd
Как вычесть дни из обычной даты?