Konwertuj datę na inną strefę czasową w JavaScript

336

Szukam funkcji do konwersji daty w jednej strefie czasowej na inną.

Potrzebuje dwóch parametrów,

  • data (w formacie „2012/04/10 10:10:30 +0000”)
  • ciąg strefy czasowej („Asia / Jakarta”)

Ciąg strefy czasowej opisano w http://en.wikipedia.org/wiki/Zone.tab

Czy jest na to łatwy sposób?

Rizky Ramadhan
źródło
1
Znajdź przesunięcie UTC dla danego miasta. stackoverflow.com/questions/3002910/…
Brandon Boone,
3
Chcę obliczyć nie tylko przesunięcie UTC, ale także czas letni / letni. Tak więc czas wróci poprawnie.
Rizky Ramadhan
Sprawdź to również stackoverflow.com/questions/16084313/…
Amol M Kulkarni
Ustaw strefę czasową za pomocą komendy date w systemie unix: data +% s -d '1 sty 1970'
Anthony

Odpowiedzi:

191

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

Udhaya
źródło
1
Zmieniłem odpowiedź na to, ponieważ jest to poprawna i standardowa metoda bez użycia biblioteki.
Rizky Ramadhan
5
Dokumentacja MDN wyraźnie mówi, że jedyną strefą czasową wymaganą do rozpoznania we wszystkich implementacjach jest UTC. ( stackoverflow.com/questions/10087819/... ) Kliknięcie przycisku [Uruchom fragment kodu] w IE11 powoduje błąd.
Vivian River,
1
Jeśli ktoś szuka implementacji, która teraz działa na wszystkich przeglądarkach, może wypróbować poniższe odpowiedzi z własnymi wadami ...
Rizky Ramadhan
14
Ta odpowiedź pokazuje prawidłowe przekazywanie strefy czasowej toLocaleString, ale potem bardzo niepoprawnie pokazuje przekazywanie tego łańcucha z powrotem do Datekonstruktora. To prosi o kłopoty. Parser ciągów daty nie jest wymagany do akceptowania formatów specyficznych dla ustawień regionalnych, a dane wejściowe byłyby traktowane tak, jakby były w lokalnej strefie czasowej. Nie rób tego Wystarczy użyć ciągu wyjściowego z pierwszego toLocalStringwywołania.
Matt Johnson-Pint,
4
@MattJohnson, to nie możesz użyć getHour () ani takich metod
Ali Padida
131

Dla użytkowników moment.js możesz teraz użyć strefy czasowej . Używając go, twoja funkcja wyglądałaby mniej więcej tak:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Brian Di Palma
źródło
3
Nie byłem pewien, jak dodać nowe strefy czasowe, dokumenty mi nie pomogły. Jestem tylko programistą, a nie ekspertem od czasu!
Parziphal
8
Problem polega na tym, że nie zwraca nowego obiektu Date, lecz zwraca ciąg znaków. Jeśli tego właśnie chcesz, to oczywiście dobrze.
nickdnk
2
Czy nie jest to „moment powrotu (czas) .tz (strefa) .format (format);” ? Ten, który podałeś w kodzie, ma błąd „Nieprawidłowa data”.
Tarek
1
Nie można załadować pliku Moment.js w przeglądarce. Bardzo smutne :(
Daniil Shevelev
4
Jeśli nie jesteś zadowolony z wysłania 180K do przeglądarki z kopią bazy danych tz i możesz żyć z degradacją do obecnej strefy czasowej w starszych przeglądarkach, wypróbuj odpowiedź @ lambinator za pomocą Date.prototype.toLocaleString.
Peter V. Mørch
92

Skradzione bezwstydnie z: http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329

/** 
 * function to calculate local time
 * in a different city
 * given the city's UTC offset
 */
function calcTime(city, offset) {

    // create Date object for current location
    var d = new Date();

    // convert to msec
    // add local time zone offset
    // get UTC time in msec
    var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    var nd = new Date(utc + (3600000*offset));

    // return time as a string
    return "The local time in " + city + " is " + nd.toLocaleString();
}

ta funkcja jest przydatna do obliczania wartości strefy czasowej poprzez podanie nazwy miasta / kraju i wartości przesunięcia

Valli69
źródło
4
Fajnie .... ale myślę, że chce, żeby przesunięto go w oparciu o przejechane miasto.
Brandon Boone,
117
Nie uwzględnia to zmian czasu letniego.
Robotbugs
12
nie odpowiada na pytanie, ale odpowiada moje (+1)
Reign.85
Ten „3600000” dosłownie mnie zabił! Na wejściu należy podać tz w godzinach! I należy go odjąć. Jeśli więc zdasz: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Powinien oddać ten sam czas.
Praveen
1
Ta odpowiedź jest poważnie nieaktualna i powinna zostać usunięta, szczególnie część korzystająca z metody toLocaleString , która prawdopodobnie zgłosi strefę czasową hosta, gdy zostanie przesunięta do innej strefy czasowej. Istnieją znacznie lepsze sposoby ręcznego tworzenia znaczników czasu dla różnych przesunięć.
RobG
89

Większość przeglądarek stacjonarnych (nie mobilnych) oprócz Safari obsługuje funkcję toLocaleString z argumentami, starsze przeglądarki zwykle ignorują argumenty.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
lambinator
źródło
4
Nie działa w przeglądarce Firefox i Edge :(
Šime Vidas,
10
Ponieważ w FF i IE11 + to się nie udaje, należy znaleźć inne rozwiązanie.
jdavid.net
2
Edge i chrome podobały się :)
Suhail Mumtaz Awan
6
Działa teraz na Chrome v59 i Firefox v54 i Chome na Androida v59 i Safari 10 na iOS 10.3. Nie działało na IE10. Opis funkcji Date.prototype.toLocaleString () w MDN ma toLocaleStringSupportsLocales()implementację, która pozwala niezawodnie sprawdzać wsparcie.
Peter V. Mørch
1
Pomyślnie przetestowano w node.js v8.7.0
Heinrich Ulbricht
56

OK, znalazłem to!

Używam timezone-js . to jest kod:

var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London');
dt.setTimezone("Asia/Jakarta");

console.debug(dt); //return formatted date-time in asia/jakarta
Rizky Ramadhan
źródło
90
Muszę głosować przeciwko temu, timezone-js nie obsługuje DST i nie reklamuje tego w swoim pliku Readme, co czyni złą wskazówkę dla osób, które tego szukają. Zobacz: github.com/mde/timezone-js/issues/51 i szereg innych problemów, które zostały zgłoszone i nie wydają się zostać naprawione.
@ nus tak, ale tak naprawdę nie ma rozwiązania dla zarządzania strefą czasową / datą po stronie klienta ... jquery ui datepicker doprowadza mnie do szaleństwa z tego powodu. na zdrowie
Lucas
2
@Marabunta, wygląda jak strefa czasowa (odpowiedź Briana Di Palmy) obsługuje DST github.com/moment/moment-timezone/issues/21
welldan97
2
Nie używaj TimezoneJS, jest on obarczony zmianami czasu letniego.
matf
17

Jeśli nie chcesz importować dużej biblioteki, możesz po prostu użyć Intl.DateTimeFormat do konwersji obiektów Date na różne strefy czasowe.

// Specifying timeZone is what causes the conversion, the rest is just formatting
const options = {
  year: '2-digit', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit', second: '2-digit',
  timeZone: 'Asia/Jakarta',
  timeZoneName: 'short'
}
const formater = new Intl.DateTimeFormat('sv-SE', options)
const startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

Zadbamy o to, o offsety, czas letni i zmiany w przeszłości.

Nieskończony
źródło
IE10 + nie obsługuje Intl API dla stref czasowych. moment.github.io/luxon/docs/manual/matrix.html
Chloe
To właściwie najlepsza odpowiedź. toLocaleStringma niespójną implementację i działa od wersji IE11.
dlsso,
FYI: To tak naprawdę nie działa w IE11, przynajmniej w Windows 8.1. Podczas próby utworzenia formatterobiektu otrzymujesz: `` Wartość opcji 'Azja / Dżakarta' dla 'timeZone' jest poza prawidłowym zakresem. Oczekiwany: ['UTC'] ``
veddermatic
czy istnieje sposób, aby ponownie przekonwertować końcowy wynik z formatera na obiekt Date?
mding5692
10

Rozumiem !

Chciał wymusić wyświetloną datę = data serwera, bez względu na ustawienia lokalne (UTC).

Mój serwer to GMT-6 -> nowa data (). GetTimezoneOffset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
Cedric Simon
źródło
2
Chociaż pokazuje prawidłowy czas naiwności, informacje o strefie czasowej z myOldDateObj są przechowywane. Tak więc właściwie jest to zły czas (kiedy bierzesz czas jako instancję w czasie, a nie czas na zegarku).
gabn88
@ gabn88: Nie będziesz mógł zmienić czasu serwera za pomocą Javascript ... Aby naprawić czas serwera, zrób to na poziomie systemu operacyjnego.
Cedric Simon
2
Nie muszę ustalać czasu serwera;) Czas serwera to dla mnie zawsze czas UTC. Ale mam inną organizację w różnych strefach czasowych. A ich urządzenia powinny zawsze pokazywać czas, w którym stacjonuje ich organizacja, gdziekolwiek się znajdują.
gabn88
Mamy podobny problem z wyświetlaniem dat zawsze w strefie czasowej X. Staramy się wysyłać wszystkie daty w formacie ciągu z serwera, a w przeglądarce traktujemy je tylko jako lokalne daty stref czasowych.
Venkateswara Rao,
5

Do ustawienia strefy czasowej można użyć metody toLocaleString ().

new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })

W przypadku Indii można użyć opcji „Indian / Christmas”, a następujące strefy czasowe to:

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
Codemaker
źródło
Nie ustawiasz strefy czasowej, ale tworzysz ciąg znaków z czasem wyrażonym w tej strefie czasowej. Data pozostaje taka sama.
Gerard ONeill
toLocaleStringRoztwór już podane 4 lata temu .
Dan Dascalescu,
4

Jeśli wystarczy do stref czasowych nawróconych mam uploaded wersję okrojoną z chwila strefy czasowej tylko z minimum funkcjonalność. Jego dane ~ 1 KB +:

S.loadData({
    "zones": [
        "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
        "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
    ],
    "links": [
        "Europe/Paris|Europe/Madrid",
    ]
});

let d = new Date();
console.log(S.tz(d, "Europe/Madrid").toLocaleString());
console.log(S.tz(d, "Australia/Sydney").toLocaleString());
Santiago Corredoira
źródło
2

Ustaw zmienną z rokiem, miesiącem i dniem oddzielonymi symbolami „-”, plus „T” i czas we wzorcu GG: mm: ss, a następnie +01: 00 na końcu ciągu (w moim przypadku strefa czasowa to +1). Następnie użyj tego ciągu jako argumentu konstruktora daty.

//desired format: 2001-02-04T08:16:32+01:00
dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00";

var date = new Date(dateAndTime );
Nather Webber
źródło
2

Powinienem zauważyć, że jestem ograniczony w zakresie bibliotek zewnętrznych, z których mogę korzystać. moment.js i timezone-js NIE były dla mnie opcją.

Obiekt daty js, który mam, znajduje się w UTC. Musiałem uzyskać datę ORAZ czas od tej daty w określonej strefie czasowej (w moim przypadku „Ameryka / Chicago”).

 var currentUtcTime = new Date(); // This is in UTC

 // Converts the UTC time to a locale specific format, including adjusting for timezone.
 var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));

 console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString());
 console.log('currentUtcTime Hour: ' + currentUtcTime.getHours());
 console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes());
 console.log('currentDateTimeCentralTimeZone: ' +        currentDateTimeCentralTimeZone.toLocaleDateString());
 console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours());
 console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());

UTC jest obecnie 6 godzin przed „America / Chicago”. Dane wyjściowe to:

currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
szukanie27
źródło
11
new Date();zwraca lokalną strefę czasową, a nie UTC
Mirko
1
z dokumentów:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko
Hmm Trochę mylące. To nie zmienia strefy czasowej w dniu; raczej tworzy nową datę ze zmienionymi godzinami. O wiele łatwiej byłoby użyć wyrażenia regularnego do wyodrębnienia pożądanych wartości z ciągu utworzonego z wywołania toLocaleString.
Gerard ONeill
2

Oto mój kod, działa idealnie, możesz wypróbować podając poniżej demo:

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>

Sahil Kapoor
źródło
Witamy w StackOverflow! Czy możesz podać więcej informacji, takich jak sposób działania tego kodu i co on robi? Jak to rozwiązuje problem?
DarkSuniuM
Moim podanym powyższym kodem jest aktualizacja strefy czasowej do strefy czasowej innych krajów.
Sahil Kapoor
Musisz umieścić HTML w pliku HTML, a podany powyżej kod jquery musi znajdować się w stopce. Będzie działać dla ciebie zgodnie z („en-US”, {timeZone: „America / Chicago”})) musisz zaktualizować te dwie wartości, jeśli chcesz mieć strefę czasową dla innych krajów Dzięki
Sahil Kapoor
Nie, czekaj. Poprosiłem o to, nie patrząc uważnie. Dlaczego dodajesz 1 do currentDateTimeCentralTimeZone.getHours()? Bez tego działałoby i jest takie samo, jak szukanie odpowiedzi stackoverflow.com/a/40809160/1404185
chetstone
1

Możesz spróbować również w celu konwersji strefy czasowej daty na Indie:

var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var indainDateObj = new Date(indianTimeZoneVal);
indainDateObj.setHours(indainDateObj.getHours() + 5);
indainDateObj.setMinutes(indainDateObj.getMinutes() + 30);
console.log(indainDateObj);
Rahul Mankar
źródło
1
po drugim kroku mam czas w Indiach ... więc dlaczego wciąż dodajesz do niego 5 i 1/2 godziny?
user3833732,
Korzystając z tej metody, otrzymuję następujące informacje tutaj, w Norwegii, gdy konsoluję log z Chrome: Original: Thu Sep 27 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Zmodyfikowano: czw 27 września 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). „Sentraleuropeisk sommertid” oznacza środkowoeuropejski czas letni. Nie jestem pewien, czy to zadziała, gdy potrzebujesz czasu letniego dla Indii, lub odwrotnie, gdy jesteś w Indiach i potrzebujesz czasu letniego dla Europy i tak dalej.
Kebman
Użycie setHours () w ten sposób nie uwzględnia zmian dnia, miesiąca, roku, na przykład 3:30 rano w New Dell 8 rano jest 11 wieczorem 7 w Londynie. Następnie rozważ koniec miesiąca, roku i dni przestępne. Niech data dokona tej matematyki <pre> pozwól local_time = nowa data (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); niech date_str = local_time.toISOString (). slice (0, 10); niech time_str = local_time.toISOString (). slice (11, -1); niech timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland,
1

Po rozejrzeniu się, w tym linkach z tej strony, znalazłem ten świetny artykuł, korzystając ze strefy czasowej moment:

https://www.webniraj.com/2016/11/23/javascript-using-moment-js-to-display-dates-times-in-users-timezone/

Podsumowując:

Uzyskaj strefę czasową użytkownika

var tz = moment.tz.guess();
console.info('Timezone: ' + tz);

Zwraca np .: Strefa czasowa: Europa / Londyn

Ustaw domyślną strefę czasową użytkownika

moment.tz.setDefault(tz);

Ustaw niestandardową strefę czasową

moment.tz.setDefault('America/Los_Angeles');

Konwertuj datę / godzinę na lokalną strefę czasową, przy założeniu, że pierwotna data / godzina jest w UTC

moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');

Zwroty: niedziela, 25 grudnia 2016 r., 7:00

Konwertuj datę / godzinę na czas LA

moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');

Zwroty: sob., 24 grudnia 2016 r., Godz. 23:00

Przelicz z czasu LA na Londyn

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

Zwroty: niedziela, 25 grudnia 2016 r., Godz. 15.00

omarjebari
źródło
1

Możesz także użyć https://www.npmjs.com/package/ctoc_timezone

Ma bardzo prostą implementację i dostosowanie formatu.

Zmiana formatu w toTimeZone:

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

Wynik :

28th Feb 2013 19:00:00 EST

W dokumencie możesz zapoznać się z wieloma funkcjami.

Sandeep Chowdary
źródło
0

istnieje moduł npm o nazwie „timezones.json”, którego można użyć do tego; składa się w zasadzie z pliku json z obiektami zawierającymi informacje na temat czasu letniego i przesunięcia, ....

dla Azji / Dżakarty byłby w stanie zwrócić ten obiekt:

{
  "value": "SE Asia Standard Time",
  "abbr": "SAST",
  "offset": 7,
  "isdst": false,
  "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
  "utc": [
    "Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
  ]
}

możesz go znaleźć tutaj:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

mam nadzieję, że się przyda

Kevin
źródło
0

Ludzie zaznajomieni z java.timepakietem java 8 lub joda-timeprawdopodobnie pokochają nowego dzieciaka na bloku: js-joda bibliotekę .

zainstalować

npm install js-joda js-joda-timezone --save

Przykład

<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>

W prawdziwej javowej naturze jest to dość pełne lol. Ale ponieważ jest to przeniesiona biblioteka Java, szczególnie biorąc pod uwagę, że przeniesiono 1800'ish przypadków testowych, prawdopodobnie również działa ona doskonale dokładnie.

Manipulacja chrono jest trudna. Dlatego w wielu innych bibliotekach występują błędy. Moment.js wydaje się mieć odpowiednie strefy czasowe, ale inne biblioteki js, które widziałem, w tym timezone-js, nie wydają się godne zaufania.

Koza
źródło
0

Niedawno zrobiłem to w maszynce:

// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
  const dateToGetOffset = new Date( 2018, 5, 1, 12 );

  const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
  const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );

  const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
  const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );

  const offset: number = fromTimeHours - toTimeHours;

  // convert to msec
  // add local time zone offset
  // get UTC time in msec
  const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
    dateFromTimezone.getUTCMonth(),
    dateFromTimezone.getUTCDate(),
    dateFromTimezone.getUTCHours(),
    dateFromTimezone.getUTCMinutes(),
    dateFromTimezone.getUTCSeconds(),
  );

  // create new Date object for different city
  // using supplied offset
  const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );

  // return time as a string
  return dateUTC;
}

Używam formatu „en-UK”, ponieważ jest on prosty. Może to być „en-US” lub cokolwiek działa.

Jeśli pierwszym argumentem jest lokalna strefa czasowa, a seconde jest docelową strefą czasową, zwraca obiekt Date z prawidłowym przesunięciem.

Alexandre Liscia
źródło
0

Miałem problem z użyciem Strefy Moment . Dodaję tę odpowiedź, jeśli ktoś ma ten sam problem. Więc mam ciąg daty 2018-06-14 13:51:00pochodzący z mojego API. Wiem, że to jest przechowywaneUTC ale ciąg nie mówi sam za siebie.

Informuję strefę czasową moment, z której strefy czasowej pochodzi ta data, wykonując:

let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z

Teraz chciałbym przekonwertować go na określoną strefę czasową, wykonując:

let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.
Ashish Ranjan
źródło
0

Wystarczy ustawić strefę czasową kraju, w którym chcesz, i możesz z łatwością wyświetlić w html aktualizację za pomocą funkcji SetInteval () po każdej minucie. funkcja formatAMPM () zarządza formatem 12-godzinnym i wyświetlaniem czasu AM / PM.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });
Muhammad Azeem
źródło
-1

Nie znam prostej metody konwertowania obiektu daty na dowolną strefę czasową, ale jeśli chcesz przekonwertować go na lokalną strefę czasową, możesz po prostu przekonwertować go Date.prototype.getTime()na odpowiednią liczbę milisekund i ponownie.

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());

Na przykład, date.getHours()będzie teraz powrócić 15zamiast 13jeśli, tak jak ja, w Austrii (i to lato).

Czytałem, że różne funkcje daty i godziny mogą wykazywać niestandardowe zachowanie w niektórych przeglądarkach, więc przetestuj to najpierw. Mogę potwierdzić, że działa w Chrome.

黄 雨伞
źródło
1
Dlaczego to odrzucono? Jest to zdecydowanie najłatwiejszy i najlepszy sposób na zrobienie tego. Większość powyższych odpowiedzi nie bierze pod uwagę czasu letniego / zimowego
MortenSickel
Jaki jest sens drugiej linii? Konstruktor daty już zakłada lokalną strefę czasową. Obie te linie zwracają datę w strefie czasowej lokalnej przeglądarki i nie odpowiadają na pytanie, jak przekonwertować na inną strefę czasową z czasem letnim.
Chloe,
-1

Przesunięcie strefy czasowej dla bieżącej strefy czasowej

date +%s -d '1 Jan 1970'

Dla mojej strefy czasowej GMT + 10 (Australia) zwrócił -36000

Anthony
źródło
-6

szybki i brudny ręczny zmieniacz godzin i powrót:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
Nocnik
źródło
zbyt brudny (i zbyt brudny)
Maxwell sc