在 JavaScript 中,
getTimezoneOffset()
方法返回浏览器当前时区与 UTC 时间相差的分钟数。例如,美国/纽约夏令时(DST)时区返回数字 300。300 分钟是距零点五小时的时间差。每个时区都与零时区 +00:00 / Etc/GMT / 格林威治时间进行比较。
MDN Web Docs
另外需要了解的是,偏移量与实际时区的符号相反。
有关时区的信息由互联网数字分配机构(iana)维护。
iana time zones
joda.org 提供了一个格式良好的时区表。
joda-time Time Zones
+00:00 或 Etc/GMT 是格林威治时间。
所有时区都偏移自+00:00 / "Etc/GMT" / 格林威治时间
夏令时总是比夏季的“常规”时间早。在秋季,您需要将时钟拨回。 (“Fall Back”口号可以帮助您记住该怎么做)
因此,美国/纽约夏令时(冬季)比常规时间早一小时。例如,在夏季,纽约市下午5点通常是下午5点,而现在在夏令时中是下午4点。 “美国/纽约”时间是“长格式”时区名称。美国东海岸通常称其时区为东部标准时间(EST)
如果您想比较今天的时区偏移与其他日期的时区偏移,请注意时区偏移的数学符号(+/-“正/负”)与时区相反。
查看joda.org上的时区表,并找到“美国/纽约”的时区。它将在标准偏移量前面有一个负号。
地球沿着它的轴线逆时针旋转。在格林威治观日出的人会比纽约观日出的人提前5个小时看到日出。而美国西海岸的人将会在美国东海岸的人看到日出之后才看到日出。
你需要知道这一切的原因是为了让你能够逻辑地确定某些 JavaScript 代码是否正确地获取DST状态,而不需要在不同时间测试每个时区。
想象一下,现在是11月份在纽约市,时钟已经拨回了1个小时。在纽约市的夏季,偏移量为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
现在,您可以创建一个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)
答案是:?- 取决于一年中的时间
如果今天的时区偏移量和夏令时的时区偏移量相同,并且夏季和冬季的时区偏移量不同,则根据逻辑推断,今天必须不在使用夏令时。
您能否省略比较夏季和冬季的时区偏移量(以了解该时区是否使用夏令时),并仅将今天的时区偏移量与夏季时区偏移量进行比较,并始终获得正确答案?
today's TZ Offset !== Summer TZ Offset
那么,今天是冬天还是夏天呢?如果你知道了,就可以应用以下逻辑:
if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
var are_We_In_DST = true;
}
但问题是,你不知道今天的日期是在冬季还是夏季。每个时区都可能有自己的夏令时开始和结束规则。你需要跟踪世界上每个时区的规则。因此,如果有更好、更简单的方法,那么最好采用更好、更简单的方法。
我们所剩下的就是需要知道这个时区是否使用夏令时,然后将今天的时区偏移量与夏令时的时区偏移量进行比较。这将始终给出可靠的答案。
最终的逻辑是:
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
}