getTimezoneOffset()
該方法在JavaScript中,在瀏覽器中,返回分鐘從00:00時區偏移的數目。例如,夏令時(DST)中的America/New_York時區返回數字300. 300分鐘與零差距爲5小時。 300分鐘除以60分鐘是5小時。每個時區都與零時區相比,+00:00/Etc/GMT /格林威治時間。
MDN Web Docs
,你必須知道的下一件事,就是偏移具有實際的時區的符號相反。
有關時區的信息由互聯網編號分配機構保持(IANA)
iana time zones
一個很好的格式化時區的表由joda.org
joda-time Time Zones
供給+00:00或其他格林威治時間
所有時區ar e從+00:00 /「Etc/GMT」/格林尼治時間偏移
夏令時總是比夏季的「正常」時間早。你在秋季設置你的時鐘。 (「回退」的口號,以記住該做什麼)
因此,美國/紐約時間在夏令時(冬季)是一小時前的正常時間。所以,例如,通常是下午5點。在夏天的紐約市下午,現在是下午4點。美國/紐約時間夏令時。名稱「America/New_York」時間是「長格式」時區名稱。美國東海岸通常會呼叫他們的時區東部標準時間(EST)
如果您想比較今天的時區偏移量與其他日期的時區偏移量,則需要知道數學符號(+/- - 「正/負」)時區偏移與時區相反。
查看joda.org的時區表,找到「America/New_York」的時區。它在標準偏移量前面會有一個負號。
地球在其軸上逆時針旋轉。在紐約市有人看到日出前5個小時,一個人在格林威治觀看日出即可看到日出。在美國東海岸的人看到日出之後,美國西海岸的人會看到日出。
有一個原因,你需要知道所有這些。這樣您就可以從邏輯上確定某些JavaScript代碼是否正確獲取DST狀態,而無需在一年的不同時間測試每個時區。
想象一下,它是11月在紐約市,時鐘已經被設置了一個小時。在紐約市的夏天,抵消是240分鐘或4小時。
您可以通過創建一個7月份的日期然後獲取偏移量來測試。
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。
您可以省略比較夏令時和冬令時偏移(要知道夏令時是否用於此時區),並將今日時區偏移與夏季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;
}
功能,以確定是否在瀏覽器中的時區使用夏令時:
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
}
我可以驗證這個工程國際。目前沒有使用任何形式的DST的時區,其中1月1日和7月1日都在DST期間或兩者都有。此外,在TZDB的所有時區([有一個微不足道的例外](http://en.wikipedia.org/wiki/Antarctica/Casey)),兩個偏移量中較大的一個是DST偏移量。由於JavaScript的'getTimezoneOffset'返回反值,因此'Math.max'確實返回*標準*偏移量。代碼是正確的。 – 2013-04-08 21:39:33
然而,如果任何時區改變其定義,使得1月1日和7月1日都在DST中,或者在DST中都有* not *(並且DST仍然適用),則此代碼在該區域中將不起作用。 – 2013-04-08 21:40:37
這很好。能夠設置一個內部常量真的很不錯,如: 'TIMEZONE_OFFSET =((new Date())。dst())?'-04:00':'-05:00'' – nessur 2013-06-20 18:57:11