JavaScript 中有很多解决方案可以检查日期是否为夏令时 [ 如何检查 DST(夏令时)是否有效以及偏移量是多少? ].
但是,只有当某人处于适用日光效应的同一时区时,该解决方案才有效, 前任。假设我的当前浏览器(客户端)采用 IST(印度标准 - 没有夏令时更改),并且我想检查 ET(东部时间)的日期是否为白天-5,标准为-4)。仅当我的系统时区是 ET 而不是 IST 时,上述解决方案(来自链接)才会给出正确的结果。
如何计算?
如果您使用
moment.js
及其配套的 timezome
脚本,它们使检查 DST 变得非常容易:
查看他们的 isDST() 文档
只是为了笑,这里有一个测试每个时区的小提琴
if( moment.tz("America/New_York").isDST() ){
$('#test').append('NY is currently in DST');
}
else{
$('#test').append('NY is NOT currently in DST');
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment.min.js"></script>
<script src="http://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>
<div id="test"></div>
您可以使用 luxon 库来检查 DST 在特定区域是否处于活动状态。您所需要的只是时区字符串,您可以检查 DST 是否处于活动状态。
所以首先从 luxon 导入 DateTIme
import { DateTime } from "luxon";
然后检查时区是否启用 DST
if (DateTime.local().setZone(timezone).isInDST) {
console.log("Dst is active in ", timezone)
}
else {
console.log("Dst is NOT active in ", timezone)
}
其中时区是您要查找的时区。
现在不需要库就可以实现这一点,这要归功于 Intl.DateTimeFormat API,所有现代浏览器和 Node.js 13.0+ 都支持该 API。使用该 API,您可以发出一个包含时区的字符串,该时区根据夏令时而有所不同。
例如,在东部时区,当不是夏令时时,时区字符串为
EST
;当夏令时时,时区字符串为 EDT
。因此,要确定给定的 date
对象是否处于该时区的夏令时期间,您可以执行以下操作:
const tzFormatter = new Intl.DateTimeFormat("en-US", {timeZone: "America/New_York", timeZoneName: "short"});
const isDST = tzFormatter.format(date).endsWith("EDT");