我正在尝试进行夏令时转换。我很难确定";日期";在";void IsDst(日期({〃;我尝试过";void IsDst(日期-时间-日期({〃;不确定它是如何工作的?
dstdata.htm
date = new DateTime(yr, mo-1, dy, hr24, mn, 0); Textbox7.value = IsDst(date);
dstdata.js
private void IsDst(date){ if (date.month < 2 || date.month > 10){ return 0; }elseif (date.month >= 2 && month <= 10){ var aaa=0; if (date.month==2){ var dstshr=2; for (var dys=1;dys<=25;dys++){ var dsts= new DateTime(yr, 2, dys, dstshr, 0, 0); if ((dsts.DayOfWeek==0) && (aaa==1)){ if (date.Date<dsts.Date){ return 0; }else{ return 1; } }elseif ((dsts.DayOfWeek==0) && (aaa==0)){ aaa=1; dstshr=3; } } } }elseif(date.month==10){ var bbb=0; var dstehr=2; for (var dye=1;dye<=25;dye++){ dste= new DateTime(yr, 10, dye, dstehr, 0, 0); if ((dste.DayOfWeek==0) && (bbb==0)){ dste.hour=dste.hour+1; bbb=1; if ((date.Date<dste.Date){ return 0; }else{ return 1; } } } } }elseif (date.month > 2 && month < 10){ return 1; }
一个混淆(和问题(的案例。
方法IsDst
似乎有一个void返回类型,其名称表明它返回布尔值,并返回integer。
代码似乎不是ECMAScript。逻辑看起来相当复杂,块:
} elseif(date.month==10) {
将永远不会被输入,因为如果它是真的,它将已经被前一个块捕获:
} elseif (date.month >= 2 && month <= 10) {
如果您正试图根据主机设置确定DST是否在特定日期生效,那么您可以测试:
- 主机是否遵守夏令时
- 夏令时在特定日期生效吗
例如
// Return true if DST is observed in the year of date
function hasDST(date = new Date()) {
let year = date.getFullYear();
return !(new Date(year, 0).getTimezoneOffset() == new Date(year, 6).getTimezoneOffset());
}
// Return true if DST is observed for the year of the date and
// the offset on the date is the same as the DST offset for
// that year
function inDST(date = new Date()) {
let year = date.getFullYear();
// Offset has opposite sign to convention so use min not max
let dstOffset = Math.min(
new Date(year, 0).getTimezoneOffset(),
new Date(year, 6).getTimezoneOffset(),
);
return hasDST(date) && date.getTimezoneOffset() == dstOffset;
}
// Test
let y = new Date().getFullYear();
[new Date(2022,0), // 1 Jan 2022
new Date(2022,6), // 1 Jul 2022
new Date(2023,0), // 1 Jan 2023
new Date(2023,6), // 1 Jul 2023
new Date(y ,0), // 1 Jan current year
new Date(y ,6), // 1 Jul current year
].forEach(d => console.log(
`${d.toString()} is in DST? ${inDST(d)}`
));
以上假设,如果1月1日和7月1日的偏移量不同,则该年可观测到夏令时,并且这两个偏移量中的最小值为夏令时偏移量(注意ECMAScript偏移量与惯例相反,即格林尼治以西+ve,以东-ve(。然而,两个偏移不同并不一定意味着可以观测到DST(见下文(。
一旦2023年11月5日更新了美国永久夏令时的实施情况:
- hasDST将在2023年的所有日期返回true,在此后的所有日期都返回false
- inDST将在2023年11月5日至2023年12月31日的所有日期返回true
- hasDST和inDST将在2023年之后的日期(即2024年1月1日以后(返回false
因此,在2023年11月5日至12月31日期间,hasDST和 inDST考虑到特定地点的日期是否在夏令时,这两个函数的全部意义都是值得怀疑的,重要的是偏移量。很多地方根本没有夏令时。 爱尔兰不仅没有夏令时,而且有相反的夏令时:夏季的标准时间(IST(是UTC+1,而冬季的时钟则设置为UTC+0(GMT(。以上认为IST是夏令时,GMT是标准时间。 因此,最好将日期保存为没有时区的日期,将日期时间保存为UTC,然后根据转换时已知的偏移规则,仅根据特定地点的需要计算偏移量。