Konwertuj datę UTC na lokalną datę


337

Z serwera otrzymuję zmienną datetime w tym formacie: 6/29/2011 4:52:48 PMi jest ona w czasie UTC. Chcę przekonwertować go na czas przeglądarki bieżącego użytkownika za pomocą JavaScript.

Jak można to zrobić za pomocą JavaScript lub jQuery?



1
Bądź ostrożny. To dziwny format daty, więc należy go podać w dowolnym używanym rozwiązaniu. Jeśli to możliwe, poproś serwer o wysłanie daty w formacie ISO.
Michael Scheper,

Odpowiedzi:


404

Dołącz „UTC” do ciągu przed przekształceniem go w datę w 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
funkcja localizeDateStr (date_to_convert_str) {var date_to_convert = nowa data (date_to_convert_str); var local_date = new Date (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); return date_to_convert.toString (); }
mat.

4
@matt offSet zwraca minuty, a nie godziny, musisz podzielić przez 60
bladefist

50
Zakłada się, że część daty łańcucha znaków odpowiada amerykańskiemu standardowi, mm / dd / RRRR, co oczywiście nie ma miejsca w Europie ani w innych częściach świata.
AsGoodAsItGets

7
@digitalbath Działa w Chrome, ale nie działa w przeglądarce Firefox.
Ganesh Satpute,


138

Z mojego punktu widzenia serwery powinny zawsze w ogólnym przypadku zwracać datę / godzinę w znormalizowanym formacie ISO 8601 .

Więcej informacji tutaj:

W takim przypadku serwer zwróciłby dane '2011-06-29T16:52:48.000Z'bezpośrednio do obiektu JS Date.

var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);

localDateBędzie w odpowiednim czasie lokalnym, które w moim przypadku byłaby dwie godziny później (czas DK).

Ty naprawdę nie trzeba robić wszystko to parsowanie który tylko komplikuje rzeczy, tak długo, jak są spójne z jakim formacie można oczekiwać od serwera.


1
jak uzyskać datę formatu ISO? dostaję datę w formacie UTC z dołączonym na końcu UTC
Deepika

8
@ Colin zależne od języka. W języku C # możesz sformatować DateTimeobiekt, za pomocą .toString("o")którego zwracany jest ciąg sformatowany według ISO-8601, jak pokazano powyżej. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx W javascript jest to new Date().toISOString(). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Hulvej

99

To uniwersalne rozwiązanie:

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

Stosowanie:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

Wyświetl datę na podstawie lokalnego ustawienia klienta:

date.toLocaleString();

41
Nie działa ze wszystkimi strefami czasowymi. Jest dobry powód, dla którego getTimeZoneOffset jest w kilka minut! geographylists.com/list20d.html
siukurnin

5
@siukurnin. więc aby zarządzać dziwną strefą czasową, użyj newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Guillaume Gendre

18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) wystarczy. Również w
poprawnych

1
Czy jesteś pewien, że to nie może działać w żadnej strefie czasowej, która jest 30 minut poza domem? Wydaje się, że zaokrągla się do pełnych godzin.
NickG,

2
Nie wydaje się również, aby ustawiała datę poprawnie, gdy zmiana strefy czasowej przekracza północ; być może dlatego, że używa tylko setHours, co nie wpływa na datę?
Uniphonic

37

Powinieneś uzyskać przesunięcie (UTC) klienta (w minutach):

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

A następnie dodaj lub odejmij korespondent czas otrzymany z serwera.

Mam nadzieję że to pomoże.


2
Co z DST?
Bogaty

26

Dla mnie powyższe rozwiązania nie działały.

W IE konwersja daty i godziny UTC na lokalną jest trochę trudna. Dla mnie data i czas z interfejsu API sieci to '2018-02-15T05:37:26.007'i chciałem przekonwertować zgodnie z lokalną strefą czasową, więc użyłem poniżej kodu w JavaScript.

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

21

Umieść tę funkcję w swojej głowie:

<script type="text/javascript">
function localize(t)
{
  var d=new Date(t+" UTC");
  document.write(d.toString());
}
</script>

Następnie wygeneruj następujące dane dla każdej daty w treści strony:

<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>

Aby usunąć GMT i strefę czasową, zmień następujący wiersz:

document.write(d.toString().replace(/GMT.*/g,""));

20

To działa dla mnie:

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

10

Po wypróbowaniu kilku innych opublikowanych tutaj bez dobrych rezultatów, wydawało mi się to działać:

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

I to działa w drugą stronę, od Lokalnej Daty do UTC:

convertLocalDatetoUTCDate: function(date){
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}

1
Mniej kodu do użycia new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG

to nie zadziała, mój czas w utc to „2020-04-02T11: 09: 00”, więc wypróbowałem to z Singapuru, nowa data (+ nowa data („2020-04-02T11: 09: 00”) + nowa data ( „2020-04-02T11: 09: 00”). GetTimezoneOffset () * 6e4), podając zły czas
AhammadaliPK

to zadziałało, nowa data („2020-04-02T11: 09: 00” + „Z”);
AhammadaliPK

10

Dodaj strefę czasową na końcu, w tym przypadku „UTC”:

theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));

następnie użyj rodzin funkcji toLocale () *, aby wyświetlić datę we właściwych ustawieniach narodowych

theDate.toLocaleString();  // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString();  // "9:52:48 AM"
theDate.toLocaleDateString();  // "6/29/2011"

9

W odpowiedzi Matta brakuje faktu, że czas letni może być inny w funkcji Date () i czas, który należy przekonwertować - oto moje rozwiązanie:

    function ConvertUTCTimeToLocalTime(UTCDateString)
    {
        var convertdLocalTime = new Date(UTCDateString);

        var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;

        convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); 

        return convertdLocalTime;
    }

Wyniki w debuggerze:

UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)

9

Użyj tego do konwersji czasu UTC i lokalnego i odwrotnie.

//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
co się stało w czasie letnim. Strefa czasowa CET
NovusMobile


9

To uproszczone rozwiązanie oparte na odpowiedzi Adorjana Princa:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date);
    newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return newDate;
}

Stosowanie:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

Dlaczego zostało to zanegowane 9 października 2017 r.? Napisz komentarz, który pomoże mi zrozumieć Twoją opinię.
huha,

9

Jeśli nie masz nic przeciwko, moment.jsa Twój czas jest w UTC, skorzystaj z następujących opcji:

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

jeśli Twój czas nie jest w UTC, ale w innych znanych Ci lokalizacjach, użyj następujących poleceń:

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

jeśli masz już czas lokalny, użyj następujących opcji:

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

5

Dla mnie najprostszy wydawał się używać

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

(myślałem, że pierwsza linia może wystarczyć, ale istnieją strefy czasowe, które są wyłączone w ułamkach godzin)


Czy ktoś ma z tym jakieś problemy? To wydaje mi się najlepszą opcją dla mnie. Wziąłem ciąg UTC, który zawierał „(UTC)” na końcu, ustawiłem go jako obiekt Data za pomocą new Date('date string'), a następnie dodałem te dwie linie i wydaje się, że wraca z czasem całkowicie opartym na znaczniku czasu UTC serwera z dostosowaniami dostosowanymi do czasu lokalnego użytkownika. Muszę się również martwić o przedziały czasowe o ułamkach godziny ... Nie jestem pewien, czy cały czas doskonale się trzyma ...
tylerl

próbowałem wielu innych opcji, żadna z nich nie działała, ale to działa
Sameera K

5

Ciąg daty JSON (zserializowany w języku C #) wygląda jak „2015-10-13T18: 58: 17”.

Kątowo (po Hulvej) utwórz localdatefiltr:

myFilters.filter('localdate', function () {
    return function(input) {
        var date = new Date(input + '.000Z');
        return date;
    };
})

Następnie wyświetl czas lokalny, taki jak:

{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}

3

Używając YYYY-MM-DD hh:mm:ssformatu:

var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"

Aby przekonwertować z YYYY-MM-DD hh:mm:ssformatu, upewnij się, że data jest zgodna z formatem 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)

Ważne rzeczy do zapamiętania

  1. Musisz oddzielić datę i godzinę od T, spacja nie będzie działać w niektórych przeglądarkach
  2. Musisz ustawić strefę czasową za pomocą tego formatu +hh:mm, użycie ciągu znaków dla strefy czasowej (np. „UTC”) nie będzie działać w wielu przeglądarkach. +hh:mmreprezentują przesunięcie w stosunku do strefy czasowej UTC.

3

@Adorojan'sodpowiedź jest prawie poprawna. Ale dodanie przesunięcia nie jest poprawne, ponieważ wartość przesunięcia będzie ujemna, jeśli data przeglądarki będzie wcześniejsza niż GMT i odwrotnie. Poniżej znajduje się rozwiązanie, z którym przyszedłem i działa dla mnie idealnie:

// 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

Dla mnie to działa dobrze

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

2

Odpowiadam na to, jeśli ktoś chce funkcji wyświetlającej czas konwersji na określony element id i stosuje ciąg formatu daty rrrr-mm-dd tutaj date1 to ciąg znaków, a ids to id elementu, który będzie wyświetlany.

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

wiem, że odpowiedź została już zaakceptowana, ale dostaję się tutaj z powodu wyszukiwarki google i rozwiązałem problem, czerpiąc inspirację z zaakceptowanej odpowiedzi, więc chciałem się nią podzielić, jeśli ktoś tego potrzebuje.


1

W oparciu o odpowiedź @digitalbath, oto mała funkcja, aby pobrać znacznik czasu UTC i wyświetlić czas lokalny w danym elemencie DOM (używając jQuery dla tej ostatniej części):

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

Napisałem ładny mały skrypt, który pobiera epokę UTC i przekształca go w strefę czasową systemu klienta i zwraca go w formacie d / m / YH: i: s (jak funkcja daty 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

Możesz użyć momentjs , moment(date).format()zawsze da wynik w lokalnej dacie .

Bonus , możesz sformatować w dowolny sposób. Na przykład

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

Więcej informacji można znaleźć na stronie internetowej Moment js


0

Możesz to zrobić za pomocą pliku moment.js .

To proste, że właśnie wspomniałeś o miejscu strefy czasowej.

Przykład: jeśli chcesz przekonwertować swoją datę na strefę czasową Asia / Kolkata, musisz tylko podać nazwę miejsca w strefie czasowej uzyskaną z 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

Stworzyłem jedną funkcję, która konwertuje wszystkie strefy czasowe na czas lokalny.

Nie użyłem getTimezoneOffset (), ponieważ nie zwraca właściwej wartości przesunięcia

Wymagania:

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

W moim przypadku musiałem znaleźć różnicę dat w sekundach. Data była ciągiem daty UTC, więc przekonwertowałem ją na lokalny obiekt daty. Oto co zrobiłem:

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

Dla innych, którzy odwiedzają - użyj tej funkcji, aby uzyskać lokalny obiekt daty z ciągu UTC, powinien zająć się DST i działać na IE, IPhone itp.

Rozdzielamy ciąg (ponieważ parsowanie daty JS nie jest obsługiwane w niektórych przeglądarkach) Otrzymujemy różnicę od UTC i odejmujemy od czasu UTC, co daje nam czas lokalny. Ponieważ zwracane przesunięcie jest obliczane za pomocą DST (popraw mnie, jeśli się mylę), więc ustawi czas z powrotem w zmiennej „utc”. Na koniec zwróć obiekt daty.


-1

W Angularu użyłem odpowiedzi Bena w ten sposób:

$scope.convert = function (thedate) {
    var tempstr = thedate.toString();
    var newstr = tempstr.toString().replace(/GMT.*/g, "");
    newstr = newstr + " UTC";
    return new Date(newstr);
};

Edycja: Angular 1.3.0 dodał obsługę UTC do filtru dat, jeszcze go nie użyłem, ale powinno być łatwiej, oto format:

{{ date_expression | date : format : timezone}}

Angular 1.4.3 Date API

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.