С сервера я получаю переменную datetime в этом формате: 6/29/2011 4:52:48 PM
и это время в формате UTC. Я хочу преобразовать его в время браузера текущего пользователя, используя JavaScript.
Как это можно сделать с помощью JavaScript или jQuery?
С сервера я получаю переменную datetime в этом формате: 6/29/2011 4:52:48 PM
и это время в формате UTC. Я хочу преобразовать его в время браузера текущего пользователя, используя JavaScript.
Как это можно сделать с помощью JavaScript или jQuery?
Ответы:
Добавьте «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)"
!
Остерегайтесь !
_ … разбора строк даты с помощью конструктора Date (и Date.parse, они эквивалентны) настоятельно не рекомендуется из-за различий и несоответствий в браузере… (что, вероятно, было еще более верно в 2011 году)
На мой взгляд, серверы всегда должны возвращать дату и время в стандартизированном формате ISO 8601 .
Больше информации здесь:
В этом случае сервер вернется, '2011-06-29T16:52:48.000Z'
что будет напрямую передано в объект JS Date.
var utcDate = '2011-06-29T16:52:48.000Z'; // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);
localDate
Будет находиться в правом местное время, в моем случае будет через два часа (время DK).
Вам действительно не нужно делать весь этот анализ, который только усложняет вещи, если вы согласны с тем, какой формат ожидать от сервера.
DateTime
объект, .toString("o")
который возвращает строку в формате ISO-8601, как показано выше. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx В JavaScript это new Date().toISOString()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Это универсальное решение:
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();
Для меня вышеуказанные решения не сработали.
С IE преобразование даты и времени в местное время по UTC немного сложнее. Для меня дата-время из веб-API - это то, что '2018-02-15T05:37:26.007'
я хотел конвертировать в соответствии с местным часовым поясом, поэтому я использовал приведенный ниже код в JavaScript.
var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
Поместите эту функцию в вашу голову:
<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,""));
Это работает для меня:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
return newDate;
}
После нескольких других постов, опубликованных здесь, без хороших результатов, мне показалось, что это работает:
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());
}
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)
Добавьте часовой пояс в конце, в этом случае «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"
В ответе Мэтта отсутствует тот факт, что летнее время может быть разным между Date () и датой, которую нужно преобразовать - вот мое решение:
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)
//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;
}
Это упрощенное решение, основанное на ответе Адоржана Принца:
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));
Если вы не против, 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');
Мне показалось самым простым использование
datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());
(я думал, что первой строки может быть достаточно, но есть часовые пояса, которые отключены в долях часов)
new Date('date string')
, а затем добавил эти две строки, и, похоже, он возвращается с временем, полностью основанным на временной метке сервера UTC с изменениями, сделанными, чтобы это соответствовало местному времени пользователя. Мне тоже нужно беспокоиться о странных часовых поясах с долями в час ... Не уверен, что он работает постоянно все время ...
Строка даты JSON (сериализованная в C #) выглядит как «2015-10-13T18: 58: 17».
В угловых, (вслед за Хулвей) сделайте 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' }}
Используя YYYY-MM-DD hh:mm:ss
формат:
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
, использование строки для часового пояса (например, «UTC») не будет работать во многих браузерах. +hh:mm
представляют смещение от часового пояса UTC.@Adorojan's
ответ почти правильный. Но добавление смещения некорректно, так как значение смещения будет отрицательным, если дата браузера опережает время по Гринвичу и наоборот. Ниже приведено решение, с которым я пришел, и оно прекрасно работает для меня:
// 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);
}
Я отвечаю на это, если какая-либо функция хочет, чтобы отображалось время конвертирования в определенный элемент 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>
Я написал хороший небольшой скрипт, который берет эпоху UTC и преобразует его в часовой пояс системы клиента и возвращает его в формате д / м / ГЧ: 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;
};
Вы можете использовать момент , 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");
Для более подробной информации вы можете обратиться на сайт Moment JS
Вы можете сделать это, используя файл moment.js .
Это просто, вы только что упомянули место часового пояса.
Пример: если вы хотите преобразовать дату и время в часовой пояс Азии / Калькутты, вам нужно просто указать название места часового пояса, полученное из moment.js.
var UTCDateTime="Your date obtained from UTC";
var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
Я создал одну функцию, которая конвертирует все часовые пояса в местное время.
Я не использовал getTimezoneOffset (), потому что он не возвращает правильное значение смещения
Требования:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz) {
var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
var localDateTime
var hours = zoneValue.split(":")[0]
var minutes = zoneValue.split(":")[1]
if (operator === "-") {
localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else if (operator) {
localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
} else {
localDateTime = "Invalid Timezone Operator"
}
return localDateTime
}
utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
//Returns "2019-11-14 12:45:37"
В моем случае мне пришлось искать разницу дат в секундах. Дата была строкой даты в формате UTC, поэтому я преобразовал ее в локальный объект даты. Вот что я сделал:
let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() *
60000);
utc2 = dateForCompare;
const seconds = Math.floor(utc1 - utc2) / 1000;
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, должен заботиться о летнем времени и работать на 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);
};
Редактировать: Angular 1.3.0 добавил поддержку UTC для фильтра даты, я еще не использовал его, но это должно быть проще, вот формат:
{{ date_expression | date : format : timezone}}