getTimezoneOffset()
วิธีการใน JavaScript ในเบราว์เซอร์จะส่งกลับจำนวนนาทีชดเชยจากโซนเวลา 00:00 ตัวอย่างเช่นเขตเวลา America / New_York ใน Daylight Savings (DST) จะส่งกลับหมายเลข 300 300 นาทีแตกต่างจากศูนย์ 5 ชั่วโมง 300 นาทีหารด้วย 60 นาทีคือ 5 ชั่วโมง ทุกเขตเวลาจะถูกเปรียบเทียบกับโซนเวลาเป็นศูนย์เวลา +00: 00 / Etc / GMT / Greenwich
เอกสาร MDN เว็บ
สิ่งต่อไปที่คุณต้องรู้คือออฟเซ็ตมีเครื่องหมายตรงข้ามของเขตเวลาจริง
ข้อมูลเกี่ยวกับเขตเวลาได้รับการดูแลโดยหน่วยงานที่กำหนดหมายเลขอินเทอร์เน็ต (iana)
เขตเวลาของ Iana
ตารางเวลาที่จัดรูปแบบเป็นอย่างดีจัดทำโดย joda.org
เขตเวลา joda
+00: 00 หรือ Etc / GMT เป็นเวลาของ Greenwich
เขตเวลาทั้งหมดถูกชดเชยจาก +00: 00 / "Etc / GMT" / เวลา Greenwich
เวลาออมแสงมักจะเร็วกว่าเวลา "ปกติ" ในฤดูร้อนเสมอ คุณตั้งนาฬิกาของคุณกลับมาในฤดูใบไม้ร่วง ("ถอยกลับ" สโลแกนเพื่อระลึกถึงสิ่งที่ต้องทำ)
ดังนั้นเวลาอเมริกา / New_York ใน Daylight Saving (ฤดูหนาว) คือหนึ่งชั่วโมงก่อนเวลาปกติ ตัวอย่างเช่นสิ่งที่ปกติคือ 5 โมงเย็นในเมืองนิวยอร์กในฤดูร้อนตอนนี้เป็นเวลา 4 โมงเย็นอเมริกา / นิวยอร์กเวลาออมแสงตามฤดูกาล ชื่อ "America / New_York" เวลาเป็นชื่อโซน "Long Format" ชายฝั่งตะวันออกของสหรัฐอเมริกามักจะเรียกเขตเวลาของพวกเขาเวลามาตรฐานตะวันออก (EST)
หากคุณต้องการเปรียบเทียบการชดเชยเขตเวลาของวันนี้กับการชดเชยเขตเวลาของวันที่อื่นคุณต้องทราบว่าเครื่องหมายทางคณิตศาสตร์ (+/- "ค่าบวก / ค่าลบ") ของการชดเชยเขตเวลาตรงข้ามกับเขตเวลา
ดูตารางโซนเวลาที่ joda.org และค้นหาโซนเวลาสำหรับ "America / New_York" โดยจะมีเครื่องหมายลบหน้า Standard Offset
โลกหมุนทวนเข็มนาฬิกาบนแกนของมัน คนดูพระอาทิตย์ขึ้นในกรีนนิชเห็นพระอาทิตย์ขึ้น 5 ชั่วโมงก่อนที่ใครบางคนในนิวยอร์กซิตี้จะเห็นพระอาทิตย์ขึ้น และใครบางคนบนชายฝั่งตะวันตกของสหรัฐอเมริกาจะเห็นพระอาทิตย์ขึ้นหลังจากที่ใครบางคนบนชายฝั่งตะวันออกของสหรัฐอเมริกาเห็นพระอาทิตย์ขึ้น
มีเหตุผลที่คุณต้องรู้ทั้งหมดนี้ เพื่อที่คุณจะสามารถทราบได้อย่างมีเหตุผลว่ารหัส JavaScript บางอย่างกำลังได้รับสถานะ DST อย่างถูกต้องหรือไม่โดยไม่จำเป็นต้องทดสอบทุกโซนเวลาในช่วงเวลาต่างๆของปี
ลองนึกภาพว่ามันคือเดือนพฤศจิกายนในนิวยอร์กซิตี้และนาฬิกาตั้งเวลาไว้หนึ่งชั่วโมง ในฤดูร้อนในมหานครนิวยอร์กค่าชดเชยคือ 240 นาทีหรือ 4 ชั่วโมง
คุณสามารถทดสอบสิ่งนี้ได้โดยการสร้างวันที่ในเดือนกรกฎาคมและได้รับการชดเชย
var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();
console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)
สิ่งที่จะพิมพ์ไปยังบันทึกคอนโซลเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของเบราว์เซอร์
คำตอบคือ: 240
ดังนั้นตอนนี้คุณสามารถสร้างวันที่ในเดือนมกราคมและดูว่าเบราว์เซอร์ของคุณส่งคืนอะไรในเขตเวลาชดเชยในฤดูหนาว
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)
คำตอบคือ: 300
เห็นได้ชัดว่า 300 ใหญ่กว่า 240 ดังนั้นสิ่งนี้หมายความว่าอย่างไร คุณควรเขียนโค้ดที่ทดสอบสำหรับการชดเชยช่วงฤดูหนาวที่ใหญ่กว่าการชดเชยช่วงฤดูร้อนหรือไม่? หรือฤดูร้อนชดเชยน้อยกว่าฤดูหนาวชดเชย หากมีความแตกต่างระหว่างการชดเชยเวลาในฤดูร้อนและฤดูหนาวคุณสามารถสันนิษฐานได้ว่า DST กำลังถูกใช้สำหรับโซนเวลานี้ แต่นั่นไม่ได้บอกคุณว่าวันนี้ใช้ DST สำหรับเขตเวลาของเบราว์เซอร์หรือไม่ ดังนั้นคุณจะต้องได้รับการชดเชยเวลาในวันนี้
var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();
console.log('todaysTimeZone : ' + todaysTimeZone)
คำตอบคือ:? - ขึ้นอยู่กับช่วงเวลาของปี
หากการชดเชยเขตเวลาของวันนี้และการชดเชยเขตเวลาในฤดูร้อนเหมือนกันและการชดเชยโซนฤดูร้อนและฤดูหนาวจะแตกต่างกันดังนั้นการหักลอจิคัลจะต้องไม่เป็น DST
คุณสามารถละเว้นการเปรียบเทียบออฟเซ็ตเขตเวลาฤดูร้อนและฤดูหนาว (หากต้องการทราบว่าใช้ DST สำหรับโซนเวลานี้หรือไม่) และเพียงเปรียบเทียบออฟเซ็ตเขตเวลาของวันนี้กับออฟเซ็ต TZ ฤดูร้อนและรับคำตอบที่ถูกต้องเสมอ
today's TZ Offset !== Summer TZ Offset
ในวันนี้คือฤดูหนาวหรือฤดูร้อน? หากคุณรู้ว่าคุณสามารถใช้ตรรกะต่อไปนี้:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
แต่ปัญหาคือว่าคุณไม่ทราบว่าวันที่วันนี้อยู่ในฤดูหนาวหรือฤดูร้อน ทุกเขตเวลาสามารถมีกฎของตนเองได้เมื่อ DST เริ่มต้นและหยุด คุณต้องติดตามทุกกฎของเขตเวลาสำหรับทุกเขตเวลาในโลก ดังนั้นหากมีวิธีที่ดีกว่าและง่ายกว่าคุณก็อาจทำวิธีที่ดีกว่าและง่ายกว่าก็ได้
สิ่งที่เราเหลือคือคุณต้องรู้ว่าเขตเวลานี้ใช้ DST หรือไม่จากนั้นเปรียบเทียบการชดเชยเขตเวลาของวันนี้กับการชดเชยเขตเวลาฤดูร้อน นั่นจะให้คำตอบที่น่าเชื่อถือเสมอ
ตรรกะสุดท้ายคือ:
if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
ฟังก์ชั่นเพื่อตรวจสอบว่าเขตเวลาในเบราว์เซอร์ใช้ 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
ส่งคืนค่าผกผันดังนั้นMath.max
จึงส่งคืนออฟเซ็ตมาตรฐาน รหัสถูกต้อง