Отображение даты / времени в формате локали пользователя и смещения времени - PullRequest
151 голосов
/ 17 сентября 2008

Я хочу, чтобы сервер всегда отображал даты в формате UTC в формате HTML, а JavaScript-код на клиентском сайте преобразовывал его в местный часовой пояс пользователя.

Бонус, если я могу вывести в формате даты локали пользователя.

Ответы [ 15 ]

152 голосов
/ 17 сентября 2008

Кажется, что самый надежный способ начать с даты 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

Некоторые ссылки:

65 голосов
/ 26 мая 2014

Для новых проектов просто используйте moment.js

Этот вопрос довольно старый, поэтому moment.js в то время не существовало, но для новых проектов это значительно упрощает такие задачи.

Лучше проанализировать вашу строку даты из UTC следующим образом (создайте на сервере совместимую строку ISO-8601 , чтобы получить согласованные результаты во всех браузерах):

var m = moment("2013-02-08T09:30:26Z");

Теперь просто используйте m в своем приложении, moment.js по умолчанию использует местный часовой пояс для операций отображения. Есть множество способов отформатировать значения даты и времени или извлечь их часть.

Вы даже можете отформатировать моментальный объект в локали пользователя следующим образом:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

Чтобы преобразовать объект moment.js в другой часовой пояс (т. Е. Ни в локальный, ни в UTC), вам потребуется расширение moment.js для часового пояса . На этой странице также есть несколько примеров, она довольно проста в использовании.

20 голосов
/ 17 сентября 2008

Вы можете использовать new Date().getTimezoneOffset()/60 для часового пояса. Существует также метод toLocaleString() для отображения даты с использованием локали пользователя.

Вот весь список: Работа с датами

7 голосов
/ 14 мая 2010

После того, как вы построили объект даты, вот фрагмент для преобразования:

Функция принимает отформатированный в формате UTC объект Date и строку формата.
Вам понадобится прототип Date.strftime.

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}
5 голосов
/ 17 сентября 2008

Вот что я использовал в прошлых проектах:

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');
4 голосов
/ 09 мая 2017

В JS нет простых и кроссплатформенных способов форматирования локального времени даты, кроме преобразования каждого свойства, как упомянуто выше.

Вот быстрый взлом, который я использую, чтобы получить локальный YYYY-MM-DD. Обратите внимание, что это взлом, так как конечная дата не будет иметь правильный часовой пояс (поэтому вы должны игнорировать часовой пояс). Если мне нужно что-то еще, я использую moment.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.

3 голосов
/ 06 декабря 2016

Я до сих пор смешиваю ответы и добавляю их, потому что мне пришлось прочитать все из них и некоторое время дополнительно исследовать, чтобы отобразить строку даты и времени из db в формате локального часового пояса пользователя.

Строка даты и времени поступает из базы данных Python / Django в формате: 2016-12-05T15: 12: 24.215Z

Надежное определение языка браузера в 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 /, а затем взять первый язык в списке только с помощью замены и регулярного выражения

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

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

3 голосов
/ 25 сентября 2015

С датой из кода 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');
3 голосов
/ 17 сентября 2008

Метод .getTimezoneOffset() сообщает о смещении часового пояса в минутах, считая "запад" из часового пояса GMT / UTC, что приводит к значению смещения, которое отрицательно по отношению к тому, к которому обычно привыкли. (Например, время в Нью-Йорке будет составлять +240 минут или +4 часа)

Чтобы получить нормальное смещение часового пояса в часах, вам нужно использовать:

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

Важная деталь:
Обратите внимание, что переход на летнее время учитывается в результате - поэтому этот метод дает вам смещение time , а не фактическое географическое смещение time-zone .

2 голосов
/ 17 сентября 2013

Лучшее решение, с которым я столкнулся, - это создание тегов [time display = "llll" datetime = "UTC TIME" /] и использование javascript (jquery) для анализа и отображения его относительно времени пользователя.

http://momentjs.com/ Момент.js

будет хорошо отображать время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...