JavaScript 中的getTimezoneOffset()
方法在浏览器中返回从 00:00 时区偏移的分钟数。例如,夏令时 (DST) 中的 America/New_York 时区返回数字 300。300 分钟与零相差 5 小时。300 分钟除以 60 分钟等于 5 小时。每个时区都与零时区比较,+00:00 / Etc/GMT / 格林威治时间。
MDN 网络文档
您必须知道的下一件事是偏移量与实际时区的符号相反。
有关时区的信息由 Internet 号码分配机构 (iana) 维护
伊安娜时区
joda.org 提供了格式良好的时区表
joda-time 时区
+00:00 或 Etc/GMT 是格林威治时间
所有时区均偏离 +00:00 /“Etc/GMT”/格林威治时间
夏令时总是比夏季的“常规”时间更早。你把你的时钟拨回了秋季。(“后退”口号记住该做什么)
因此,夏令时(冬季)中的 America/New_York 时间比常规时间早一小时。因此,例如,夏季纽约市通常下午 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
因此,现在您可以在 1 月创建一个日期,然后查看浏览器返回的冬季时区偏移量。
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
}