【问题标题】:Date.setDate ensuring consistent time (mode?) DST vs StandardDate.setDate 确保一致的时间(模式?) DST 与标准
【发布时间】:2018-11-19 04:05:27
【问题描述】:

我有这个函数,它返回一个新的Date 实例,从传递的Date 对象中添加或减去天数。

function daysFrom(date, numDays) {
    var retDate = new Date();
    retDate.setDate(date.getDate() + numDays);
    return retDate;
}

但是现在(在太平洋时区),如果我通过了 2018 年 9 月 19 日之后的日期,我的两个日期在标准时间和夏令时中是不一致的。

var endDate = new Date(Date.parse('19 September 2018 00:12:00 GMT'));
var startDate = daysFrom(endDate, -5);

console.log(startDate, endDate);
// Tue Sep 18 2018 17:12:00 GMT-0700 (Pacific Daylight Time) Tue Nov 13 2018 20:05:02 GMT-0800 (Pacific Standard Time)

我想它们会有所不同,因为我返回的日期是今天实例化的,因为我们不在 DST 中,但是确保返回的日期是一年中时间的正确模式的最简单方法是什么?在 2019 年,DST 将于 3 月 10 日开始,所以如果我从中减去 x 天数,我希望时间模式(不管它叫什么)是标准的,而不是 DST。

什么是模式(夏令时 vs 标准)?

使用当前版本的 Chrome 浏览器。

【问题讨论】:

  • new Date(Date.parse('19 September 2018 00:12:00 GMT')) 中使用Date.parse 是多余的。此外,这不是 ECMAScript 支持的格式,因此解析依赖于实现。

标签: javascript date


【解决方案1】:

...但是确保返回的日期是一年中正确模式的最简单方法是什么? 2019 年,DST 将于 3 月 10 日开始,所以如果我从中减去 x 天,我希望时间模式(不管它叫什么)是标准时间模式,而不是 DST。

没有“模式”,Date 对象没有时区偏移。偏移量来自调用 getTimezoneOffset 日期的主机系统,它不与日期一起存储。

直到最近,实现应用当前时区偏移设置,就好像它们一直存在一样。但是,对于 ECMAScript 2015,建议支持历史更改,对于 ECMAScript 2018,要求它们尽可能准确地反映历史更改。该更改尚未在所有实施中完全实施,因此您可能会发现偏移量或夏令时规则与当前实施的规则有所不同。

什么是模式(夏令时 vs 标准)?

ECMAScript 指的是“夏令时”和“本地时区调整”,但在明确区分本地(标准)时间和夏令时时,它也表示“本地标准时间”。

更一般地说,典型的夏季偏移被称为“夏令时”或“夏令时”,其他一切都是“标准时间”。时区名称没有标准化(检查一些浏览器,它们到处都是),所以只要它是一致的并且不模棱两可,任何事情都可以。

【讨论】:

  • 最后一个问题不是关于 JavaScript 日期对象,而是一般的日期。
【解决方案2】:

您需要克隆结束日期,而不是使用当前日期对其进行初始化:

function daysFrom(date, numDays) {
    var retDate = new Date(date.getTime());
    retDate.setDate(date.getDate() + numDays);
    return retDate;
}

var endDate = new Date(Date.parse('19 September 2018 00:12:00 GMT'));
var startDate = daysFrom(endDate, -5);

console.log(startDate, endDate);

至于日期对象的默认字符串表示,它取决于实现(直到 ECMAScript 2018),因此由您的浏览器自行决定。

来自MDN

直到 ECMAScript 2018(第 9 版),返回的字符串格式 Date.prototype.toString 是依赖于实现的。因此它 不应依赖指定格式。

【讨论】:

  • 关闭,但我认为模式将始终与通过的模式相同。
  • 是说没有办法知道返回日期的正确时间模式吗?
  • JavaScript 日期对象不包含时区信息。
  • 有趣。好的。
  • 当然可以计算特定时区的日期表示。毕竟,这就是您的浏览器在吐出那些Pacific Daylight Time 字符串时所做的事情。我只是说日期对象本身不包含该信息。
【解决方案3】:

我认为您的意思是将 retDate 初始化为日期?

function daysFrom(date, numDays) {
    var retDate = new Date(date);
    retDate.setDate(date.getDate() + numDays);
    return retDate;
}

【讨论】:

  • 关闭,但我认为模式将始终与通过的模式相同。
  • 确实如此。感谢@RobG,新的超级大国可以搞乱日期解锁。 :-) 。答案已更新。
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2021-02-02
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多