Dalam aplikasi JS, saya menerima stempel waktu (persamaan 1270544790922
) dari server (Ajax).
Berdasarkan stempel waktu itu saya membuat Date
objek menggunakan:
var _date = new Date();
_date.setTime(1270544790922);
Sekarang, _date
stempel waktu yang didekodekan dalam zona waktu lokal pengguna saat ini. Saya tidak menginginkan itu.
Saya ingin _ date
mengonversi stempel waktu ini ke waktu saat ini di kota Helsinki di Eropa (dengan mengabaikan zona waktu pengguna saat ini).
Bagaimana saya bisa melakukan itu?
javascript
date
timezone
warpech
sumber
sumber
Jawaban:
Nilai yang mendasari objek Tanggal sebenarnya dalam UTC. Untuk membuktikan ini, perhatikan bahwa jika Anda mengetik
new Date(0)
Anda akan melihat sesuatu seperti:Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
. 0 diperlakukan sebagai 0 dalam GMT, tetapi.toString()
metode menunjukkan waktu lokal.Catatan besar, UTC adalah singkatan dari kode waktu Universal . Waktu saat ini di 2 tempat berbeda adalah UTC yang sama, tetapi keluarannya dapat diformat secara berbeda.
Yang kita butuhkan di sini adalah beberapa pemformatan
Ini berfungsi tetapi .... Anda tidak dapat benar-benar menggunakan metode tanggal lain untuk tujuan Anda karena metode tersebut menjelaskan zona waktu pengguna. Yang Anda inginkan adalah objek tanggal yang terkait dengan zona waktu Helsinki. Pilihan Anda saat ini adalah menggunakan beberapa pustaka pihak ketiga (saya merekomendasikan ini), atau meretas objek tanggal sehingga Anda dapat menggunakan sebagian besar metodenya.
Opsi 1 - pihak ketiga seperti zona waktu-momen
Ini terlihat jauh lebih elegan daripada yang akan kita lakukan selanjutnya.
Opsi 2 - Retas objek tanggal
Ia masih menganggap itu GMT-0700 (PDT), tetapi jika Anda tidak menatap terlalu keras, Anda mungkin dapat salah mengira itu sebagai objek tanggal yang berguna untuk tujuan Anda.
Saya dengan mudah melewatkan satu bagian. Anda harus bisa mendefinisikan
currentHelsinkiOffset
. Jika Anda dapat menggunakandate.getTimezoneOffset()
di sisi server, atau hanya menggunakan beberapa pernyataan if untuk menjelaskan kapan perubahan zona waktu akan terjadi, itu seharusnya menyelesaikan masalah Anda.Kesimpulan - Saya pikir terutama untuk tujuan ini Anda harus menggunakan perpustakaan tanggal seperti zona waktu-momen .
sumber
*60*60
seharusnya demikian*60000
, karena getTime dalam milidetik dan getTimezoneOffset dalam hitungan menit, yang mana ada 60.000 milidetik dalam satu menit, bukan 60 * 60 == 3600Untuk memperhitungkan milidetik dan zona waktu pengguna, gunakan yang berikut ini:
sumber
Hanya pendekatan lain
Bersulang!
sumber
new Date().getTimezoneOffset()
harus diubah menjadinew Date(timestampStr).getTimezoneOffset()
Saya curiga, Jawabannya tidak memberikan hasil yang benar. Dalam pertanyaan, penanya ingin mengubah stempel waktu dari server ke waktu saat ini di Hellsinki dengan mengabaikan zona waktu pengguna saat ini.
Ini adalah fakta bahwa zona waktu pengguna bisa menjadi apa pun sehingga kami tidak dapat mempercayainya.
Jika mis. timestamp adalah 1270544790922 dan kami memiliki fungsi:
Ketika seorang warga New York mengunjungi halaman, peringatan (_helsenkiTime) mencetak:
Dan saat orang Finlandia mengunjungi halaman tersebut, alert (_helsenkiTime) mencetak:
Jadi fungsinya benar hanya jika pengunjung halaman memiliki zona waktu target (Eropa / Helsinki) di komputernya, tetapi gagal di hampir setiap bagian lain dunia. Dan karena stempel waktu server biasanya stempel waktu UNIX, yang menurut definisi dalam UTC, jumlah detik sejak Unix Epoch (1 Januari 1970 00:00:00 GMT), kami tidak dapat menentukan DST atau non-DST dari stempel waktu.
Jadi solusinya adalah untuk MENGHINDARI zona waktu pengguna saat ini dan menerapkan beberapa cara untuk menghitung UTC offset apakah tanggal tersebut dalam DST atau tidak. Javascript tidak memiliki metode asli untuk menentukan riwayat transisi DST zona waktu lain selain zona waktu pengguna saat ini. Kita dapat mencapai ini paling sederhana dengan menggunakan skrip sisi server, karena kita memiliki akses mudah ke basis data zona waktu server dengan seluruh riwayat transisi dari semua zona waktu.
Tetapi jika Anda tidak memiliki akses ke database zona waktu server (atau server lain) DAN stempel waktunya dalam UTC, Anda bisa mendapatkan fungsi serupa dengan melakukan hard coding aturan DST dalam Javascript.
Untuk mencakup tanggal di tahun 1998 - 2099 di Eropa / Helsinki, Anda dapat menggunakan fungsi berikut ( jsfiddled ):
Contoh penggunaan:
Dan ini mencetak yang berikut terlepas dari zona waktu pengguna:
Tentu saja jika Anda dapat mengembalikan stempel waktu dalam bentuk yang offset (DST atau non-DST) sudah ditambahkan ke stempel waktu di server, Anda tidak perlu menghitungnya di sisi klien dan Anda dapat banyak menyederhanakan fungsinya. TAPI ingat untuk TIDAK menggunakan timezoneOffset (), karena Anda harus berurusan dengan zona waktu pengguna dan ini bukan perilaku yang diinginkan.
sumber
Anggap Anda mendapatkan stempel waktu dalam waktu Helsinki, saya akan membuat objek tanggal yang disetel ke tengah malam 1 Januari 1970 UTC (untuk mengabaikan setelan zona waktu lokal browser). Kemudian tambahkan saja jumlah milidetik yang dibutuhkan.
Hati-hati nanti, untuk selalu menanyakan nilai UTC dari objek tanggal. Dengan cara ini pengguna akan melihat nilai tanggal yang sama terlepas dari pengaturan lokal. Jika tidak, nilai tanggal akan bergeser sesuai dengan pengaturan waktu lokal.
sumber
Anda bisa menggunakan
setUTCMilliseconds()
sumber
setUTCMilliseconds()
Metode ini menyetel milidetik untuk tanggal tertentu sesuai dengan waktu universal. [...] Jika parameter yang Anda tentukan berada di luar kisaran yang diharapkan,setUTCMilliseconds()
mencoba memperbarui informasi tanggal di objek Tanggal sesuai dengan itu. Dengan kata lain, Anda membuatDate
objek yang memiliki stempel waktu Unix yang diberikan, pada UTC.