14 ответов:
кажется, самый надежный способ начать с даты UTC-создать новый
Dateобъект и использоватьsetUTC…методы, чтобы установить его на дату / время, которое вы хотите.затем различные
toLocale…Stringметоды обеспечат локализованный выход.пример:
// This would come from the server. // Also, this whole block could probably be made into an mktime function. // All very bare here for quick grasping. d = new Date(); d.setUTCFullYear(2004); d.setUTCMonth(1); d.setUTCDate(29); d.setUTCHours(2); d.setUTCMinutes(45); d.setUTCSeconds(26); console.log(d); // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT) console.log(d.toLocaleString()); // -> Sat Feb 28 23:45:26 2004 console.log(d.toLocaleDateString()); // -> 02/28/2004 console.log(d.toLocaleTimeString()); // -> 23:45:26некоторые ссылки:
для новых проектов, просто использовать момент.js
этот вопрос довольно старый, поэтому момент.js в то время не существовало, но для новых проектов это значительно упрощает такие задачи.
лучше парсить ваша строка даты из UTC следующим образом (создайте ISO-8601 совместимая строка на сервере для получения согласованных результатов во всех браузерах):
var m = moment("2013-02-08T09:30:26Z");теперь просто использовать
mв вашей заявление, момент.JS по умолчанию использует локальный часовой пояс для операций отображения. Есть многие способы форматирования значений даты и времени или извлечь его части.вы даже можете отформатировать объект moment в пользовательской локали следующим образом:
m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-usчтобы изменить момент.объект js в другой часовой пояс (т. е. ни локальный, ни UTC), вам понадобится момент.расширение часового пояса js. На этой странице также есть несколько примеров, это довольно простой в применении.
можно использовать
new Date().getTimezoneOffset()/60для часового пояса. Существует такжеtoLocaleString()метод отображения даты с использованием языкового стандарта пользователя.вот весь список: работа с датами
вот, что я использовал в прошлых проектах:
var myDate = new Date(); var tzo = (myDate.getTimezoneOffset()/60)*(-1); //get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss'); myDate.setHours(myDate.getHours() + tzo); //here you would have to get a handle to your span / div to set. again, I'm using MS Ajax's $get var dateSpn = $get('dataDate'); dateSpn.innerHTML = myDate.localeFormat('F');
после того, как вы построили свой объект даты, вот фрагмент для преобразования:
функция принимает объект даты в формате UTC и строку формата.
Вам понадобитсяDate.strftimeпрототип.function UTCToLocalTimeString(d, format) { if (timeOffsetInHours == null) { timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1); } d.setHours(d.getHours() + timeOffsetInHours); return d.strftime(format); }
The
.getTimezoneOffset()метод сообщает смещение часового пояса в минутах, считая "на запад" от часового пояса GMT/UTC, что приводит к значению смещения, которое отрицательно к тому, к чему обычно привыкли. (Например, Нью-Йоркское время будет сообщено +240 минут или +4 часа)чтобы получить нормальное смещение часового пояса в часах, вам нужно использовать:
var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60важная деталь:
Обратите внимание, что летнее время учитывается в результате-так что этот метод дает вам действительно времени смещение-не фактическое географическое часовой пояс смещение.
С датой из PHP кода я использовал что-то вроде этого..
function getLocalDate(php_date) { var dt = new Date(php_date); var minutes = dt.getTimezoneOffset(); dt = new Date(dt.getTime() + minutes*60000); return dt; }мы можем назвать это
var localdateObj = getLocalDate('2015-09-25T02:57:46');
Я смешиваю ответы до сих пор и добавить к нему, потому что я должен был прочитать все из них и исследовать дополнительно на некоторое время, чтобы отобразить строку даты и времени из БД в формате локального часового пояса пользователя.
строка datetime поступает из БД python / django в формате: 2016-12-05T15:12: 24.215 Z
надежное определение языка браузера в JavaScript не работает во всех браузерах (см. JavaScript для определения предпочтений языка браузера), так что я получить язык браузера с сервера.
Python / Django: отправить запрос язык браузера в качестве параметра контекста:
language = request.META.get('HTTP_ACCEPT_LANGUAGE') return render(request, 'cssexy/index.html', { "language": language })HTML: напишите его в скрытом вводе:
<input type="hidden" id="browserlanguage" value={{ language }}/>JavaScript: получить значение скрытого ввода, например en-GB, en-US;q=0.8, en; q=0.6/ а затем взять первый язык в списке только через replace и регулярное выражение
const browserlanguage = document.getElementById("browserlanguage").value; var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "");JavaScript: конвертировать в datetime и форматировать его:
var options = { hour: "2-digit", minute: "2-digit" }; var dt = (new Date(str)).toLocaleDateString(defaultlang, options);посмотреть: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString
результат (язык браузера en-gb): 05/12/2016, 14:58
лучшее решение, с которым я столкнулся, - это создать Теги [time display="llll" datetime="UTC TIME" /] и использовать javascript (jquery) для анализа и отображения его относительно времени пользователя.
http://momentjs.com/ момент.js
будет отображать время красиво.
вы можете использовать следующее, которое сообщает смещение часового пояса от GMT в минутах:
new Date().getTimezoneOffset();Примечание. : - эта функция возвращает отрицательное число.
в JS нет простых и кросс-платформенных способов форматирования локального времени даты, кроме преобразования каждого свойства, Как упоминалось выше.
вот быстрый Хак я использую, чтобы получить локальный гггг-ММ-ДД. Обратите внимание, что это хак, так как конечная дата больше не будет иметь правильного часового пояса (поэтому вы должны игнорировать часовой пояс). Если мне нужно что-то еще, я использую момент.js.
var d = new Date(); d = new Date(d.getTime() - d.getTimezoneOffset() * 60000) var yyyymmdd = t.toISOString().slice(0,0); // 2017-05-09T08:24:26.581Z (but this is not UTC)d. getTimezoneOffset () возвращает смещение часового пояса в минутах, а d. getTime () находится в МС, следовательно, x 60,000.
getTimeZoneOffset () и toLocaleString хороши для основной работы с датой, но если вам нужна поддержка реального часового пояса, посмотрите на часовой пояс mde.js.
есть еще несколько вариантов, обсуждаемых в ответе на этот вопрос
для преобразования даты в локальную дату используйте метод toLocaleDateString ().
var date = (new Date(str)).toLocaleDateString(defaultlang, options);для преобразования времени в местное время используйте метод toLocaleTimeString ().
var time = (new Date(str)).toLocaleTimeString(defaultlang, options);
Не знаю, как сделать locale, но javascript-это технология на стороне клиента.
usersLocalTime = new Date();будет иметь время и дату клиента в нем (как сообщается в их браузере, и по расширению компьютера, на котором они сидят). Это должно быть тривиально, чтобы включить время сервера в ответ и сделать некоторую простую математику, чтобы угадать-timate смещение.
Comments