8

Как преобразовать дату в UTC?

7

У меня возникла проблема с обработкой диапазона дат, введенного пользователем на веб-сайте. Пользователь может ввести диапазон дат в следующем формате:

2009-1-1 to 2009-1-3

Однако сервер, на который необходимо отправить эти даты для дальнейшей обработки, ожидает, что все даты и время будут представлены в формате UTC.

Например, если пользователь находится на Аляске, его часовой пояс отличается от UTC, и полученный диапазон дат нужно преобразовать в следующий формат:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Я использую объект Date в JavaScript, и мне нужно знать, как преобразовать первый "локализованный" диапазон дат в формат, который сможет правильно обработать сервер.

Как мне выполнить это преобразование? Буду признателен за любые подсказки или примеры кода!

5 ответ(ов)

7

В приведенном коде создается объект Date, в котором используется текущее время. Затем с помощью Date.UTC формируется временная метка в формате UTC. Код выводит сначала эту временную метку в виде объекта Date, а затем текущую дату и время в ISO-формате.

Вот что происходит:

  1. Создается новый объект Date, содержащий текущее время.
  2. Date.UTC используется для получения времени в формате UTC, основанного на значениях текущего года, месяца, дня и времени.
  3. В консоль выводится объект Date, созданный на основе UTC временной метки.
  4. Также выводится текущая дата и время в ISO-формате с помощью метода toISOString().

Таким образом, вывод позволяет вам увидеть текущее время в обоих форматах: как объект Date и в формате ISO.

0

Вы можете добавить методы к объекту 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(':');    
}

Объяснение:

  1. toUTCArray: Этот метод возвращает массив, содержащий год, месяц, число, часы, минуты и секунды в формате UTC. Учтите, что месяцы начинаются с 0, поэтому вы можете работать с ними непосредственно.

  2. 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.

0

Я решил проблему, при которой дата остается неизменной, независимо от установленного временного пояса на стороне клиента. Возможно, кому-то это будет полезно.

Мой случай использования:

Я создаю приложение для задач (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);

  // эта дата будет иметь тот же календарный день, что и та, которую вы выбрали ранее
  // независимо от того, где вы ее сохраняли и где находитесь сейчас
}
0

Для того чтобы преобразовать дату в формате UTC в JavaScript, вы можете использовать метод toUTCString() у объекта Date. Вот пример, как это можно сделать:

var myDate = new Date(); // Задайте здесь вашу дату в любом часовом поясе.
var utcDate = myDate.toUTCString();

В этом коде переменная myDate содержит текущую дату и время в локальном часовом поясе, а utcDate содержит ту же дату и время, но в формате UTC (всемирное координированное время). Вы можете заменить new Date() на любой другой объект Date, чтобы получить UTC-строку для указанной даты.

0

Ваш код должен работать в большинстве современных браузеров. Он возвращает строку в формате ISO 8601, например, 2012-07-28T00:00:00.000Z в Firefox 6.0. Обратите внимание, что при создании объекта Date из строки формата YYYY-MM-DD, вы получаете дату с временем, установленным на полночь в формате UTC.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь