toLocaleDateString() 减去一天

Posted

技术标签:

【中文标题】toLocaleDateString() 减去一天【英文标题】:toLocaleDateString() is subtracting a day 【发布时间】:2015-09-30 23:41:54 【问题描述】:

我从 SQL 数据库中提取日期,该数据库将它们视为从午夜开始的日期。当我在它们上使用toLocaleDateString() 时,它会正确格式化它们,但不是在浪费一天之前。

格式化前:2011-09-01T00:00:00

格式化后:8/31/2011

代码:

plan.dateReceived = new Date(plan.dateReceived).toLocaleDateString()+','+plan.dateReceived;

为什么要这样做,我可以进行哪些内联修复以使其正常运行? 我还找到了another post that had a similar problem,但我不是 100% 相信这是时区问题。

【问题讨论】:

您链接到的other post 中描述的技术确实有效。不幸的是,正是因为这是一个时区问题。顺便说一句,如果原生 JS 日期行为过于受限,请尝试使用 MomentJS。 【参考方案1】:

如果您分段运行代码,您会注意到 new Date('2011-09-01T00:00:00') 产生类似于 Wed Aug 31 2011 20:00:00 GMT-0400 (EDT) 的输出(我的计算机现在在 EDT 中)。

这是因为 (doc):

假定时区的差异

给定日期字符串“2014 年 3 月 7 日”,parse() 假定为当地时间 区域,但给定一个 ISO 格式,例如“2014-03-07”,它将假定为 UTC 时区。因此使用这些字符串生成的日期对象 除非系统设置为 UTC 的本地时区。这意味着出现的两个日期字符串 等效可能会导致两个不同的值,具体取决于格式 正在转换的字符串(此行为在 ECMAScript ed 6,因此两者都将被视为本地)。

将其转换为区域设置日期字符串会将其转换为适合浏览器区域设置的字符串。 Documentation 表示“默认为运行时的默认时区”。

如果要确保字符串是 UTC 时间,请使用

new Date('2011-09-01T00:00:00').toLocaleDateString('en-US', timeZone: 'UTC')

【讨论】:

【参考方案2】:

我们在 Google Chrome v87.0.4280 ios 上遇到了这个问题,但在具有相同浏览器的计算机上却没有。

问题是时区字符串末尾没有 Z。

“Z”是 DateTimes 的一种特殊情况。字面“Z”是 实际上是 UTC 时间的 ISO 8601 日期时间标准的一部分。什么时候 “Z”(祖鲁语)被钉在一个时间的末尾,它表示那个时间 是 UTC,所以真正的字面 Z 是时间的一部分。

将 Z 附加到日期时间可以解决问题。

new Date('2011-09-01T00:00:00Z').toLocaleDateString('en-US', timeZone: 'UTC')

【讨论】:

以上是关于toLocaleDateString() 减去一天的主要内容,如果未能解决你的问题,请参考以下文章

JavaScriptSerializer 正在从日期中减去一天

案例一:shell脚本指定日期减去一天

cookie 的常用操作

Jquery datepicker setDate减去给定日期的一天

toLocaleDateString 的相反方法

toLocaleDateString() 未返回 dd/mm/yyyy 格式