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?
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 =newDate('6/29/2011 4:52:48 PM UTC');
date.toString()// "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
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.
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 servervar localDate =newDate(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.
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 =newDate().getTimezoneOffset();
A następnie dodaj lub odejmij korespondent czas otrzymany z serwera.
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 =newDate('2018-02-15T05:37:26.007'+'Z');
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”:
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 timefunction convertLocalDateToUTCDate(date, toUTC){
date =newDate(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 =newDate(date);
console.log("Converted time: "+ date);return date;}
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(){returnfunction(input){var date =newDate(input +'.000Z');return date;};})
Następnie wyświetl czas lokalny, taki jak:
{{order.createDate | localdate | date :'MMM d, y h:mm a'}}
var date =newDate('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
Musisz oddzielić datę i godzinę od T, spacja nie będzie działać w niektórych przeglądarkach
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.
@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 UTCvar inputInUtc ="6/29/2011 4:52:48";var dateInUtc =newDate(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 timezonereturnnewDate(dateInUtc.getTime()- dateInUtc.getTimezoneOffset()*60*1000);}
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.
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.
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):
<div id="eventTimestamp"class="timeStamp"></div><script type="text/javascript">// Convert UTC timestamp to local time and display in specified DOM elementfunction convertAndDisplayUTCtime(date,hour,minutes,elementID){var eventDate =newDate(''+date+' '+hour+':'+minutes+':00 UTC');
eventDate.toString();
$('#'+elementID).html(eventDate);}
convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');</script>
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 =newDate(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;};
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
varUTCDateTime="Your date obtained from UTC";varISTleadTime=(moment.tz(UTCDateTime,"Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
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:30var zoneValue = zone.replace(/[^0-9: ]/g,"")// Zone value without + - charsvaroperator= zone && zone.split("")&& zone.split("")[0]==="-"?"-":"+"// operator for addition subtractionvar 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")}elseif(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"
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:
function getUTC(str){var arr = str.split(/[- :]/);var utc =newDate(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.
Odpowiedzi:
Dołącz „UTC” do ciągu przed przekształceniem go w datę w javascript:
źródło
!
Uważaj!
_ … parsowanie ciągów daty za pomocą konstruktora Date (i Date.parse, są one równoważne) jest mocno odradzane ze względu na różnice w przeglądarkach i niespójności… (co prawdopodobnie było jeszcze bardziej prawdziwe w 2011 r.)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.localDate
Bę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.
źródło
DateTime
obiekt, 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 tonew Date().toISOString()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…To uniwersalne rozwiązanie:
Stosowanie:
Wyświetl datę na podstawie lokalnego ustawienia klienta:
źródło
Powinieneś uzyskać przesunięcie (UTC) klienta (w minutach):
A następnie dodaj lub odejmij korespondent czas otrzymany z serwera.
Mam nadzieję że to pomoże.
źródło
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.źródło
Umieść tę funkcję w swojej głowie:
Następnie wygeneruj następujące dane dla każdej daty w treści strony:
Aby usunąć GMT i strefę czasową, zmień następujący wiersz:
źródło
To działa dla mnie:
źródło
Po wypróbowaniu kilku innych opublikowanych tutaj bez dobrych rezultatów, wydawało mi się to działać:
I to działa w drugą stronę, od Lokalnej Daty do UTC:
źródło
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)Dodaj strefę czasową na końcu, w tym przypadku „UTC”:
następnie użyj rodzin funkcji toLocale () *, aby wyświetlić datę we właściwych ustawieniach narodowych
źródło
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:
Wyniki w debuggerze:
źródło
Użyj tego do konwersji czasu UTC i lokalnego i odwrotnie.
źródło
To uproszczone rozwiązanie oparte na odpowiedzi Adorjana Princa:
Stosowanie:
źródło
Jeśli nie masz nic przeciwko,
moment.js
a Twój czas jest w UTC, skorzystaj z następujących opcji:jeśli Twój czas nie jest w UTC, ale w innych znanych Ci lokalizacjach, użyj następujących poleceń:
jeśli masz już czas lokalny, użyj następujących opcji:
źródło
Dla mnie najprostszy wydawał się używać
(myślałem, że pierwsza linia może wystarczyć, ale istnieją strefy czasowe, które są wyłączone w ułamkach godzin)
źródło
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 ...Ciąg daty JSON (zserializowany w języku C #) wygląda jak „2015-10-13T18: 58: 17”.
Kątowo (po Hulvej) utwórz
localdate
filtr:Następnie wyświetl czas lokalny, taki jak:
źródło
Używając
YYYY-MM-DD hh:mm:ss
formatu:Aby przekonwertować z
YYYY-MM-DD hh:mm:ss
formatu, upewnij się, że data jest zgodna z formatem ISO 8601 .Ważne rzeczy do zapamiętania
T
, spacja nie będzie działać w niektórych przeglądarkach+hh:mm
, użycie ciągu znaków dla strefy czasowej (np. „UTC”) nie będzie działać w wielu przeglądarkach.+hh:mm
reprezentują przesunięcie w stosunku do strefy czasowej UTC.źródło
@Adorojan's
odpowiedź 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:źródło
Dla mnie to działa dobrze
źródło
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.
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.
źródło
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/
źródło
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):
źródło
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
Więcej informacji można znaleźć na stronie internetowej Moment js
źródło
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
źródło
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:
źródło
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:
źródło
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.
źródło
W Angularu użyłem odpowiedzi Bena w ten sposób:
Edycja: Angular 1.3.0 dodał obsługę UTC do filtru dat, jeszcze go nie użyłem, ale powinno być łatwiej, oto format:
Angular 1.4.3 Date API
źródło