Как вы конвертируете дату JavaScript в UTC?

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

2009-1-1 to 2009-1-3

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

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

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

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

Ответ 1

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

Источник: веб-документы MDN

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

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

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

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

Ответ 2

Простой и глупый

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

Ответ 3

Здесь мой метод:

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

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

Ответ 4

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

Ответ 5

Преобразование в 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 

Ссылка на скрипт

Ответ 6

Браузеры могут отличаться, и вы также должны помнить, что не доверяете какой-либо информации, созданной клиентом, и, как говорится, приведенный ниже оператор работает для меня (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 для текущей даты и времени в соответствии с системными настройками.
  • Примечание. Если Date вызывается как конструктор с несколькими аргументами, указанные аргументы представляют собой локальное время. Если требуется UTC, используйте новую дату (Date.UTC(...)) с теми же аргументами. (примечание: Date.UTC() возвращает число миллисекунд с 1970-01-01 00:00:00 UTC)

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

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

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

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

Ответ 7

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

Ответ 8

Вы пытаетесь преобразовать дату в такую ​​строку?

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

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" в конце вместо пользовательского часового пояса смещение.

Ответ 9

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

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

Ответ 10

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

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

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

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

new Date('date as text');

После того, как ваша дата проанализирована в ее отдельных полях с пользовательского ввода, создайте объект даты. После создания объекта даты преобразуйте его в UTC, добавив смещение часового пояса. Я не могу подчеркнуть, насколько важно использовать смещение от объекта даты из-за 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.

Ответ 11

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

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

Ответ 12

Если вы имеете дело с датами много, стоит использовать 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")

Ответ 13

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

Ответ 14

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

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

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

Ответ 15

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

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

Ответ 16

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

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

Ответ 17

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

Я предполагаю, что вы соответствуете стандартным рекомендациям по данным, которые ожидают, что данные будут в определенном формате. Например, я использую 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 часов), чтобы получить мое местное время. Поэтому, если я попытаюсь получить время, которое я получаю Wed Aug 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/, где я получил свое вдохновение.

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

Ответ 18

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

Ответ 19

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

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

Ответ 20

Этот метод даст вам: 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;
}

Ответ 21

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

valueOf()

Ответ 22

Конструктор возвращает целое число в ms с момента unix-epoch. Все это означает UTC:
(node.js 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

Ответ 23

Если вам нужен объект 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)

Ответ 24

Используя моментальный пакет, вы можете легко преобразовать строку даты UTC в новый объект Date:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

Это особенно помогает, когда ваш сервер не поддерживает часовой пояс, и вы хотите всегда сохранять дату UTC на сервере и возвращать ее как новый объект Date. Выше код работал для моего требования аналогичной проблемы, что этот поток для. Поделиться здесь, чтобы помочь другим. Я не вижу точно вышеуказанного решения ни в одном ответе. Благодарю.

Ответ 25

Так что это был способ, которым я должен был это сделать, потому что я все еще хотел, чтобы объект даты в JavaScript манипулировал как дата, и, к сожалению, многие из этих ответов требуют от вас перехода к строке.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

Ответ 26

Один из самых простых способов получить дату в UTC:

new Date(new Date().toISOString().split('.')[0])

Ответ 27

Еще проще

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