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


590

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

2009-1-1 to 2009-1-3

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

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

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

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


10
воскресил его, потому что это был лучший хит Google для меня, и более новые браузеры имеют встроенную поддержку строк даты UTC.
jcomeau_ictx

4
Я обновил принятый ответ, чтобы выделить новый метод ECMAscript 5 toISOString (). См stackoverflow.com/a/11957822/19112
dthrasher

5
так что в 2015 году мне придется связываться с датами разбора и разбора? смешной!
Инструментарий

2
Конечно есть. Вы никогда не можете полагаться на то, что кто-то другой сделает эту работу за вас: - По крайней мере, пока мир не перестанет использовать часовые пояса и не начнет объединять даты и время.
Эренор Пас

4
«Стардаты», желательно.
Майкл Доу

Ответы:


370

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

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

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

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

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

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


81
на самом деле это преобразует объект даты в строку, и он не сможет выполнять дальнейшие операции над датой
orszaczky

2
@TheRebel, данный сценарий использования заключается в том, что он должен отправить серверу отформатированную строку.
Уилл Стерн

28
@ Хорошо, вы совершенно правы, но, как я полагаю, как и большинство зрителей здесь, я прибыл сюда, основываясь на названии, в поисках общего преобразования даты в формате JS в UTC, поэтому я подумал, что полезно упомянуть об этом здесь :)
Оршацкий

4
Будьте осторожны при использовании этого метода! Он не создает дату в формате UTC - он форматирует существующие данные даты как есть в формате UTC и присваивает ему часовой пояс «Z». Это неправильно в 99% случаев! Вы должны преобразовать дату в часовой пояс GMT перед использованием этого метода!
user1944491

5
@ user1944491 Я не думаю, что это правильно. Согласно документам MDN, toISOStringправильно ли конвертируется в UTC. [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetТакже в примере они показывают, что смещение учитывается при вызове toISOString
FFF

560

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

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

85
Мне понравилась твоя идея и я сделал метод, который использовал много раз. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Тим

21
Самый короткий код, который я придумал, чтобы получить дату и время в формате UTC, - это отключение часового пояса:new Date(new Date().toUTCString().substr(0, 25))
joelvh

17
Обратите внимание, что getUTCMonth () возвращает значения от 0 до 11. Поэтому, если вам нужен месяц по номеру вместо строки, это помогает +1 к значению.
Талви Ватиа

19
Это нонсенс. Новая дата будет иметь другое значение, чем вы на самом деле хотите. Просто используйте now.toUTCSTring()вместо (неправильно) now_utc.toString().
Берги

22
Я бы не стал использовать это - с помощью новой функции Date () вы получите часовой пояс браузера. в Chrome 29 и IE10 дата + время кажутся правильными, но часовой пояс настроен на часовой пояс браузера, что может вызвать проблемы ...
Шон

208

Вот мой метод:

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

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


Я смотрел на эту проблему, когда понял, что это Date.now()дает местное время, а не время UTC, и это решение мне кажется самым простым. По крайней мере, в моем случае, когда мне нужно время UNIX, а не красиво отформатированная строка. (единственное отличие состояло в том, что я умножил бы 60 * 1000просто для большей ясности :))
Тимоти Буше

18
Добавление 60000 * Date.getTimezoneOffset () неверно! Во-первых, вы должны думать обо всех датах / временах как о времени UTC с модификатором часового пояса для целей отображения. Браузеры могут отличаться, однако Date.getTime () возвращает количество миллисекунд с 1970-01-01. Если вы создаете новую дату, используя этот номер, например: новая дата (Date.getTime ()); это будет UTC , однако при его отображении (например, через консоль инструментов Chrome Dev) будет отображаться ваш местный часовой пояс.
Аарон Хоффман

15
В моем браузере это создает DateTime, который не является UTC. Однако, когда отображается в моем браузере, это отображает DateTime в моем местном часовом поясе, который будет правильным временем UTC, если информация о часовом поясе игнорируется.
Аарон Хоффман

Попался, интересный момент. Давайте сравним now.toString()с utc.toString(): нет изменения часового пояса, но время изменения, которые совершенно другое дело. Однако более чистое решение было бы намного более сложным (я полагаю, что да), и этот код выполняет свою работу в подавляющем большинстве случаев, если не рассматривать дальнейшие часовые пояса. Это заставило меня напомнить о утиной штамповке : разные вещи, но они ведут себя одинаково. Также обратите внимание, что код DrunkCoder имеет ту же проблему.
Gras Double

4
Этот ответ демонстрирует другую распространенную реализацию «сдвига эпох», которая опасна в отдельности, так как она может дать сбой в крайних случаях, таких как переходы DST. Не рекомендуется.
Мэтт Джонсон-Пинт

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

Это хорошо работает. Мне просто нужно было заменить «-» в моих исходных датах на «/», чтобы создать дату JavaScript, затем я мог бы вызвать вашу функцию toISO (), чтобы получить правильный вывод.
dthrasher

это прекрасно работает Вы также можете передать результат в jQuery $ .parseDate (...), чтобы вернуть объект даты, который был смещен в UTC.
Брайан Эллис

23

Конвертировать в 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 

Скриптовая ссылка


так это что-то вроде фальсификации UTC? Я перемещаю свою локальную дату, и мне удается отправить на сервер дату и время, которые я на самом деле вижу на часах своего компьютера. Ух ты. Во всяком случае, лучше, чем стринизация и анализ
Набор инструментов

Также вам не нужен .toISOString (), вы можете просто отправить isoDate на сервер
Инструментарий

.toISOString () прост и понятен, извлечение даты из него будет дополнительным шагом (isoDate не является функцией).
RollerCosta

Вам не нужно добавлять смещение вместо его вычитания? Обратитесь к stackoverflow.com/a/11964609/832230
Acumenus

@ABB Если текущее смещение часового пояса равно + ve, то мы должны вычесть его (в нашем случае IST равно +5: 30), иначе добавить.
RollerCosta

18

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

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


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

  • Если аргументы не предоставлены, конструктор создает объект JavaScript Date для текущей даты и времени в соответствии с настройками системы.
  • Примечание. Если 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, если информация о часовом поясе игнорируется.


11
Я только что запустил этот код на Fx и Chrome, он, похоже, не работает: результат точно такой же, как и с new Date(), ни временная метка, ни часовой пояс не изменились
Gras Double

3
Это потому, что временные метки не являются часовыми поясами. new Date().getTime()всегда возвращает временную метку, которая не зависит от часового пояса. С ней не будет связана временная метка, пока вы не попробуете отформатировать ее во время, отличное от количества миллисекунд, начиная с эпохи Unix.
frontendbeauty

7
Насколько я могу судить, new Date(new Date().getTime())возвращает точно такое же значение, как new Date(). Можете ли вы объяснить, в каком смысле ваш ответ дает отличную оценку new Date()?
Кирк Уолл

Я отправляю это значение на мой сервер new Date("5/19/2014").getTime(). Конструктор Date создал дату со смещением +7. На сервере (C #) я добавляю опубликованное значение в миллисекундах в эпоху Unix new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). Результат есть 5/19/2014 7:00:00 AM. Так что, похоже, getTime () дает количество миллисекунд, включая мое смещение UTC.
xr280xr

1
Есть много комментариев, жалующихся, что new Date(new Date().getTime())не работает. Я могу подтвердить, что new Date(Date.UTC(2019, 8, 27, 0, 0, 0))действительно производит время UTC. Если вы не используете, Date.UTC(...)вы получите даты в смещении UTC в вашем часовом поясе.
Алекс Баркер

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

1
Объект даты должен быть фактически установлен на дату. Выше приведен только пример.
Джеймс Скидмор

5
Теперь он возвращает «Чт, 04 июня 2009 04:10:56 GMT», что не является форматом ISO, требуемым в OP.
Nickf

4
Это превращает его в строку, которая не является датой
Энтони

2
нет, на самом деле это должно быть строковое представление даты в соответствии с ОП.
jcomeau_ictx

3
После преобразования в UTC он возвращается в строковом формате, а затем как получить доступ к таким методам, как getMonth (), getDate () и т. Д.
Sandeep sandy

10

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

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

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

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


7

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

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

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


1
Это первый пример, который я видел, который пытается обработать смещение часового пояса, так что +1 за это. Тем не менее, я нашел несколько вещей с этим - temp.substr (-2) вызывает ошибку, потому что это число, а не строка, поэтому вам нужно сделать что-то вроде "temp = '' + temp;" во-первых, чтобы превратить его в строку. Кроме того, я предпочитаю, чтобы мои даты ISO были дополнены нулями - думаю, это делает их более стандартными.
Мик Сир

@ Мик - Я обновился, чтобы исправить эту ошибку. Я использовал, String(temp)так как другой способ ( "" + temp) сообщается как ошибка JSLint в эти дни.
Nickf

Это теперь стандартизировано как toISOStringметод
Bergi

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

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


7

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

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

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

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

new Date('date as text');

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

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.


FYI getYear удаляется из веб-стандартов developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ган

6

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

какая разница между moment(yourTime).utc()а moment.utc(yourTime)? Я обычно использую последнее.
ps0604

5

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

Мой вариант использования:

Я создаю приложение todo, в котором вы устанавливаете дату своей задачи. Эта дата должна оставаться постоянной независимо от того, в каком часовом поясе вы находитесь.

Пример. Вы хотите позвонить своему другу в 8 часов утра 25 июня.

Вы создаете это задание за 5 дней до (20 июня), пока находитесь в Китае.

Затем в тот же день вы летите в Нью-Йорк на несколько дней.

Затем, 25 июня, когда вы все еще находитесь в Нью-Йорке, вы просыпаетесь в 7:30 утра (что означает, что вы должны получить уведомление о задании в течение 30 минут (даже если это 13:30 уже в Китае, где вы были при создании задача)

Таким образом, задача - игнорировать часовой пояс. Это означает: «Я хочу сделать это в 8 часов утра в любом часовом поясе».

Что я делаю, скажем так: «Я полагаю, вы всегда в лондонском часовом поясе - UTC».

Что это означает - когда пользователь выбирает какую-либо дату в своем часовом поясе - я конвертирую эту дату в ту же дату в UTC. то есть. Вы выбираете 8 утра в Китае, но я конвертирую его в 8 утра в UTC.

Затем - в следующий раз, когда вы откроете приложение - я прочитал дату, сохраненную в UTC, и конвертировал ее в ту же дату в вашем текущем часовом поясе, например. Я конвертирую 8 часов утра в UTC в 8 часов утра в часовом поясе Нью-Йорка.

Это решение означает, что дата может означать что-то другое, в зависимости от того, где вы находитесь при ее установке и где вы ее читаете, но она остается постоянной, так что вам кажется, что вы всегда находитесь в одном и том же часовом поясе.

Давайте напишем некоторый код:

Во-первых, у нас есть две основные функции для преобразования из / в 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) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

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

9
Это не лучший ответ на ваш вопрос. Вы должны пересмотреть что-то, что прямо отвечает на ваш вопрос или задать свой вопрос по-другому.
hitautodestruct

1
Я получаю ИСПРАВЛЕНИЕ этого точного сценария (и версии), потому что этого недостаточно для IE7 и Firefox.
Барбарроса

4

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

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

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

1
То, что что-то не было обновлено, не означает, что вы не должны его использовать. Date.js отлично работал в течение многих лет, поэтому не нуждается в обновлении. Объект даты JS и используемые форматы даты не изменились за последние несколько лет, так почему бы скрипт, который ими манипулирует? Date.JS - абсолютно лучшая библиотека дат JS. В github есть несколько проблем, но в остальном он идеален. github.com/datejs/Datejs
thugsb

3

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

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



2

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

Передача только строки даты 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)

1

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

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

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

1

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


4
Даже если это может ответить на вопрос, нет объяснения вашего кода. Пожалуйста, обновите свой ответ, чтобы объяснить, что вы делаете. Спасибо!
Мирослав Гламузина


0

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

значение()


0

Так что это был способ, которым я должен был это сделать, потому что я все еще хотел, чтобы объект даты в 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 

0

пряжа добавить момент

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

Еще проще

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

2
Это неполно setTimeполагается new Date, что вы не в том числе. Пожалуйста, сделайте ответ полным.
random_user_name

этот человек еще жив? почему бы даже не вернуться к нам, рассказать что-нибудь или отредактировать ответ?
безнадежно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.