Ini adalah sedikit kode JS saya yang diperlukan:
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
Saya ingin mendapatkan datetime di "lalu", tetapi jika DST sedang digunakan maka tanggal dimatikan oleh 1 jam. Saya tidak tahu bagaimana memeriksa apakah DST berlaku atau tidak.
Bagaimana saya bisa tahu kapan penghematan siang hari dimulai dan berakhir?
sumber
getTimezoneOffset
mengembalikan nilai terbalik, makaMath.max
memang mengembalikan offset standar . Kode itu benar.Buat dua tanggal: satu di bulan Juni, satu di bulan Januari. Bandingkan nilai getTimezoneOffset () mereka.
Sekarang periksa getTimezoneOffset () dari tanggal saat ini.
sumber
Jawaban ini sangat mirip dengan jawaban yang diterima, tetapi tidak mengesampingkan
Date
prototipe, dan hanya menggunakan satu pemanggilan fungsi untuk memeriksa apakah Daylight Savings Time berlaku, bukan dua.Idenya adalah bahwa, karena tidak ada negara yang mengamati DST yang berlangsung selama 7 bulan [1] , di daerah yang mengamati DST, offset dari waktu UTC pada bulan Januari akan berbeda dengan yang di bulan Juli.
Saat Daylight Savings Time memindahkan jam ke depan , JavaScript selalu mengembalikan nilai lebih besar selama Waktu Standar. Karenanya, mendapatkan offset minimum antara Januari dan Juli akan mendapatkan zona waktu offset selama DST.
Kami kemudian memeriksa apakah zona waktu tanggal sama dengan nilai minimum itu. Jika ya, maka kita berada di DST; kalau tidak, kita tidak.
Fungsi berikut menggunakan algoritma ini. Dibutuhkan objek tanggal
d
,, dan kembalitrue
jika waktu musim panas berlaku untuk tanggal tersebut, danfalse
jika tidak:sumber
Math.max(...) != d.get...()
, itu akan mengembalikan true jika DST diamati dalam zona waktu yang diberikan DAN tanggal saat ini di DST. Jika DST tidak diamati atau tanggal cocok dengan standar offset, itu akan kembali salah.Saya dihadapkan dengan masalah yang sama hari ini, tetapi karena daylight saving kami mulai dan berhenti pada waktu yang berbeda dari Amerika Serikat (setidaknya dari pemahaman saya), saya menggunakan rute yang sedikit berbeda ..
Maka Anda cukup membandingkan offset zona waktu saat ini dengan DST dan nonDST untuk melihat mana yang cocok.
sumber
Berdasarkan komentar Matt Johanson tentang solusi yang diberikan oleh Sheldon Griffin, saya membuat kode berikut:
Itu mencoba untuk mendapatkan yang terbaik dari semua dunia dengan mempertimbangkan semua komentar dan jawaban yang disarankan sebelumnya dan secara khusus:
1) Tembolok hasil untuk stdTimezoneOffset per tahun sehingga Anda tidak perlu menghitung ulang saat menguji beberapa tanggal pada tahun yang sama.
2) Ini tidak berasumsi bahwa DST (jika ada sama sekali) harus pada bulan Juli, dan akan bekerja bahkan jika itu akan pada suatu titik dan suatu tempat akan ada bulan. Namun Performa akan bekerja lebih cepat jika memang Juli (atau dekat bulan) memang DST.
3) Kasus yang lebih buruk itu akan membandingkan getTimezoneOffset dari yang pertama setiap bulan. [dan lakukan itu Sekali per tahun yang diuji].
Asumsi itu masih membuat adalah bahwa jika ada periode DST lebih besar dari satu bulan.
Jika seseorang ingin menghapus asumsi itu, ia dapat mengubah lingkaran menjadi sesuatu yang lebih seperti apa yang ada di solutin yang disediakan oleh Aaron Cole - tapi saya masih akan melompat setengah tahun ke depan dan keluar dari lingkaran ketika dua offset berbeda ditemukan]
sumber
The moment.js perpustakaan menyediakan
.isDst()
metode pada objek waktunya.sumber
The
getTimezoneOffset()
metode dalam JavaScript, dalam browser, mengembalikan jumlah menit offset dari zona 00:00 waktu. Misalnya, zona waktu America / New_York di Daylight Savings (DST) mengembalikan angka 300. 300 menit adalah perbedaan 5 jam dari nol. 300 menit dibagi 60 menit adalah 5 jam. Setiap zona waktu dibandingkan dengan zona waktu nol, +00: 00 / Dll / GMT / Waktu Greenwich.Dokumen Web MDN
Hal berikutnya yang harus Anda ketahui, adalah offset memiliki tanda kebalikan dari zona waktu aktual.
Informasi tentang zona waktu dikelola oleh Otoritas Angka yang Ditugaskan Internet (iana)
zona waktu iana
Tabel Zona Waktu yang diformat dengan baik disediakan oleh joda.org
Zona Waktu joda-waktu
+00: 00 atau Dll / GMT adalah waktu Greenwich
Semua zona waktu diimbangi dari +00: 00 / "Dll / GMT" / Waktu Greenwich
Waktu Musim Panas selalu lebih awal dari waktu "reguler" di musim panas. Anda mengatur jam Anda kembali di musim gugur. (Slogan "Fall Back" untuk mengingat apa yang harus dilakukan)
Jadi, waktu Amerika / New_York di Daylight Savings (musim dingin) adalah satu jam sebelum waktu reguler. Jadi, misalnya, apa yang biasanya jam 5 sore di kota New York di musim panas, sekarang jam 4 sore Amerika / waktu New York di Daylight Savings. Nama waktu "Amerika / New_York" adalah nama zona waktu "Format Panjang". Pantai timur AS biasanya menyebut zona waktu mereka Eastern Standard Time (EST)
Jika Anda ingin membandingkan offset zona waktu hari ini dengan offset zona waktu pada beberapa tanggal lain, Anda perlu tahu bahwa tanda matematika (+/- "Positif / Negatif") dari zona waktu offset adalah kebalikan dari zona waktu.
Lihatlah tabel zona waktu di joda.org dan temukan zona waktu untuk "Amerika / New_York" Ini akan memiliki tanda negatif di depan Offset Standar.
Bumi berputar berlawanan arah jarum jam pada porosnya. Seseorang yang menyaksikan matahari terbit di Greenwich melihat matahari terbit 5 jam sebelum seseorang di Kota New York melihat matahari terbit. Dan seseorang di Pantai Barat AS akan melihat matahari terbit setelah seseorang di Pantai Timur AS melihat matahari terbit.
Ada alasan mengapa Anda perlu mengetahui semua ini. Sehingga Anda dapat menentukan secara logis apakah beberapa kode JavaScript mendapatkan status DST dengan benar atau tidak, tanpa perlu menguji setiap zona waktu pada waktu yang berbeda dalam setahun.
Bayangkan bulan November di New York City, dan jam telah diatur mundur satu jam. Di musim panas di New York City, offset adalah 240 menit atau 4 jam.
Anda dapat menguji ini dengan membuat tanggal pada bulan Juli dan kemudian mendapatkan offsetnya.
Apa yang akan dicetak ke log konsol alat pengembang browser?
Jawabannya adalah: 240
Jadi, sekarang Anda dapat membuat tanggal di Januari dan melihat apa yang dikembalikan browser Anda untuk offset zona waktu untuk musim dingin.
Jawabannya adalah: 300
Jelas 300 lebih besar dari 240. Jadi, apa artinya ini? Haruskah Anda menulis kode yang menguji offset musim dingin lebih besar daripada offset musim panas? Atau offset musim panas kurang dari offset musim dingin? Jika ada perbedaan antara offset zona waktu musim panas dan musim dingin, maka Anda dapat mengasumsikan bahwa DST digunakan untuk zona waktu ini. Tetapi itu tidak memberi tahu Anda jika hari ini menggunakan DST untuk zona waktu browser. Jadi, Anda harus mendapatkan offset zona waktu untuk hari ini.
Jawabannya adalah:? - Tergantung pada waktu tahun
Jika offset zona waktu hari ini dan offset zona waktu musim panas adalah sama, DAN offset zona waktu musim panas dan musim dingin berbeda, maka dengan deduksi logis, hari ini TIDAK boleh dalam DST.
Dapatkah Anda menghilangkan membandingkan offset zona waktu musim panas dan musim dingin, (Untuk mengetahui apakah DST digunakan untuk zona waktu ini) dan hanya membandingkan offset zona waktu hari ini dengan offset TZ musim panas, dan selalu mendapatkan jawaban yang benar?
Nah, apakah hari ini di musim dingin atau musim panas? Jika Anda tahu itu maka Anda bisa menerapkan logika berikut:
Tetapi masalahnya adalah, Anda tidak tahu apakah kencan hari ini di musim dingin atau musim panas. Setiap zona waktu dapat memiliki aturannya sendiri untuk kapan DST dimulai dan berhenti. Anda harus melacak aturan setiap zona waktu untuk setiap zona waktu di dunia. Jadi, jika ada cara yang lebih baik dan lebih mudah maka Anda mungkin melakukannya dengan cara yang lebih baik dan lebih mudah.
Yang tersisa, adalah Anda perlu tahu apakah zona waktu ini menggunakan DST, dan kemudian membandingkan zona waktu hari ini dengan zona waktu musim panas. Itu akan selalu memberi Anda jawaban yang dapat diandalkan.
Logika terakhir adalah:
Berfungsi untuk menentukan apakah zona waktu di browser menggunakan DST:
sumber
Gunakan Moment.js ( https://momentjs.com/ )
moment().isDST();
akan memberi Anda jika penghematan cahaya Hari diamati.Juga memiliki fungsi pembantu untuk menghitung waktu relatif untuk Anda. Anda tidak perlu melakukan perhitungan manual misalnya
moment("20200105", "YYYYMMDD").fromNow();
sumber
Anda sudah dekat tetapi sedikit off. Anda tidak perlu menghitung waktu Anda sendiri karena ini adalah hasil dari jam Anda sendiri. Itu dapat mendeteksi jika Anda menggunakan waktu musim panas di lokasi Anda tetapi tidak untuk lokasi jarak jauh yang diproduksi oleh offset:
Ini akan tetap salah dan mati satu jam jika mereka berada di DST. Anda memerlukan akun waktu jauh jika mereka berada di dalam DST mereka atau tidak dan menyesuaikannya. coba hitung ini dan ubah jam Anda ke - misalkan 2/1/2015 dan reset jam satu jam seolah-olah di luar DST. Kemudian hitung untuk offset untuk tempat yang masih tertinggal 2 jam. Ini akan menunjukkan satu jam di depan jendela dua jam. Anda masih perlu menghitung jam dan menyesuaikannya. Saya melakukannya untuk NY dan Denver dan selalu salah (jam depan) di Denver.
sumber
Saya telah menemukan bahwa menggunakan perpustakaan Moment.js dengan beberapa konsep yang dijelaskan di sini (membandingkan Jan hingga Juni) bekerja sangat baik.
Fungsi sederhana ini akan mengembalikan apakah zona waktu yang digunakan pengguna dalam mengamati Daylight Saving Time:
Cara sederhana untuk memeriksa apakah ini berfungsi (pada Windows) adalah mengubah zona waktu Anda menjadi zona non DST, misalnya Arizona akan mengembalikan false, sedangkan EST atau PST akan mengembalikan true.
sumber
Solusi Masa Depan-Bukti Yang Bekerja Di Semua Zona Waktu
x
menjadi jumlah yang diharapkan dari milidetik ke tahun bunga tanpa memperhitungkan penghematan siang hari.y
menjadi jumlah milidetik sejak Zaman sejak awal tahun tanggal bunga.z
menjadi jumlah milidetik sejak Zaman penuh tanggal dan waktu menarikt
menjadi pengurangan dari keduax
dany
dariz
:z - y - x
. Ini menghasilkan offset karena DST.t
nol, maka DST tidak berlaku. Jikat
tidak nol, maka DST berlaku.Saya percaya bahwa cuplikan kode di atas lebih unggul daripada semua jawaban lain yang diposting di sini karena berbagai alasan.
Namun, jika Anda tidak mempersiapkan lebih dari 2 periode DST, maka kode di bawah ini dapat digunakan untuk menentukan apakah DST berlaku sebagai boolean.
sumber
Saya baru-baru ini perlu membuat string tanggal dengan UTC dan DST, dan berdasarkan jawaban Sheldon saya menyatukan ini:
sumber
Apakah ada masalah menggunakan
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Tampaknya ini kompatibel dengan semua browser.
sumber
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
Gaya ES6
sumber