При написании веб-приложения имеет смысл хранить (на стороне сервера) все даты и время в БД как метки времени UTC.
Я был удивлен, когда заметил, что вы не можете сделать многое с точки зрения манипуляции с часовым поясом в JavaScript.
Я немного расширил объект Date. Имеет ли эта функция смысл? По сути, каждый раз, когда я отправляю что-либо на сервер, это будет отметка времени, отформатированная с помощью этой функции ...
Вы видите здесь какие-либо серьезные проблемы? Или, может быть, решение под другим углом?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
Это просто кажется мне немного запутанным. И я не так уверен в производительности.
javascript
timezone
utc
Merc
источник
источник
new Date().toString()
покажет вам текущее время часовой пояс представления,new Date().toUTCString()
покажет вам UTC времени магнезию, ноnew Date().getTime()
это всегда UTC , потому что это то , что Unix время определяются как: «Unix время (также известное как POSIX времени или время эпохи) представляет собой систему для описания мгновенья во времени, определяемом как количество секунд, прошедших с 00:00:00 по всемирному координированному времени (UTC), четверг, 1 января 1970 года, без учета високосных секунд ».Ответы:
Для дат, построенных таким образом, используется местный часовой пояс, что делает построенную дату неверной. Чтобы установить часовой пояс для определенного объекта даты, нужно построить его из строки даты, которая включает часовой пояс. (У меня были проблемы с тем, чтобы заставить это работать в более старом браузере Android.)
Обратите внимание, что
getTime()
возвращает миллисекунды, а не обычные секунды.Для метки времени UTC / Unix должно быть достаточно следующего:
Он будет учитывать текущее смещение часового пояса в результате. Для представления строки ответ Дэвида Эллиса работает.
Чтобы уточнить:
Этот вход рассматривается как местное время . Если указано время UTC , результаты будут отличаться. Заметьте (я сейчас в GMT +02: 00, а сейчас 07:50):
Также обратите внимание, что
getUTCDate()
не может быть замененоgetUTCDay()
. Это потому, чтоgetUTCDate()
возвращает день месяца ; тогда как,getUTCDay()
возвращает день недели .источник
new Date()
, что создает новую дату из вашего ввода UTC, но обрабатывает ее как локальную дату / время. 2) Да, вы должны использоватьMath.floor(this.getTime() / 1000)
в этом случае.Вы также можете сделать это, используя getTimezoneOffset и getTime,
источник
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
. Кажется,tt.getTime() - tt.getTimezoneOffset()
это правильно дляGMT+0800
.var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
которая включает в себя часовой пояс ... который побеждает цель попытки сделать это в js ..Самый простой способ получить время UTC в обычном формате заключается в следующем:
источник
Я действительно думаю, что значения Date в js намного лучше, чем, скажем, объекты C # DateTime. У объектов C # DateTime есть свойство Kind, но нет строгого базового часового пояса как такового, и преобразования часового пояса трудно отслеживать, если вы выполняете преобразование между двумя не UTC и нелокальными временами. В js все значения Date имеют базовое значение UTC, которое передается и известно независимо от выполняемых вами преобразований оффлайн или часовых поясов. Моя самая большая претензия к объекту Date заключается в количестве неопределенного поведения, которое разработчики браузера решили включить, что может спутать людей, которые атакуют даты в js методом проб и ошибок, чем чтением спецификации. Использование чего-то вроде iso8601.js решает эту проблему, определяя единственную реализацию объекта Date.
По умолчанию в спецификации сказано, что вы можете создавать даты в расширенном формате даты ISO 8601, например
Таким образом, вы можете определить точное время UTC таким образом.
Если вы хотите передать значение Date обратно на сервер, вы бы позвонили
или если вы предпочитаете работать с отметкой времени в миллисекундах (количество миллисекунд с 1 января 1970 года по Гринвичу)
ISO 8601 является стандартом. Вы не можете быть смущены тем, что означает строка даты, если вы включите смещение даты. Для вас, как для разработчика, это означает, что вам никогда не приходилось заниматься преобразованием местного времени самостоятельно . Значения местного времени существуют исключительно для удобства пользователя, а значения даты по умолчанию отображаются по местному времени. Все манипуляции с местным временем позволяют отображать что-то разумное для пользователя и преобразовывать строки из пользовательского ввода. Хорошей практикой является быстрое преобразование в UTC, а объект js Date делает это довольно тривиальным.
С другой стороны, у нас не так много возможностей для принудительного определения часового пояса или локали для клиента (о чем я знаю), что может раздражать для настроек конкретного веб-сайта, но я полагаю, причина в том, что это пользователь Конфигурация, которая не должна быть затронута.
Итак, короче говоря, причина, по которой не так много встроенной поддержки для манипуляций с часовыми поясами, заключается в том, что вы просто не хотите этим заниматься.
источник
Как правило, вам не нужно делать много «манипуляции с часовым поясом» на стороне клиента. Как правило, я стараюсь хранить и работать с датами UTC в виде
ticks
или « количество миллисекунд с полуночи 1 января 1970 года ». Это действительно упрощает хранение, сортировку, расчет смещений и, самое главное, избавляет вас от головной боли от настроек «Летнего времени». Вот небольшой код JavaScript, который я использую.Чтобы узнать текущее время UTC:
Тогда вам обычно нужно отформатировать дату / время для конечного пользователя в соответствии с его местным часовым поясом и форматом. Следующее заботится обо всех сложностях форматов даты и времени на клиентском компьютере:
Итак, следующий пример:
Возвращает следующее (для моего английского языка в США):
источник
getTimezoneOffset
значение в вашуgetCurrentTimeUTC
функцию, вы фактически возвращаете другой момент времени. РезультатомgetTime
является уже в UTC.tmLoc.getTime()
является смещение относительно местного времени. Это легко проверить, если у вас есть доступ ко всему, что работает с JavaScript.getTime
, что указывает на «значение времени», определенное в п. 15.9.5 , котороеPrimitiveValue
установлено в явном виде в п. 15.9.3.3 как UTC.tmLoc
черезnew Date()
, то это то же самое. Часовой пояс повлияет на вывод строкиtmLoc.toString()
и аналогичных элементов, но не повлияет.tmLoc.getTime()
Это всегда всего несколько миллисекунд с полуночи 1970-01-01 в UTC.//The offset is in minutes -- convert it to ms
Я думаю, что это лучшее решение
источник
Если вы хотите один вкладыш , UTC Unix Timestamp может быть создан в JavaScript как:
Это будет учитывать часовой пояс системы. Это в основном время, прошедшее в секундах с начала эпохи.
Как это устроено:
new Date()
.unary +
перед созданием объекта для преобразования вtimestamp integer
. :+new Date()
.+new Date() / 1000
~~(+new Date())
источник
tilde
неtilda
(так). К сожалению, это не позволит мне удалить опечатку, я должен сделать как минимум 6 правок символов. Гладкий, Stackexchange, гладкийЯ хочу пояснить, что new Date (). GetTime () на самом деле возвращает значение UTC, так что это действительно полезный способ хранения и управления датами, который не зависит от локализованного времени.
Другими словами, не беспокойтесь обо всех функциях JavaScript UTC. Вместо этого просто используйте Date.getTime ().
Больше информации об объяснении здесь: Если javascript "(new Date ()). GetTime ()" запускается из 2 разных часовых поясов.
источник
Я использую следующее:
После определения этого метода вы можете сделать:
источник
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
возвращает смещение UTC, вычитая смещение локального часового пояса, делает его локальным, а не UTC, поэтому getUTCTime возвращает локальное смещение, а не UTC.Я поражен тем, насколько сложным стал этот вопрос.
Все они идентичны, и все их целочисленные значения === время EPOCH: D
Не верьте мне, оформить заказ: http://www.epochconverter.com/
источник
Так как
new Date().toUTCString()
возвращает строку, подобную той, которую"Wed, 11 Oct 2017 09:24:41 GMT"
вы можете разделить на 3 последних символа, и передайте нарезанную строкуnew Date()
:источник
РЕДАКТИРОВАТЬ: код ниже не работает. Я всегда предполагал, что new Date (). GetTime () вернул количество секунд с 1 января 1970 г. В ТЕКУЩЕЙ ВРЕМЕННОЙ ЗОНЕ. Это не так: getTime () возвращает количество секунд в UTC. Итак, приведенный ниже код делает грубую перестройку. Спасибо всем!]
Прежде всего, спасибо за ваши фантастические идеи. Я думаю, у моего вопроса был неправильный заголовок ... это должно было быть "Получить UTC Unix Timestamp для существующей даты".
Итак, если у меня есть объект даты:
Я был после функции, которая сообщала бы мне «UTC Unix Timestamp».
Эта функция кажется настоящей уловкой:
Обратите внимание, что это работает на «это» Это означает, что я могу сделать:
И получите количество секунд с 1 января 1970 года во времени Unix. Правильно?
Для меня немного безумно, что Javascript хранит все во время UTC, но затем, чтобы получить это число, мне нужно создать новый объект Date, передавая отдельные получатели UTC, а затем, наконец, вызвать getTime () для этого ...
Merc.
источник
getUTCUnixTime
получает неправильное время, а JavaScript действительно предоставляет простой способ получить метку времени Unix отDate
объекта - используяgetTime
метод. Посмотреть все остальные ответы.Я думаю, это то, что вы ожидаете ...
Сейчас,
источник
Как только вы это сделаете
Это уже время UTC
Я тестировал на https://www.unixtimestamp.com/index.php
источник
Использование day.js
В браузере:
В node.js:
Вы получите UTC Unix Timestamp без миллисекунд.
источник
Это вернет метку времени в UTC:
источник
new Date(new Date().toUTCString())
дает ср. 04 октября 2017 г. 07:20:14 GMT + 0200 (GMT + 02: 00)