Перетворити час дати UTC в місцевий час


337

Від сервера я отримую змінну дати в такому форматі: 6/29/2011 4:52:48 PMі це в UTC час. Я хочу перетворити його в час браузера поточного користувача за допомогою JavaScript.

Як це можна зробити за допомогою JavaScript або jQuery?



1
Будь обережний. Це дивний формат дати, тому не забудьте вказати його в будь-якому рішення, яке ви використовуєте. Якщо можливо, змусіть сервер надіслати дату у форматі ISO.
Майкл Шепер

Відповіді:


404

Додайте "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)"

5
функція localizeDateStr (date_to_convert_str) {var date_to_convert = нова дата (date_to_convert_str); var local_date = нова дата (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); повернути date_to_convert.toString (); }
мат

4
@matt offSet повертає хвилини, а не години, потрібно розділити їх на 60
bladefist

50
Це передбачає, що частина рядка дати відповідає строці США, мм / дд / рр. РРРР, що, очевидно, не так у Європі та в інших частинах світу.
AsGoodAsItGets

7
@digitalbath Працює в Chrome, але не працює у Firefox.
Ганеш Сатпут


138

На мій погляд, сервери завжди повинні повертати дату в стандартизованому форматі 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).

Вам дійсно не потрібно робити весь цей аналіз, який просто ускладнює речі, доки ви не узгоджуєтесь із тим, який формат очікувати від сервера.


1
як отримати дату формату iso? я отримую дату у форматі UTC, а UTC додається до кінця
Deepika

8
@Colin - це залежно від мови. У C # ви можете відформатувати 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/…
Hulvej

99

Це універсальне рішення:

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

41
Не працює з усіма часовими поясами. Є добра причина, чому getTimeZoneOffset за лічені хвилини! geographylists.com/list20d.html
siukurnin

5
@siukurnin. щоб керувати дивним часовим поясом, використовуйте newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Гійом Джендр

18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) буде досить. Також коригує години
Lu55

1
Досить впевнений, що це не може працювати в будь-який часовий пояс, який триває 30 хвилин? Здається, кругляться цілі години.
NickG

2
Це також не здається правильно встановити дату, коли зсув часового поясу перетинає півночі; можливо тому, що це лише використання setHours, що не впливає на дату?
Уніфонічний

37

Ви повинні отримати (UTC) зміщення (у хвилинах) клієнта:

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

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

Сподіваюсь, це допомагає.


2
Що з DST?
Багатий

26

Для мене вище рішення не спрацювали.

З IE перетворення дати та часу за часом у місцеві є мало складним. Для мене дата веб-API є, '2018-02-15T05:37:26.007'і я хотів конвертувати відповідно до локального часового поясу, тому я використав код нижче в JavaScript.

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');

21

Покладіть цю функцію на голову:

<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,""));

20

Це працює для мене:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}

10

Після спроб декількох інших, розміщених тут, без хороших результатів, це, здавалося, спрацювало для мене:

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());
}

1
Менше коду для використання new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG

це не буде працювати, мій час у utc - "2020-04-02T11: 09: 00", тому спробував це з Сінгапуру, нова дата (+ нова дата ("2020-04-02T11: 09: 00") + нова дата ( "2020-04-02T11: 09: 00"). GetTimezoneOffset () * 6e4), даючи неправильний час
AhammadaliPK

це спрацювало, нова дата ("2020-04-02T11: 09: 00" + "Z");
AhammadaliPK

10

Додайте часовий пояс наприкінці, у цьому випадку "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"

9

У відповіді Метта відсутній той факт, що літній час може бути різним між 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)

9

Використовуйте це для перетворення 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;
}

3
що сталося під час літнього часу. Часовий пояс CET
NovusMobile

см моя відповідь @ stackoverflow.com/questions/6525538 / ...
Hulvej

9

Це спрощене рішення, засноване на відповіді Адоріана Принца:

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

Чому це було скасовано 9 жовтня 2017 року? Будь ласка, напишіть коментар, щоб допомогти мені зрозуміти вашу думку.
huha

9

Якщо ви не заперечуєте проти використання, moment.jsа ваш час перебуває в UTC, просто використовуйте наступне:

moment.utc('6/29/2011 4:52:48 PM').toDate();

якщо ваш час не є точним, а будь-яким іншим відомим вам місцем, використовуйте наступне:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();

якщо ваш час вже локальний, то використовуйте наступне:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');

5

Мені найпростішим здавалося використання

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

(я думав, першого рядка може бути достатньо, але є часові пояси, які вимикаються за частки годин)


Хтось має з цим проблеми? Це здається мені найкращим варіантом. Я взяв рядок UTC, який в кінці його мав "(UTC)", встановив його як об'єкт Date за допомогою new Date('date string'), а потім додав ці два рядки, і, здається, повертається з часом, повністю відключеним часовою позначкою UTC сервера. з внесеними корективами, щоб вони відповідали місцевому часу користувача. Мені теж доводиться турбуватися про дивні часові пояси дробу ... Не впевнений, чи він ідеально тримається весь час ...
tylerl

спробував багато інших варіантів, жоден з них не працював, але це працює
Sameera K

5

Рядок дати 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

Використання 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. Ви повинні відокремити дату та час на a T, у деяких браузерах пробіл не працюватиме
  2. Потрібно встановити часовий пояс у такому форматі +hh:mm, якщо рядок для часового поясу (напр .: 'UTC') не працюватиме у багатьох браузерах. +hh:mmпредставляють зміщення від часового поясу UTC.

3

@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);
}


3

Для мене це добре працює

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

2

Я відповідаю на це Якщо будь-яка потрібна функція, яка відображає перетворений час на конкретний елемент 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

На основі відповіді @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

Я написав хороший маленький сценарій, який займає епоху UTC і перетворює його в часовий пояс клієнтської системи і повертає його у d / m / YH: 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

Ви можете використовувати 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"); 

Більш детальну інформацію можна знайти на веб-сайті Moment js


0

Ви можете це зробити, використовуючи файл 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');


0

Я створив одну функцію, яка перетворює всі часові пояси в місцевий час.

Я не використовував 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"

0

У моєму випадку мені довелося знайти різницю дат у секундах. Дата була рядком дати 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;

-1
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". Нарешті поверніть об’єкт дати.


-1

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

Кутовий API 1.4.3

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.