Konversi tanggal ke zona waktu lain dalam JavaScript

336

Saya mencari fungsi untuk mengonversi tanggal dalam satu zona waktu ke zona waktu lain.

Perlu dua parameter,

  • tanggal (dalam format "2012/04/10 10:10:30 +0000")
  • string zona waktu ("Asia / Jakarta")

String zona waktu dijelaskan dalam http://en.wikipedia.org/wiki/Zone.tab

Apakah ada cara mudah untuk melakukan ini?

Rizky Ramadhan
sumber
1
Temukan offset UTC dari kota tertentu. stackoverflow.com/questions/3002910/…
Brandon Boone
3
Saya ingin menghitung tidak hanya UTC offset tetapi juga Daylight saving / summer time. Jadi waktunya akan kembali dengan benar.
Rizky Ramadhan
kemungkinan rangkap dari Cara menginisialisasi tanggal javascript ke zona waktu tertentu
Matt Johnson-Pint
Periksa yang ini juga stackoverflow.com/questions/16084313/…
Amol M Kulkarni
Set off zona waktu Anda menggunakan perintah unix date: date +% s -d '1 Jan 1970'
anthony

Jawaban:

192

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
sumber
1
Saya mengubah jawaban untuk ini, karena ini adalah metode yang benar dan standar tanpa menggunakan perpustakaan apa pun.
Rizky Ramadhan
5
Dokumentasi MDN dengan jelas mengatakan bahwa satu-satunya zona waktu yang harus diakui dalam semua implementasi adalah UTC. ( stackoverflow.com/questions/10087819/… ) Mengklik tombol [Run code snippet] di IE11 menghasilkan kesalahan.
Sungai Vivian
1
Jika ada yang mencari implementasi yang bekerja untuk semua browser saat ini, mereka dapat mencoba jawaban apa pun di bawah ini dengan kontra ...
Rizky Ramadhan
14
Jawaban ini menunjukkan dengan benar melewati zona waktu ke toLocaleString, tetapi kemudian sangat keliru menunjukkan melewati string itu kembali ke Datekonstruktor. Itu meminta masalah. Pengurai string tanggal tidak diperlukan untuk menerima format spesifik lokal, dan input akan diperlakukan seolah-olah berada di zona waktu lokal. Jangan lakukan itu. Cukup gunakan output string dari toLocalStringpanggilan pertama .
Matt Johnson-Pint
4
@MattJohnson maka Anda tidak dapat menggunakan getHour () atau metode semacam itu
Ali Padida
131

Untuk pengguna moment.js , Anda sekarang dapat menggunakan zona waktu-saat . Dengan menggunakannya, fungsi Anda akan terlihat seperti ini:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Brian Di Palma
sumber
3
Saya tidak yakin bagaimana cara menambahkan zona waktu baru, dokumen tidak membantu saya. Saya hanya seorang programmer, bukan ahli waktu!
Parziphal
8
Masalahnya di sini adalah bahwa ini tidak mengembalikan objek Date baru, ia mengembalikan sebuah string. Jika itu yang Anda inginkan itu bagus, tentu saja.
nickdnk
2
Bukankah itu "mengembalikan momen (waktu) .tz (zona) .format (format);" ? Yang Anda berikan dalam kode Anda membuat saya kesalahan "Tanggal Tidak Valid".
Tarek
1
Tidak mungkin memuat Moment.js di browser. Sangat sedih :(
Daniil Shevelev
4
Jika Anda tidak senang mengirim 180K ke peramban dengan salinan basis data tz dan dapat hidup dengan degradasi ke zona waktu saat ini di peramban lama, coba jawaban @ lambinator menggunakan Date.prototype.toLocaleString.
Peter V. Mørch
92

Dicuri tanpa malu-malu dari: 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();
}

fungsi ini berguna untuk menghitung nilai zona waktu dengan memberikan nama kota / negara dan nilai offset

Valli69
sumber
4
bagus .... tapi saya pikir dia ingin offset dicari untuknya berdasarkan lulus di kota.
Brandon Boone
117
Ini tidak memperhitungkan perubahan tabungan siang hari.
Robotbugs
12
tidak menjawab pertanyaan tetapi menjawab pertanyaan saya (+1)
Pemerintahan.85
'3600000' itu benar-benar membunuh saya! Dalam input, tz harus diberikan dalam hitungan jam! Dan, itu harus dikurangi. Jadi, jika Anda meneruskan: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Itu harus mengembalikan waktu yang sama.
Praveen
1
Jawaban ini benar-benar ketinggalan zaman dan harus dihapus, terutama bagian yang menggunakan toLocaleString , yang kemungkinan akan melaporkan zona waktu host ketika telah dipindahkan ke zona waktu yang berbeda. Ada banyak cara yang lebih baik untuk membuat cap waktu secara manual untuk berbagai offset.
RobG
89

Sebagian besar browser desktop (bukan seluler) kecuali Safari mendukung fungsi toLocaleString dengan argumen, browser lama biasanya mengabaikan argumen.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
lambinator
sumber
4
Gagal di Firefox dan Edge :(
Šime Vidas
10
Karena gagal dalam FF dan IE11 +, solusi lain perlu ditemukan.
jdavid.net
2
Edge dan chrome menyukainya :)
Suhail Mumtaz Awan
6
Itu bekerja sekarang di Chrome v59 dan Firefox desktop v54 dan Chome di Android v59 dan Safari 10 di iOS 10.3. Itu tidak berfungsi pada IE10. Deskripsi MDN tentang Date.prototype.toLocaleString () memiliki toLocaleStringSupportsLocales()implementasi yang memungkinkan Anda memeriksa dukungan secara andal.
Peter V. Mørch
1
Berhasil diuji di node.js v8.7.0
Heinrich Ulbricht
56

Oke, temukan!

Saya menggunakan timezone-js . ini kodenya:

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
sumber
90
Saya harus memilih ini, timezone-js tidak mendukung DST dan itu tidak mengiklankan bahwa dalam readme, yang membuatnya menjadi tip buruk bagi orang yang mencari ini. Lihat: github.com/mde/timezone-js/issues/51 dan sejumlah masalah lain yang telah diajukan dan sepertinya tidak diperbaiki.
@ tidak ya, tapi benar-benar tidak ada solusi untuk manajemen zona waktu / tanggal sisi klien ... jquery ui datepicker telah membuat saya gila karena ini. Cheers
Lucas
2
@Marabunta, sepertinya moment-timezone (jawaban oleh Brian Di Palma) mendukung DST github.com/moment/moment-timezone/issues/21
welldan97
2
Jangan gunakan TimezoneJS, itu disadap sekitar perubahan DST.
matf
17

Jika Anda tidak ingin mengimpor beberapa perpustakaan besar, Anda bisa menggunakan Intl.DateTimeFormat untuk mengonversi objek Date ke zona waktu yang berbeda.

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

Offset, daylight saving, dan perubahan di masa lalu akan diurus untuk Anda.

Tak berujung
sumber
IE10 + tidak mendukung API Internasional untuk zona waktu. moment.github.io/luxon/docs/manual/matrix.html
Chloe
Ini sebenarnya jawaban terbaik. toLocaleStringmemiliki implementasi yang tidak konsisten, dan ini berfungsi dari IE11 dan seterusnya.
dlsso
FYI: Ini sebenarnya tidak berfungsi di IE11, setidaknya pada Windows 8.1. Ketika Anda mencoba membuat formatterobjek, Anda mendapatkan: `` `Nilai opsi 'Asia / Jakarta' untuk 'timeZone' di luar rentang yang valid. Diharapkan: ['UTC'] `` `
veddermatic
apakah ada cara untuk mengubah hasil akhir dari formatter menjadi objek Date lagi?
mding5692
10

Mengerti !

Ingin memaksakan tanggal yang ditampilkan = tanggal server, tidak peduli pengaturan lokal (UTC).

Server saya adalah GMT-6 -> Date baru (). GetTimezoneOffset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
Cedric Simon
sumber
2
Meskipun itu menunjukkan waktu naif yang benar, informasi zona waktu dari myOldDateObj disimpan. Jadi sebenarnya ini adalah waktu yang salah (ketika Anda menggunakan waktu sebagai contoh dalam waktu dan bukan waktu pada jam tangan).
gabn88
@ gabn88: Anda tidak akan dapat mengubah waktu server menggunakan Javascript ... Untuk memperbaiki waktu server, lakukan di level sistem operasi.
Cedric Simon
2
Saya tidak perlu memperbaiki waktu server;) Waktu server selalu UTC untuk saya. Tetapi saya memiliki organisasi yang berbeda di zona waktu yang berbeda. Dan perangkat mereka harus selalu menunjukkan waktu di mana organisasi mereka berada, di mana pun mereka berada.
gabn88
Kami memiliki masalah serupa dalam menampilkan tanggal selalu zona waktu X. Kami mencoba mengirim semua tanggal dalam format string dari server dan di browser kami hanya memperlakukannya sebagai tanggal zona waktu lokal.
Venkateswara Rao
5

Anda dapat menggunakan metode toLocaleString () untuk mengatur zona waktu.

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

Untuk India Anda dapat menggunakan "India / Natal" dan berikut ini adalah berbagai zona waktu,

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
Pembuat kode
sumber
Anda tidak mengatur zona waktu, melainkan menghasilkan string dengan waktu yang dinyatakan dalam zona waktu itu. Tanggal tetap sama.
Gerard ONeill
The toLocaleStringsolusi itu sudah diberikan 4 tahun yang lalu .
Dan Dascalescu
4

Jika Anda hanya perlu zona waktu convert Saya telah meng-upload versi dilucuti-down dari saat-zona dengan hanya functionallity minimal. Ini ~ 1KB + data:

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
sumber
2

Tetapkan variabel dengan tahun, bulan, dan hari yang dipisahkan dengan simbol '-', ditambah 'T' dan waktu dalam pola HH: mm: dd, diikuti oleh +01: 00 di akhir string (dalam kasus saya zona waktu +1). Kemudian gunakan string ini sebagai argumen untuk konstruktor tanggal.

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

Saya harus mencatat bahwa saya dibatasi sehubungan dengan perpustakaan eksternal yang dapat saya gunakan. moment.js dan timezone-js BUKAN merupakan pilihan bagi saya.

Objek tanggal js yang saya miliki adalah dalam UTC. Saya perlu mendapatkan tanggal DAN waktu dari tanggal ini di zona waktu tertentu ('Amerika / Chicago' dalam kasus saya).

 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 saat ini 6 jam lebih awal dari 'Amerika / Chicago'. Output adalah:

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

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
mencari27
sumber
11
new Date();kembalikan zona waktu setempat, bukan UTC
Mirko
1
dari dokumen:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko
Hmm. Agak membingungkan. Ini tidak mengubah zona waktu pada tanggal; melainkan menciptakan tanggal baru dengan jam yang berubah. Akan jauh lebih jelas untuk menggunakan ekspresi reguler untuk mengekstrak nilai yang Anda inginkan dari string yang dibuat dari panggilan toLocaleString.
Gerard ONeill
2

Ini kode saya, ini berfungsi dengan baik, Anda dapat mencoba dengan memberikan demo di bawah ini:

$(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
sumber
Selamat datang di StackOverflow! Bisakah Anda memberikan lebih banyak informasi seperti cara kerja kode ini dan apa fungsinya? Bagaimana cara memperbaiki masalah?
DarkSuniuM
Kode yang diberikan di atas adalah untuk memperbarui zona waktu Anda ke zona waktu negara lain.
Sahil Kapoor
Anda harus meletakkan HTML di file html Anda dan diberikan kode jquery di atas harus di footer. Ini akan bekerja untuk Anda sesuai ('en-US', {timeZone: 'America / Chicago'}) Anda perlu memperbarui dua nilai ini, jika Anda ingin zona waktu negara lain Terima kasih
Sahil Kapoor
Tidak menunggu Saya hanya memilih ini tanpa melihat dengan hati-hati. Mengapa Anda menambahkan 1 currentDateTimeCentralTimeZone.getHours()? Tanpanya itu akan bekerja dan sama dengan mencari jawaban stackoverflow.com/a/40809160/140418527
chetstone
1

Anda dapat mencoba ini juga untuk mengubah zona waktu tanggal ke India:

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
sumber
1
setelah langkah ke-2 sendiri saya mendapatkan waktu di India ... jadi mengapa Anda masih menambahkan 5 & 1/2 jam untuk itu?
user3833732
Saat menggunakan metode itu saya mendapatkan yang berikut di Norwegia ketika saya menghibur log dengan Chrome: Asli: Kamis 27 Sep 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Dimodifikasi: Kamis 27 Sep 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). “Sentraleuropeisk sommertid” berarti Waktu Musim Panas Eropa Tengah. Tidak yakin apakah itu akan berhasil ketika Anda membutuhkan waktu musim panas untuk India, atau sebaliknya ketika Anda berada di India dan membutuhkan waktu musim panas untuk Eropa, dan sebagainya.
Kebman
Menggunakan setHours () seperti ini tidak memperhitungkan transisi hari, bulan, tahun, misalnya jam 3:30 pagi di Dell Baru pada tanggal 8 adalah jam 11 malam pada tanggal 7 di London. Kemudian pertimbangkan akhir bulan, tahun dan hari kabisat. Minta Date melakukan itu matematika <pre> biarkan local_time = Tanggal baru (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); biarkan date_str = local_time.toISOString (). slice (0, 10); biarkan time_str = local_time.toISOString (). slice (11, -1); biarkan timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland
1

Setelah melihat-lihat banyak termasuk tautan dari halaman ini saya menemukan artikel yang bagus ini, menggunakan zona waktu saat:

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

Untuk meringkasnya:

Dapatkan zona waktu pengguna

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

Pengembalian misalnya: Zona Waktu: Eropa / London

Tetapkan zona waktu pengguna default

moment.tz.setDefault(tz);

Tetapkan zona waktu khusus

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

Ubah tanggal / waktu menjadi zona waktu lokal, asumsikan tanggal / waktu asli dalam UTC

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

Pengembalian: Minggu, 25 Desember 2016, 7:00 pagi

Ubah tanggal / waktu menjadi LA Time

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

Pengembalian: Sabtu, 24 Desember 2016, 11:00 malam

Mengkonversi dari waktu LA ke London

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

Pengembalian: Minggu, 25 Desember 2016, 15:00

omarjebari
sumber
1

Anda juga dapat menggunakan https://www.npmjs.com/package/ctoc_timezone

Itu telah mendapat implementasi sederhana dan kustomisasi format.

Mengubah format di toTimeZone:

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

Output:

28th Feb 2013 19:00:00 EST

Anda dapat menjelajahi berbagai fungsi dalam dokumen.

Sandeep Chowdary
sumber
0

ada modul npm bernama 'timezones.json' yang dapat Anda gunakan untuk ini; pada dasarnya terdiri dari file json dengan objek yang berisi informasi tentang penghematan siang hari dan offset, ....

untuk asia / jakarta akan dapat mengembalikan objek ini:

{
  "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"
  ]
}

Anda dapat menemukannya di sini:

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

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

semoga bermanfaat

Kevin
sumber
0

Orang yang akrab dengan java.timepaket java 8 , atau joda-timemungkin akan menyukai anak baru di blok: perpustakaan js-joda .

Install

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

Contoh

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

Di alam java yang sebenarnya, itu cukup verbose lol. Tapi, menjadi perpustakaan java porting, terutama mengingat mereka porting kasus uji 1800, mereka juga mungkin bekerja dengan sangat akurat.

Manipulasi chrono sulit. Itu sebabnya banyak perpustakaan lainnya bermasalah dalam kasus tepi. Moment.js tampaknya mendapatkan zona waktu yang tepat, tetapi ls lainnya yang saya lihat, termasuk timezone-js, tampaknya tidak dapat dipercaya.

kambing
sumber
0

Saya baru-baru ini melakukan ini dalam naskah:

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

Saya Menggunakan format "en-UK" karena formatnya sederhana. Bisa jadi "en-US" atau apa pun yang berhasil.

Jika argumen pertama adalah zona waktu lokal Anda dan yang kedua adalah zona waktu target Anda, ia mengembalikan objek Tanggal dengan offset yang benar.

Alexandre Liscia
sumber
0

Saya mengalami masalah menggunakan Moment Timezone . Saya menambahkan jawaban ini hanya jika ada orang lain yang menghadapi masalah yang sama. Jadi saya punya string tanggal yang 2018-06-14 13:51:00berasal dari API. Saya tahu ini disimpan diUTC tetapi string tidak berbicara sendiri.

Saya beri tahu zona waktu saat ini, dari zona mana tanggal ini berasal dengan melakukan:

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

Sekarang saya ingin mengubahnya menjadi zona waktu tertentu dengan melakukan:

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
sumber
0

Cukup atur zona waktu negara keinginan Anda dan Anda dapat dengan mudah menampilkannya dalam pembaruan html menggunakan fungsi SetInteval () setelah setiap satu menit. function formatAMPM () mengelola format 12 jam dan tampilan waktu 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
sumber
-1

Saya tidak tahu metode mudah untuk mengonversi objek tanggal ke zona waktu mana pun, tetapi jika Anda ingin mengubahnya menjadi zona waktu lokal, Anda bisa mengonversinya dengan Date.prototype.getTime()jumlah milidetik yang sesuai, dan kembali lagi.

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

Misalnya, date.getHours()sekarang akan kembali, 15bukan 13jika Anda, seperti saya, di Austria (dan ini musim panas).

Saya telah membaca bahwa berbagai fungsi datetime dapat menunjukkan perilaku non-standar di beberapa browser, jadi uji ini terlebih dahulu. Saya dapat mengonfirmasi bahwa itu berfungsi di Chrome.

黄 雨伞
sumber
1
Mengapa ini ditolak? Sejauh ini, ini adalah cara termudah dan terbaik untuk melakukan ini. Sebagian besar jawaban di atas tidak mempertimbangkan waktu musim panas / musim dingin
MortenSickel
Apa gunanya baris kedua? Konstruktor Tanggal mengasumsikan zona waktu lokal Anda sudah. Kedua baris ini mengembalikan tanggal di zona waktu browser lokal, dan tidak menjawab pertanyaan tentang cara mengonversi ke zona waktu lain dengan waktu musim panas.
Chloe
-1

Offset Zona Waktu untuk zona waktu Anda saat ini

date +%s -d '1 Jan 1970'

Untuk zona waktu GMT + 10 (Australia) saya mengembalikan -36000

anthony
sumber
-6

pengubah jam manual cepat dan kotor dan kembali:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
Jerry
sumber
terlalu kotor (dan terlalu berantakan)
Maxwell sc