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.
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
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.
var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
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.
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
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?
today's TZ Offset !== Summer TZ Offset
Nah, apakah hari ini di musim dingin atau musim panas? Jika Anda tahu itu maka Anda bisa menerapkan logika berikut:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
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:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
Berfungsi untuk menentukan apakah zona waktu di browser menggunakan DST:
function is_DST_Used_In_This_TimeZone() {
var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet
offsetsNotEqual, thisYear, today;
today = new Date();//Create a date object that is now
thisYear = today.getFullYear();//Get the year as a number
Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();
console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)
July_Date = new Date(thisYear, 6, 1);
july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal
console.log('offsetsNotEqual: ' + offsetsNotEqual);
return offsetsNotEqual;//If the offsets are not equal for summer and
//winter then the only possible reason is that DST is used for
//this time zone
}
getTimezoneOffset
mengembalikan nilai terbalik, makaMath.max
memang mengembalikan offset standar . Kode itu benar.