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

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

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

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);
}

на .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 () находится в ms, следовательно, 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 offset.