Предположим, что пользователь вашего сайта вводит диапазон дат.
2009-1-1 to 2009-1-3
Вам необходимо отправить эту дату на сервер для некоторой обработки, но сервер ожидает, что все даты и время будут в UTC.
Теперь предположим, что пользователь находится на Аляске, Гавайях или Фиджи. Так как они находятся в часовом поясе, весьма отличном от UTC, диапазон дат необходимо преобразовать во что-то вроде этого:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Используя объект Date в JavaScript, как бы вы преобразовали первый «локализованный» диапазон дат в то, что сервер поймет?
javascript
date
utc
dthrasher
источник
источник
Ответы:
Источник: MDN веб-документы
Необходимый формат создается
.toISOString()
методом. Для более старых браузеров (т.е. 8 и ниже), которые изначально не поддерживают этот метод, шим можно найти здесь :Это даст вам возможность делать то, что вам нужно:
Для работы с часовым поясом , zone.js и moment.js являются действительно бесценными инструментами ... особенно для навигации по часовым поясам между клиентом и сервером javascript.
источник
toISOString
правильно ли конвертируется в UTC.[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset
Также в примере они показывают, что смещение учитывается при вызове toISOStringПросто и глупо
источник
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
new Date(new Date().toUTCString().substr(0, 25))
now.toUTCSTring()
вместо (неправильно)now_utc.toString()
.Вот мой метод:
Результирующий
utc
объект на самом деле не является датой UTC, но локальная дата смещена в соответствии с временем UTC (см. Комментарии). Однако на практике это делает работу.источник
Date.now()
дает местное время, а не время UTC, и это решение мне кажется самым простым. По крайней мере, в моем случае, когда мне нужно время UNIX, а не красиво отформатированная строка. (единственное отличие состояло в том, что я умножил бы60 * 1000
просто для большей ясности :))now.toString()
сutc.toString()
: нет изменения часового пояса, но время изменения, которые совершенно другое дело. Однако более чистое решение было бы намного более сложным (я полагаю, что да), и этот код выполняет свою работу в подавляющем большинстве случаев, если не рассматривать дальнейшие часовые пояса. Это заставило меня напомнить о утиной штамповке : разные вещи, но они ведут себя одинаково. Также обратите внимание, что код DrunkCoder имеет ту же проблему.источник
Конвертировать в ISO без изменения даты / времени
Конвертировать в ISO с изменением даты / времени (дата / время будут изменены)
Скриптовая ссылка
источник
Браузеры могут отличаться, и вы также должны помнить, что не следует доверять какой-либо информации, сгенерированной клиентом, поскольку, как говорится, нижеприведенное утверждение работает для меня (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Добавление 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, если информация о часовом поясе игнорируется.
источник
new Date()
, ни временная метка, ни часовой пояс не изменилисьnew Date().getTime()
всегда возвращает временную метку, которая не зависит от часового пояса. С ней не будет связана временная метка, пока вы не попробуете отформатировать ее во время, отличное от количества миллисекунд, начиная с эпохи Unix.new Date(new Date().getTime())
возвращает точно такое же значение, какnew Date()
. Можете ли вы объяснить, в каком смысле ваш ответ дает отличную оценкуnew Date()
?new Date("5/19/2014").getTime()
. Конструктор Date создал дату со смещением +7. На сервере (C #) я добавляю опубликованное значение в миллисекундах в эпоху Unixnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
. Результат есть5/19/2014 7:00:00 AM
. Так что, похоже, getTime () дает количество миллисекунд, включая мое смещение UTC.new Date(new Date().getTime())
не работает. Я могу подтвердить, чтоnew Date(Date.UTC(2019, 8, 27, 0, 0, 0))
действительно производит время UTC. Если вы не используете,Date.UTC(...)
вы получите даты в смещении UTC в вашем часовом поясе.источник
Другое решение для преобразования в UTC и сохранения его как объекта даты: (Он работает, удаляя часть 'GMT' из конца отформатированной строки, а затем возвращая ее обратно в конструктор Date)
Мне нужно было сделать это для взаимодействия с библиотекой выбора даты и времени. Но в целом работать с датами в таком случае - плохая идея.
Пользователи обычно хотят работать с датами и временем по местному времени, поэтому вы либо обновляете код на стороне сервера, чтобы правильно анализировать строки даты и времени со смещениями, затем конвертируете в UTC (лучший вариант) или конвертируете в строку UTC на стороне клиента перед отправкой в сервер (как в ответе Уилла Стерна)
источник
Вы пытаетесь преобразовать дату в такую строку?
Я бы сделать функцию, чтобы сделать это, и, хотя это немного спорно, добавить его к дате прототипа. Если вам неудобно делать это, то вы можете поместить это как отдельную функцию, передавая дату в качестве параметра.
Если вам это нужно во время UTC, просто замените все функции get * на getUTC *, например: getUTCFullYear, getUTCMonth, getUTCHours ..., а затем просто добавьте «+00: 00» в конце вместо смещения часового пояса пользователя.
источник
String(temp)
так как другой способ ("" + temp
) сообщается как ошибка JSLint в эти дни.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
Никогда не делайте ничего подобного:
После того как ваша дата будет проанализирована в отдельных полях из пользовательского ввода, создайте объект даты. Как только объект даты создан, преобразуйте его в UTC, добавив смещение часового пояса. Я не могу не подчеркнуть, насколько важно использовать смещение от объекта даты из-за перехода на летнее время (это еще одно обсуждение, чтобы показать, почему).
Теперь вы можете передать дату на сервер по UTC времени. Опять же, я бы настоятельно рекомендовал не использовать любые строки даты. Либо передайте его на сервер с минимальной степенью детализации, необходимой вам, например, год, месяц, день, минута, либо в виде значения, например, в миллисекундах, начиная с эпохи Unix.
источник
Если вы много имеете дело с датами, стоит использовать moment.js ( http://momentjs.com ). Метод для преобразования в UTC будет:
Вы можете использовать формат для изменения даты на любой другой формат:
Также есть опции смещения, но есть дополнительная дополнительная библиотека для работы с часовым поясом ( http://momentjs.com/timezone/ ). Преобразование времени будет так просто:
источник
moment(yourTime).utc()
аmoment.utc(yourTime)
? Я обычно использую последнее.Мое решение сохраняет дату неизменной независимо от того, какой часовой пояс установлен на стороне клиента. Может быть, кто-то найдет это полезным.
Мой вариант использования:
Я создаю приложение todo, в котором вы устанавливаете дату своей задачи. Эта дата должна оставаться постоянной независимо от того, в каком часовом поясе вы находитесь.
Пример. Вы хотите позвонить своему другу в 8 часов утра 25 июня.
Вы создаете это задание за 5 дней до (20 июня), пока находитесь в Китае.
Затем в тот же день вы летите в Нью-Йорк на несколько дней.
Затем, 25 июня, когда вы все еще находитесь в Нью-Йорке, вы просыпаетесь в 7:30 утра (что означает, что вы должны получить уведомление о задании в течение 30 минут (даже если это 13:30 уже в Китае, где вы были при создании задача)
Таким образом, задача - игнорировать часовой пояс. Это означает: «Я хочу сделать это в 8 часов утра в любом часовом поясе».
Что я делаю, скажем так: «Я полагаю, вы всегда в лондонском часовом поясе - UTC».
Что это означает - когда пользователь выбирает какую-либо дату в своем часовом поясе - я конвертирую эту дату в ту же дату в UTC. то есть. Вы выбираете 8 утра в Китае, но я конвертирую его в 8 утра в UTC.
Затем - в следующий раз, когда вы откроете приложение - я прочитал дату, сохраненную в UTC, и конвертировал ее в ту же дату в вашем текущем часовом поясе, например. Я конвертирую 8 часов утра в UTC в 8 часов утра в часовом поясе Нью-Йорка.
Это решение означает, что дата может означать что-то другое, в зависимости от того, где вы находитесь при ее установке и где вы ее читаете, но она остается постоянной, так что вам кажется, что вы всегда находитесь в одном и том же часовом поясе.
Давайте напишем некоторый код:
Во-первых, у нас есть две основные функции для преобразования из / в UTC, игнорируя часовой пояс:
Затем я сохраняю / читаю эту дату как:
источник
Я только что обнаружил, что версия date.format.js Стивена Левитана 1.2.3 делает именно то, что я хочу. Это позволяет вам предоставить строку формата для даты JavaScript и конвертировать из местного времени в UTC. Вот код, который я сейчас использую:
источник
Я нашел, что анализ даты плагинов глобализации jQuery работает лучше всего. Другие методы имели проблемы с кроссбраузерностью, и такие вещи, как date.js, давно не обновлялись.
Вам также не нужен DatePicker на странице. Вы можете просто вызвать что-то похожее на пример, приведенный в документации:
источник
Эта функция прекрасно работает для меня.
источник
Использование UTC метода moment.js ;
источник
Это даст вам правильную дату и время UTC.
Это потому, что
getTimezoneOffset()
даст вам разницу часовых поясов в минутах. Я рекомендую вам не использовать,toISOString()
потому что вывод будет в строке. Следовательно, в будущем вы не сможете манипулировать датой.источник
Это то, что я сделал в прошлом:
источник
Если вам нужен объект Date
Передача только строки даты Date предполагает, что время сдвигается на 00:00 по часовому поясу:
Если вы добавите текущие часы и минуты, вы получите правильную дату:
источник
Глядя на ваш вопрос, становится ясно, что вы просто хотите отправить диапазон дат в свой бэкэнд для дальнейшей постобработки.
Я предполагаю, что вы соответствуете стандартным рекомендациям по данным, которые предполагают, что данные будут в определенном формате. Например, я использую ODATA, который представляет собой RESTfull API, который ожидает, что объекты даты и времени будут в формате: -
Это может быть легко достигнуто с помощью фрагмента, размещенного ниже (пожалуйста, измените формат согласно вашему требованию).
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/ где я получил мой вдохновение.
Надеюсь это поможет!
источник
Этот метод даст вам:
2017-08-04T11:15:00.000+04:30
и вы можете игнорировать переменную зоны, чтобы просто получить2017-08-04T11:15:00.000
.источник
Используя пакет момента, вы можете легко преобразовать строку даты UTC в новый объект Date:
Это особенно помогает, когда ваш сервер не поддерживает часовой пояс, и вы хотите всегда сохранять дату UTC на сервере и возвращать ее как новый объект Date. Выше код работал для моего требования аналогичной проблемы, что этот поток для. Поделиться здесь, чтобы помочь другим. Я не вижу точно вышеуказанного решения ни в одном ответе. Спасибо.
источник
константное событие = новая дата ();
console.log (event.toUTCString ());
источник
Я знаю, что этот вопрос старый, но рассматривал эту же проблему, и одним из вариантов будет отправка date.valueOf () на сервер. Функция valueOf () javascript Date отправляет количество миллисекунд с полуночи 1 января 1970 года UTC.
значение()
источник
Так что это был способ, которым я должен был это сделать, потому что я все еще хотел, чтобы объект даты в JavaScript манипулировал как дата, и, к сожалению, многие из этих ответов требуют от вас перехода к строке.
источник
пряжа добавить момент
источник
Еще проще
источник
setTime
полагаетсяnew Date
, что вы не в том числе. Пожалуйста, сделайте ответ полным.