Конвертировать время в формате UTC в местное время - PullRequest
275 голосов
/ 29 июня 2011

С сервера я получаю переменную datetime в этом формате: 6/29/2011 4:52:48 PM, и это время по UTC. Я хочу преобразовать его в время браузера текущего пользователя с помощью JavaScript.

Как это можно сделать с помощью JavaScript или jQuery?

Ответы [ 24 ]

336 голосов
/ 29 июня 2011

Добавить '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)"
102 голосов
/ 16 июля 2015

С моей точки зрения, серверы всегда должны в общем случае возвращать дату и время в стандартизированном формате 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).

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

89 голосов
/ 20 августа 2013

Это универсальное решение:

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();
33 голосов
/ 29 июня 2011

Вы должны получить (UTC) смещение (в минутах) клиента:

var offset = new Date().getTimezoneOffset();

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

Надеюсь, это поможет.

19 голосов
/ 16 февраля 2012

Поместите эту функцию в вашу голову:

<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,""));
14 голосов
/ 16 февраля 2018

Для меня вышеупомянутые решения не сработали.

С IE преобразование даты и времени в местное время по UTC немного сложнее.Для меня дата-время из веб-API составляет '2018-02-15T05:37:26.007', и я хотел конвертировать в соответствии с местным часовым поясом, поэтому я использовал следующий код в JavaScript.

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
10 голосов
/ 10 апреля 2017

После попытки нескольких других, размещенных здесь, без хороших результатов, мне показалось, что это сработало:

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());
}
9 голосов
/ 02 мая 2014

Используйте это для преобразования 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;
}
8 голосов
/ 04 июня 2014

В ответе Мэтта отсутствует тот факт, что летнее время может отличаться между 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)
8 голосов
/ 03 сентября 2015

Это упрощенное решение, основанное на ответе Адоржана Принца:

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