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

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

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

Ответы [ 24 ]

8 голосов
/ 28 декабря 2016

Если вы не возражаете против использования 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 голосов
/ 22 ноября 2017

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

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}
7 голосов
/ 10 апреля 2018

Добавьте часовой пояс в конце, в этом случае '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"
5 голосов
/ 14 июня 2013

Мне показалось, что самое простое -

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

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

4 голосов
/ 13 октября 2015

Строка даты 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' }}
3 голосов
/ 25 июля 2015

Использование 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)

Важные примечания

  1. Вы должны разделять дату и время на T, пробел не будет работать в некоторых браузерах
  2. Вынеобходимо установить часовой пояс, используя этот формат +hh:mm, использование строки для часового пояса (например, «UTC») не будет работать во многих браузерах.+hh:mm представляет смещение от часового пояса UTC.
2 голосов
/ 19 июня 2018

@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);
}
2 голосов
/ 28 февраля 2015

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

1 голос
/ 01 июня 2015

Основываясь на ответе @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>
0 голосов
/ 18 апреля 2019

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

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date(`${date} UTC`).toLocaleString();
}
...