JavaScript 中的 getTimezoneOffset() 方法在浏览器中返回从 00:00 时区偏移的分钟数。例如,夏令时 (DST) 中的 America/New_York 时区返回数字 300。300 分钟与零相差 5 小时。 300 分钟除以 60 分钟等于 5 小时。每个时区都与零时区进行比较,+00:00 / Etc/GMT / 格林威治时间。
MDN Web Docs
接下来您必须知道的是,偏移量与实际时区的符号相反。
时区信息由 Internet 号码分配机构 (iana) 维护
iana time zones
joda.org 提供格式精美的时区表
joda-time Time Zones
+00:00 或 Etc/GMT 是格林威治时间
所有时区都与 +00:00 / "Etc/GMT" / 格林威治时间偏移
夏令时总是比夏季的“常规”时间更早。你把你的时钟拨回了秋季。 (“Fall Back”口号记住该做什么)
因此,夏令时(冬季)中的 America/New_York 时间比常规时间早一小时。例如,通常是下午 5 点。夏天在纽约市的下午,现在是下午 4 点。 America/New_York 夏令时。名称“America/New_York”时间是“长格式”时区名称。美国东海岸通常将其时区称为东部标准时间 (EST)
如果您想将今天的时区偏移量与其他日期的时区偏移量进行比较,您需要知道时区偏移量的数学符号(+/-“正/负”)与时间相反区域。
查看 joda.org 上的时区表,找到“America/New_York”的时区,它会在 Standard Offset 前面有一个负号。
地球绕它的轴逆时针旋转。在格林威治看日出的人比纽约市的人看日出早 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)
答案是:? - 取决于一年中的时间
如果今天的时区偏移量和夏季时区偏移量相同,AND夏季和冬季时区偏移量不同,那么逻辑推论,今天一定不是夏令时。
你能省略比较夏季和冬季时区偏移量吗(要知道这个时区是否使用 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
}