Как конвертировать дату JavaScript в UTC? - PullRequest
499 голосов
/ 04 июня 2009

Предположим, что пользователь вашего сайта вводит диапазон дат.

2009-1-1 to 2009-1-3

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

Теперь предположим, что пользователь находится на Аляске, Гавайях или Фиджи. Поскольку они находятся в часовом поясе, весьма отличном от UTC, диапазон дат необходимо преобразовать в нечто вроде этого:

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

Используя объект JavaScript Date, как бы вы преобразовали первый «локализованный» диапазон дат в то, что сервер поймет?

Ответы [ 24 ]

6 голосов
/ 04 ноября 2016

Другое решение для преобразования в UTC и сохранения его в качестве объекта даты: (Он работает, удаляя часть 'GMT' из конца отформатированной строки, а затем возвращая ее обратно в конструктор Date)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

Мне нужно было сделать это для взаимодействия с библиотекой выбора даты и времени. Но в целом работать с датами в таком случае - плохая идея.

Пользователи обычно хотят работать с датами и временем по местному времени, поэтому вы либо обновляете код на стороне сервера, чтобы правильно анализировать строки даты и времени со смещениями, затем конвертируете в UTC (лучший вариант) или конвертируете в строку UTC на стороне клиента, прежде чем отправка на сервер (как в ответе Уилла Стерна)

5 голосов
/ 01 сентября 2016

Если вы много работаете с датами, стоит использовать moment.js (http://momentjs.com).. Метод преобразования в UTC будет следующим:

moment(yourTime).utc()

Вы можете использовать формат для изменения даты на любой другой формат:

moment(yourTime).utc().format("YYYY-MM-DD")

Есть также опции смещения в данный момент, но есть дополнительная дополнительная библиотека для работы с часовым поясом (http://momentjs.com/timezone/). Преобразование времени будет таким простым:

moment.tz(yourUTCTime, "America/New_York")
4 голосов
/ 31 декабря 2010

Я обнаружил, что плагин глобализации jQuery работает лучше всего. Другие методы имели проблемы с кроссбраузерностью, и такие вещи, как date.js, давно не обновлялись.

Вам также не нужен указатель даты на странице. Вы можете просто вызвать что-то похожее на пример, приведенный в документации:

$.parseDate('yy-mm-dd', '2007-01-26');
4 голосов
/ 04 июня 2009

Я только что обнаружил, что версия 1.2.3 date.format.js Стивена Левитана делает именно то, что я хочу. Это позволяет вам предоставить строку формата для даты JavaScript и конвертировать из местного времени в UTC. Вот код, который я сейчас использую:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 
3 голосов
/ 08 апреля 2014

Эта функция прекрасно работает для меня.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}
2 голосов
/ 08 июля 2018

Использование moment.js UTC метода ;

const moment = require('moment');
const utc = moment.utc(new Date(string));
1 голос
/ 17 августа 2016

Глядя на ваш вопрос, становится ясно, что вы просто хотите отправить диапазон дат в свой бэкэнд для дальнейшей постобработки.

Я предполагаю, что вы соответствуете стандартным рекомендациям по данным, которые предполагают, что данные будут в определенном формате. Например, я использую ODATA, который представляет собой RESTfull API, который ожидает, что объекты даты и времени будут в формате: -

YYYY-MM-DDT00: 00: 00.

Это может быть легко достигнуто с помощью фрагмента, размещенного ниже (Пожалуйста, измените формат согласно вашему требованию).

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

Если, с другой стороны, вы находитесь в моей ситуации, когда вы получили дату от своего бэкэнда, и браузер преобразует ее в вашу местную дату. Вас, с другой стороны, интересует дата UTC, тогда вы можете выполнить следующее: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

Приведенный выше фрагмент кода в основном добавляет / вычитает время, добавляемое / вычитаемое браузером, на основе часового пояса.

Например, если я нахожусь в EST (GMT-5) и моя служба возвращает объект даты и времени = ср 17 августа 2016 00:00:00 GMT-0500 мой браузер автоматически вычитает смещение часового пояса (5 часов), чтобы узнать мое местное время. Поэтому, если я попытаюсь получить время, то получу ср. 16 августа 2016 г. 19:00:00 GMT-0500. Это вызывает много проблем. Есть много библиотек, которые определенно сделают это проще, но я хотел бы поделиться чистым подходом JS.

Для получения дополнительной информации, пожалуйста, посмотрите: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/, где я черпал свое вдохновение.

Надеюсь, это поможет!

1 голос
/ 27 августа 2017

Этот метод даст вам: 2017-08-04T11:15:00.000+04:30, и вы можете игнорировать переменную zone , чтобы просто получить 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}
1 голос
/ 12 июня 2017

Вот что я делал в прошлом:

var utcDateString = new Date(new Date().toUTCString()).toISOString();
1 голос
/ 02 декабря 2016
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

Это даст вам правильную дату и время UTC.
Это потому, что getTimezoneOffset() даст вам разницу часовых поясов в минутах. Я рекомендую вам не использовать toISOString(), потому что вывод будет в строке. Следовательно, в будущем вы не сможете манипулировать датой

...