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



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



2009-1-1 to 2009-1-3


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



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



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


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

785   24  

24 ответов:

The toISOString() метод возвращает строку в упрощенном расширенном ISO формат (ISO 8601), который всегда 24 или 27 символов длиной (YYYY-MM-DDTHH:mm:ss.sssZ или ±YYYYYY-MM-DDTHH:mm:ss.sssZ, соответственно.) Часовой пояс всегда имеет нулевое смещение UTC, как обозначено суффикс "Z".

источник: MDN web docs

формат, который вам нужен, создается с помощью .toISOString() метод. Для старых браузеров (IE8 и ниже), которые изначально не поддерживают этой метод, прокладка может быть найден здесь:

это даст вам возможность делать то, что вам нужно:

var isoDate = new Date('yourdatehere').toISOString();

для работы часового пояса, момент.JS и момент.Яш часовой пояс действительно бесценные инструменты...особенно для навигации часовых поясов между клиентом и сервером javascript.

просто и тупо

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

вот мой метод:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

в результате utc объект на самом деле не является датой UTC, но локальная дата сдвинута в соответствии с временем UTC (см. комментарии). Однако на практике он выполняет свою работу.

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;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

конвертировать в ISO без изменения даты / времени

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

конвертировать в ISO с изменением даты / времени (дата/время будет изменено)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Скрипка ссылке

браузеры могут отличаться, и вы также должны помнить, чтобы не доверять никакой информации, генерируемой клиентом, что, как говорится, ниже заявление работает для меня (Google Chrome v24 на Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


edit: "как это отличается от просто new Date()?"смотрите здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • если аргументы не указаны, конструктор создает Объект Date JavaScript для текущей даты и времени в соответствии с настройками системы.
  • Примечание: где дата вызывается как конструктор с более чем одним аргументом, указанные аргументы представляют местное время. Если требуется UTC, используйте новую дату (дата.Мирового(...)) С теми же аргументами. (Примечание: дата.Мирового() возвращает количество миллисекунд, начиная с 1970-01-01 00:00:00 по Гринвичу)

добавление даты 60000 *.getTimezoneOffset (), как и предыдущие ответы указано неверно. Во-первых, вы должны думать обо всех датах/времени как уже UTC с модификатором часового пояса для целей отображения.

опять же, браузеры могут отличаться, однако, дата.getTime () возвращает количество миллисекунд с 1970-01-01 UTC/GMT. Если вы создадите новую дату, используя этот номер, как я делаю выше, это будет UTC/GMT. Однако, если вы отобразите его по вызову .toString () он будет отображаться в вашем местном часовом поясе, потому что .toString () использует ваш локальный часовой пояс, а не часовой пояс объект даты, на который он вызывается.

Я также обнаружил, что если вы позвоните .getTimezoneOffset () на дату он вернет ваш локальный часовой пояс, а не часовой пояс объекта даты, на который вы его вызвали (я не могу проверить, что это стандартно).

в моем браузере, добавив 60000 * дата.getTimezoneOffset () создает DateTime, который является не UTC. Однако при отображении в моем браузере (например: .toString () ), он отображает дату и время в моем локальном часовом поясе, который будет правильное универсальное время, если часовой пояс не учитывается.

var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

вы пытаетесь преобразовать дату в строку, как это?

Я бы сделал функцию для этого, и, хотя это немного спорно, добавьте ее в прототип даты. Если вам это не нравится, то вы можете поместить его как отдельную функцию, передав дату в качестве параметра.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

Если вам это нужно в UTC времени, просто замените все get * функции с getUTC*, например: getUTCFullYear, getUTCMonth, getUTCHours... а затем просто добавьте "+00:00 " в конец вместо смещения часового пояса пользователя.

date = '2012-07-28'; stringdate = new Date(date).toISOString();

должен работать в большинстве новых браузеров. он возвращает 2012-07-28T00:00:00.000Z в Firefox 6.0

моя рекомендация при работе с датами заключается в разборе даты на отдельные поля из пользовательского ввода. Вы можете использовать его как полную строку, но вы играете с огнем.

JavaScript может обрабатывать две равные даты в разных форматах по-разному.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

никогда не делайте ничего подобного:

new Date('date as text');

Если у вас есть дата разбора на отдельные поля из пользовательского ввода, создать объект даты. После создания объекта date преобразуйте его в UTC, добавив смещение часового пояса. Я не могу подчеркнуть, насколько важно использовать смещение от объекта date из-за DST (это еще одно обсуждение, однако, чтобы показать, почему).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

теперь вы можете передать дату на сервер в формате UTC. Опять же, я настоятельно рекомендую не использовать какие-либо строки даты. Либо передайте его на сервер, разбитый до самой низкой детализации, которая вам нужна, например год, месяц, день, минута или как значение, подобное миллисекундам из эпохи unix.

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

moment(yourTime).utc()

вы можете использовать формат, чтобы изменить дату в любом формате вы хотите:

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

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

moment.tz(yourUTCTime, "America/New_York")

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

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

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

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

Я только что обнаружил, что версия 1.2.3 Стивена Левитана дата.формат.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'); 

Я нашел плагин глобализации jQuery разбор даты для лучшей работы. У других методов были проблемы с кросс-браузером и такие вещи, как дата.js не был обновлен в течение довольно долгого времени.

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

$.parseDate('yy-mm-dd', '2007-01-26');

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

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();
}

С помощью момент.метод JS UTC;

const moment = require('moment');
const utc = moment.utc(new Date(string));

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

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

ГГГГ-ММ-ДДТ 00: 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/ где я получил свое вдохновение.

надеюсь, что это помогает!

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() потому что вывод будет в строке, следовательно, в будущем вы не сможете манипулировать датой

Это то, что я сделал в прошлом:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

этот метод даст вам:2017-08-04T11:15:00.000+04:30 и вы можете игнорировать зоны переменной, чтобы просто получить 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;
}

Я знаю, что этот вопрос старый, но смотрел на эту же проблему, и одним из вариантов было бы отправить дату.метод valueOf() на сервер вместо. функция valueOf () даты javascript отправляет количество миллисекунд с полуночи 1 января 1970 года UTC.

valueOf ()

Если вам нужен объект Date

передача только строки даты дата предполагает, что время 00: 00 сдвинуто по часовому поясу:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Если вы добавите текущие часы и минуты, вы получите правильную дату:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

конструктор возвращает целое число в МС начиная с unix-эпохи. Все они представляют UTC:
(узел.Яш и V8.0)

var now = new Date();
console.log(now.getTime());
console.log((now - now.getTimezoneOffset()));
var utcDate = new Date(new Date().getTime());
console.log(utcDate.getTime());

принты:

1496675469925
1496675470045
1496675469950

еще проще

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

Comments

    Ничего не найдено.