Преобразовать UTC дата время местные дата и время
С сервера я получаю переменную datetime в таком формате: 6/29/2011 4:52:48 PM
и это в UTC времени. Я хочу преобразовать его в текущее время браузера пользователя с помощью JavaScript.
Как это можно сделать с помощью JavaScript или jQuery?
23 ответа:
добавьте ' UTC ' к строке перед преобразованием ее в дату в javascript:
var date = new Date('6/29/2011 4:52:48 PM UTC'); date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Это универсальное решение:
function convertUTCDateToLocalDate(date) { var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000); var offset = date.getTimezoneOffset() / 60; var hours = date.getHours(); newDate.setHours(hours - offset); return newDate; }
использование:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
отображение даты на основе локальной настройки клиента:
date.toLocaleString();
на мой взгляд серверы должны всегда в общем случае возвращать дату и время в стандартизированный ISO 8601-формат.
подробнее здесь:
в этом случае сервер вернет
'2011-06-29T16:52:48.000Z'
который будет подаваться непосредственно в объект даты JS.var utcDate = '2011-06-29T16:52:48.000Z'; // ISO-8601 formatted date returned from server var localDate = new Date(utcDate);
The
localDate
будет в нужное местное время, которое в моем случае будет через два часа (время DK).вы действительно не нужно делать весь этот разбор, который просто усложняет вещи, пока вы согласуетесь с тем, какой формат ожидать от сервера.
вы должны получить (UTC) смещение (в минутах) клиента:
var offset = new Date().getTimezoneOffset();
а затем сделайте соответствующее добавление или вычитание времени, которое вы получаете от сервера.
надеюсь, что это помогает.
положите эту функцию в голову:
<script type="text/javascript"> function localize(t) { var d=new Date(t+" UTC"); document.write(d.toString()); } </script>
затем создайте следующее Для каждой даты в теле вашей страницы:
<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>
чтобы удалить GMT и часовой пояс, измените следующую строку:
document.write(d.toString().replace(/GMT.*/g,""));
используйте это для преобразования UTC и местного времени и наоборот.
//Covert datetime by GMT offset //If toUTC is true then return UTC time other wise return local time function convertLocalDateToUTCDate(date, toUTC) { date = new Date(date); //Local time converted to UTC console.log("Time: " + date); var localOffset = date.getTimezoneOffset() * 60000; var localTime = date.getTime(); if (toUTC) { date = localTime + localOffset; } else { date = localTime - localOffset; } date = new Date(date); console.log("Converted time: " + date); return date; }
после попытки несколько других размещены здесь без хороших результатов, это, казалось, работает для меня:
convertUTCDateToLocalDate: function (date) { return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); }
и это работает, чтобы пойти в обратном направлении, от локальной даты до UTC:
convertLocalDatetoUTCDate: function(date){ return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
для меня выше решения не работают.
С IE преобразование даты и времени UTC в локальное немного сложно. Для меня дата-время от веб-API
'2018-02-15T05:37:26.007'
и я хотел конвертировать в соответствии с местным часовым поясом, поэтому я использовал ниже код в JavaScript.var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
ответ Мэтта отсутствует тот факт, что летнее время может отличаться между датой() и временем даты, которое ему нужно преобразовать-вот мое решение:
function ConvertUTCTimeToLocalTime(UTCDateString) { var convertdLocalTime = new Date(UTCDateString); var hourOffset = convertdLocalTime.getTimezoneOffset() / 60; convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); return convertdLocalTime; }
и результаты в отладчике:
UTCDateString: "2014-02-26T00:00:00" convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)
в случае, если вы не возражаете против использования
moment.js
и Ваше время в UTC просто использовать следующее:moment.utc('6/29/2011 4:52:48 PM').toDate();
если ваше время не в utc, но любой другой язык, известный вам, то используйте следующее:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();
если ваше время уже в локальном, то используйте следующее:
moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');
это упрощенное решение, основанное на ответе Adorjan Princs:
function convertUTCDateToLocalDate(date) { var newDate = new Date(date); newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset()); return newDate; }
использование:
var date = convertUTCDateToLocalDate(new Date(date_string_you_received));
это работает для меня:
function convertUTCDateToLocalDate(date) { var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000); return newDate; }
мне самым простым показалось использование
datetime.setUTCHours(datetime.getHours()); datetime.setUTCMinutes(datetime.getMinutes());
(Я думал, что первая строка может быть достаточно, но есть часовые пояса, которые не в долях часа)
используя :
var date = new Date('2011-06-29T16:52:48+00:00'); date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
для преобразования из
YYYY-MM-DD hh:mm:ss
формат, убедитесь, что ваша дата следовать формат ISO 8601.Year: YYYY (eg 1997) Year and month: YYYY-MM (eg 1997-07) Complete date: YYYY-MM-DD (eg 1997-07-16) Complete date plus hours and minutes: YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00) Complete date plus hours, minutes and seconds: YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00) Complete date plus hours, minutes, seconds and a decimal fraction of a second YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where: YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) (am/pm NOT allowed) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) s = one or more digits representing a decimal fraction of a second TZD = time zone designator (Z or +hh:mm or -hh:mm)
важные вещи, чтобы отметить
- вы должны отделить дату и время с помощью
T
пробел не будет работать в некоторых браузерах- вы должны установить часовой пояс, используя этот формат
+hh:mm
, используя строку для часового пояса (ex. : 'UTC') не будет работать во многих броузеры.+hh:mm
представляют смещение от часового пояса UTC.
строка даты JSON (сериализованная в C#) выглядит как "2015-10-13T18:58:17".
в угловой, (после Hulvej) сделать
localdate
фильтр:myFilters.filter('localdate', function () { return function(input) { var date = new Date(input + '.000Z'); return date; }; })
затем, отображение местного времени, как:
{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}
добавить часовой пояс в конце, в этом случае 'UTC':
theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));
после этого, используйте toLocale()* семейства функций для отображения даты в правильном языковом стандарте
theDate.toLocaleString(); // "6/29/2011, 9:52:48 AM" theDate.toLocaleTimeString(); // "9:52:48 AM" theDate.toLocaleDateString(); // "6/29/2011"
Я отвечаю на это, если кому-то нужна функция, которая отображает преобразованное время в определенный элемент id и применяет строку формата даты yyyy-mm-dd здесь date1-это строка, а ID-идентификатор элемента, который будет отображаться в это время.
function convertUTCDateToLocalDate(date1, ids) { var newDate = new Date(); var ary = date1.split(" "); var ary2 = ary[0].split("-"); var ary1 = ary[1].split(":"); var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); newDate.setUTCHours(parseInt(ary1[0])); newDate.setUTCMinutes(ary1[1]); newDate.setUTCSeconds(ary1[2]); newDate.setUTCFullYear(ary2[0]); newDate.setUTCMonth(ary2[1]); newDate.setUTCDate(ary2[2]); ids = document.getElementById(ids); ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds(); }
Я знаю, что ответ уже принят, но я получаю здесь причину google, и я решил получить вдохновение от принятого ответа, поэтому я хотел просто поделиться им, если кому-то нужно.
основываясь на ответе @digitalbath, вот небольшая функция для захвата метки времени UTC и отображения местного времени в данном элементе DOM (используя jQuery для этой последней части):
https://jsfiddle.net/moriz/6ktb4sv8/1/
<div id="eventTimestamp" class="timeStamp"> </div> <script type="text/javascript"> // Convert UTC timestamp to local time and display in specified DOM element function convertAndDisplayUTCtime(date,hour,minutes,elementID) { var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC'); eventDate.toString(); $('#'+elementID).html(eventDate); } convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp'); </script>
@Adorojan's
ответ почти правильный. Но добавление смещения не является правильным, так как значение смещения будет отрицательным, если дата браузера опережает GMT и наоборот. Ниже приведено решение, с которым я пришел и отлично работает для меня:// Input time in UTC var inputInUtc = "6/29/2011 4:52:48"; var dateInUtc = new Date(Date.parse(inputInUtc+" UTC")); //Print date in UTC time document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>"); var dateInLocalTz = convertUtcToLocalTz(dateInUtc); //Print date in local time document.write("Date in Local : " + dateInLocalTz.toISOString()); function convertUtcToLocalTz(dateInUtc) { //Convert to local timezone return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000); }
можно использовать momentjs,
moment(date).format()
всегда будет давать результат в локальная дата.бонус можно отформатировать в любом случае вы хотите. Например.
moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm moment().format('dddd'); // Friday moment().format("MMM Do YY");
для более подробной информации вы можете обратиться момент с JS сайт
Я написал хороший маленький скрипт, который берет эпоху UTC и преобразует ее в системный часовой пояс клиента и возвращает его в формате d/m/Y H:i:s (например, функция даты PHP):
getTimezoneDate = function ( e ) { function p(s) { return (s < 10) ? '0' + s : s; } var t = new Date(0); t.setUTCSeconds(e); var d = p(t.getDate()), m = p(t.getMonth()+1), Y = p(t.getFullYear()), H = p(t.getHours()), i = p(t.getMinutes()), s = p(t.getSeconds()); d = [d, m, Y].join('/') + ' ' + [H, i, s].join(':'); return d; };
function getUTC(str) { var arr = str.split(/[- :]/); var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]); utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000) return utc; }
для других, кто посещает-используйте эту функцию, чтобы получить локальный объект даты из строки UTC, должен заботиться о DST и будет работать на IE, IPhone и т. д.
мы разделяем строку (так как разбор даты JS не поддерживается в некоторых браузерах) Мы получаем разницу от UTC и вычитаем ее из времени UTC, которое дает нам местное время. Поскольку возвращаемое смещение вычисляется с помощью DST (исправьте меня, если я ошибаюсь), поэтому он установит это время обратно в переменной "utc". Наконец-то вернуть дату объект.
в Angular я использовал ответ Бена таким образом:
$scope.convert = function (thedate) { var tempstr = thedate.toString(); var newstr = tempstr.toString().replace(/GMT.*/g, ""); newstr = newstr + " UTC"; return new Date(newstr); };
Edit: Angular 1.3.0 добавлена поддержка UTC для фильтра даты, я еще не использовал его, но это должно быть проще, вот формат:
{{ date_expression | date : format : timezone}}