Преобразование даты времени UTC в локальное время

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

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

265
29 июня '11 в 21:35
источник поделиться
24 ответов

Добавляйте '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)"
322
29 июня '11 в 21:42
источник

Связанные вопросы


Похожие вопросы

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

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

90
16 июля '15 в 14:53
источник

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

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();
86
20 авг. '13 в 11:43
источник

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

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

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

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

33
29 июня '11 в 21:46
источник

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

<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,""));
19
16 февр. '12 в 22:26
источник

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

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

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');
14
16 февр. '18 в 10:38
источник

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

convertUTCDateToLocalDate: function (date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),  date.getHours(), date.getMinutes(), date.getSeconds()));
}

И это работает наоборот: от Local Date до UTC:

convertLocalDatetoUTCDate: function(date){
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
10
10 апр. '17 в 22:30
источник

Используйте это для UTC и Local time convert и наоборот.

//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;
}
9
02 мая '14 в 11:06
источник

Если вы не против использования 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');
8
28 дек. '17 в 10:51
источник

Это работает для меня:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}
8
22 нояб. '17 в 21:13
источник

В ответе Matt отсутствует тот факт, что время перехода на летнее время может отличаться от даты() и времени, которое нужно преобразовать, - вот мое решение:

    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)
7
04 июня '14 в 4:18
источник

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

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));
7
03 сент. '15 в 12:45
источник

Добавить часовой пояс в конце, в этом случае "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"
6
10 апр. '18 в 2:19
источник

Мне проще всего было использовать

datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());

(я думал, что первая строка может быть достаточной, но есть часовые пояса, которые выходят за доли часов)

4
14 июня '13 в 12:40
источник

Использование формата 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.
3
25 июля '15 в 15:57
источник

Строка даты JSON (сериализована на С#) выглядит как "2015-10-13T18: 58: 17".

В angular (после 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' }}
3
13 окт. '15 в 22:44
источник

@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);
}
2
19 июня '18 в 23:14
источник

Я отвечаю на это, если кому-либо нужна функция, отображающая преобразованное время для конкретного элемента 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, и я действительно решался с тем, чтобы получить вдохновение от принятого ответа, поэтому я хотел просто поделиться им, если кому-то нужно.

2
28 февр. '15 в 17:09
источник

Основываясь на ответе @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>
1
01 июня '15 в 3:21
источник

Для меня это хорошо работает

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date('${date} UTC').toLocaleString();
}
0
18 апр. '19 в 19:59
источник

Я написал небольшую небольшую script, которая занимает эпоху 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;

};
0
24 марта '17 в 17:26
источник

Вы можете использовать момент, 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

0
14 сент. '18 в 10:24
источник

В 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}}

Angular 1.4.3 API даты

-1
10 февр. '15 в 1:12
источник
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 Date синтаксический анализ не поддерживается в некоторых браузерах) Мы получаем отличие от UTC и вычитаем его из UTC, что дает нам местное время. Поскольку возвращаемое смещение рассчитывается с помощью DST (исправьте меня, если я ошибаюсь), поэтому он вернет это время в переменной "utc". Наконец, верните объект даты.

-1
29 мая '17 в 21:14
источник

Посмотрите другие вопросы по меткам или Задайте вопрос