Мои объекты даты в JavaScript всегда представлены в формате UTC +2 из-за того, где я нахожусь. Следовательно, вот так
Mon Sep 28 10:00:00 UTC+0200 2009
Проблема заключается в том, чтобы JSON.stringify
преобразовать указанную выше дату в
2009-09-28T08:00:00Z (notice 2 hours missing i.e. 8 instead of 10)
Мне нужно, чтобы дата и время были соблюдены, но это не так, поэтому это должно быть
2009-09-28T10:00:00Z (this is how it should be)
В основном я использую это:
var jsonData = JSON.stringify(jsonObject);
Я попытался передать параметр replacer (второй параметр в stringify), но проблема в том, что значение уже было обработано.
Я также пробовал использовать toString()
и toUTCString()
в объекте даты, но они тоже не дают мне того, что я хочу ..
Может кто-нибудь помочь мне?
javascript
json
datetime
utc
Марк Смит
источник
источник
2009-09-28T10:00:00Z
не представляет тот же момент времени, что иMon Sep 28 10:00:00 UTC+0200 2009
. ДатаZ
в ISO 8601 означает всемирное координированное время, а 10 часов по всемирному координированному времени - это другой момент времени по сравнению с 10 часами в +0200. Одно дело - сериализовать дату с правильным часовым поясом, но вы просите нас помочь вам сериализовать ее в однозначно, объективно неверное представление .Ответы:
Недавно я столкнулся с той же проблемой. И это было решено с помощью следующего кода:
источник
JSON использует
Date.prototype.toISOString
функцию, которая не представляет местное время - она представляет время в неизмененном UTC - если вы посмотрите на вывод даты, вы увидите, что вы находитесь в UTC + 2 часа, поэтому строка JSON изменяется на два часа, но если это позволяет правильно представить одно и то же время в нескольких часовых поясах.источник
Для протокола: помните, что последняя буква «Z» в «2009-09-28T08: 00: 00Z» означает, что время действительно в формате UTC.
Подробнее см. Http://en.wikipedia.org/wiki/ISO_8601 .
источник
Вот еще один ответ (и лично я считаю, что он более уместен)
источник
date.toJSON () печатает дату в формате UTC в формате String (поэтому добавляет смещение при преобразовании в формат JSON).
источник
date.getTime()
возвращает время в миллисекундах, поэтому нам также следует преобразовать второй операнд в миллисекунды. Посколькуdate.getTimezoneOffset()
возвращается смещение в минутах, мы умножаем его на 60000, потому что 1 минута = 60000 миллисекунд. Таким образом, вычитая смещение из текущего времени, мы получаем время в формате UTC.вы можете использовать moment.js для форматирования с местным временем:
источник
Я немного опоздал, но вы всегда можете перезаписать функцию toJson в случае Date, используя Prototype, например:
В моем случае Util.getDateTimeString (this) возвращает такую строку: «2017-01-19T00: 00: 00Z»
источник
Готовое решение для принудительного
JSON.stringify
игнорирования часовых поясов:Использование библиотек момент + момент-часовой пояс:
источник
Обычно вы хотите, чтобы даты были представлены каждому пользователю в его собственное местное время -
поэтому мы используем GMT (UTC).
Используйте Date.parse (jsondatestring), чтобы получить строку местного времени,
если вы не хотите, чтобы ваше местное время показывалось каждому посетителю.
В таком случае используйте метод Анатолия.
источник
Обойти эту проблему можно с помощью
moment.js
библиотеки (версия без часового пояса).Я пользовался
flatpickr.min.js
библиотекой. Время созданного результирующего объекта JSON совпадает с предоставленным местным временем, но с указателем даты.источник
Я столкнулся с этим, немного работая с устаревшими материалами, где они работают только на восточном побережье США и не хранят даты в UTC, это все EST. Мне нужно фильтровать даты на основе ввода данных пользователем в браузере, поэтому я должен передавать дату по местному времени в формате JSON.
Просто чтобы подробнее рассказать об уже опубликованном решении - вот что я использую:
Итак, я понимаю, что это будет продолжаться и вычесть время (в миллисекундах (следовательно, 60000) из начальной даты на основе смещения часового пояса (возвращает минуты) - в ожидании добавления времени, которое будет добавлено toJSON ().
источник
Вот что-то действительно изящное и простое (по крайней мере, я так считаю :)) и не требует манипуляций с датой для клонирования или перегрузки каких-либо встроенных функций браузера, таких как toJSON (ссылка: Как JSON преобразовать дату javascript в строку и сохранить часовой пояс , любезно Шосон)
Передайте JSON.stringify функцию replacer, которая преобразует все в вашу душу !!! Таким образом, вам не придется выполнять часовые и минутные различия или любые другие манипуляции.
Я добавил console.logs, чтобы увидеть промежуточные результаты, чтобы было понятно, что происходит и как работает рекурсия. Это обнаруживает кое-что достойное внимания: параметр value для replacer уже преобразован в формат даты ISO :). Используйте этот [ключ] для работы с исходными данными.
источник
JavaScript обычно конвертирует местный часовой пояс в UTC.
источник
Все сводится к тому, является ли серверная часть вашего сервера независимой от часового пояса или нет. Если это не так, то вам нужно предположить, что часовой пояс сервера совпадает с часовым поясом клиента, или передать информацию о часовом поясе клиента и включить это также в вычисления.
пример на базе PostgreSQL:
Последний, вероятно, то, что вы хотите использовать в базе данных, если вы не желаете правильно реализовать логику часовых поясов.
источник
Вместо этого
toJSON
вы можете использовать функцию форматирования, которая всегда дает правильную дату и время +GMT
источник
Я пробовал это в angular 8:
создать модель:
в вашем компоненте
отправьте дату в ваш API для сохранения
При загрузке данных из API вы сделаете следующее:
model.YourDate = new Date(model.YourDate+"Z");
вы получите дату правильно с вашим часовым поясом.
источник