getTimezoneOffset()
在浏览器中,JavaScript中的方法返回从00:00时区偏移的分钟数。例如,夏令时(DST)中的America / New_York时区返回数字300。300分钟是从零开始的5个小时差异。300分钟除以60分钟就是5小时。将每个时区与零时区+00:00 / Etc / GMT /格林威治时间进行比较。
MDN网络文档
您必须知道的下一件事情是,偏移量与实际时区的符号相反。
有关时区的信息由Internet号码分配机构(iana)维护
安娜时区
joda.org提供了格式正确的时区表
乔达时区
+00:00或Etc / GMT为格林威治时间
所有时区都从+00:00 /“ Etc / GMT” /格林威治时间偏移
夏令时总是比夏天的“常规”时间早。您将时钟拨回秋季。(“回滚”口号记住该怎么做)
因此,夏令时(冬季)中的America / New_York时间比常规时间早一小时。因此,例如,夏令时通常在夏季纽约市的下午5点,现在是夏令时的美国/纽约时间下午4点。名称“ America / New_York”时间是“长格式”时区名称。美国的东海岸通常将其时区称为东部标准时间(EST)
如果要将今天的时区偏移量与其他日期的时区偏移量进行比较,则需要知道时区偏移量的数学符号(+/-“正/负”)与时区相反。
查看joda.org上的时区表,并找到“ America / New_York”的时区。“标准偏移”前面将带有负号。
地球绕其轴逆时针旋转。在格林威治观看日出的人比纽约市有人看到日出要早五个小时。在美国东海岸的某人看到日出之后,美国西海岸的某人将看到日出。
有一个原因使您需要了解所有这一切。这样一来,您就可以从逻辑上确定某些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。
您是否可以忽略比较夏季和冬季时区偏移量(以了解是否将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
因此实际上是在返回标准偏移量。该代码是正确的。