Intl.DateTimeFormat 给出 1847 年或以下年份的奇怪结果

2024-04-25

为什么我选择1848以下的年份,这种格式的结果是May 10?

我有一种感觉,这可能与时区有关?如果是这样,我怎样才能避免这种情况,因为我将从 ISO 日期字符串(没有时间)创建一个日期对象,如下所示:YYYY-MM-DD.

(在 Chrome 59 上测试)

const workingDate = Intl.DateTimeFormat('en-GB').format(new Date('Fri May 11  1848 01:00:00 GMT+0100 (BST)'));
const notWorkingDate = Intl.DateTimeFormat('en-GB').format(new Date('Fri May 11  1847 01:00:00 GMT+0100 (BST)'));

console.log(workingDate);
console.log(notWorkingDate);

上面的日期字符串来自例如new Date('1847-05-11')(我在 BST 时区)


该测试是在 Chrome 53 中进行的。

我添加了一些选项DateTimeFormat检查日期的其他字段:

options = {
    year: 'numeric', month: 'numeric', day: 'numeric',
    hour: 'numeric', minute: 'numeric', second: 'numeric',
    hour12: false, timeZoneName: 'long'
};
var workingDate = Intl.DateTimeFormat('en-GB', options).format(new Date('Fri May 11  1848 01:00:00 GMT+0100 (BST)'));
var notWorkingDate = Intl.DateTimeFormat('en-GB', options).format(new Date('Fri May 11  1847 01:00:00 GMT+0100 (BST)'));

结果是:

workingDate: 10/05/1848, 20:53:32 GMT-03:06:28
notWorkingDate: 10/05/1847, 20:53:32 GMT-03:06:28

大多数地方在 1900 年之前都没有标准化的基于 UTC 的偏移量(实际上,每个国家在不同的年份采用了它),所以在 1900 年之前你总是会得到那些奇怪的结果。其实,作为马特在评论中解释道 https://stackoverflow.com/questions/45512717/intl-datetimeformat-gives-strange-result-from-year-1847-or-below#comment77993142_45513361,UTC 于 1972 年实施,在此之前,大多数区域被定义为与 GMT 的偏移。不管怎样,对于非常古老的日期,特别是 1900 年之前,您可能会期望像上面这样的偏移量.

在这种情况下,它会获取系统默认时区的相应偏移量(America/Sao_Paulo):1914 年之前是-03:06:28.

在伦敦(我假设这是您的默认时区),在 1847 年 12 月 1 日之前,偏移量为-00:01:15 https://www.timeanddate.com/time/zone/uk/london?year=1800#tb-zone(按纬度/经度计算,再次参见马特的评论 https://stackoverflow.com/questions/45512717/intl-datetimeformat-gives-strange-result-from-year-1847-or-below#comment77993142_45513361了解更多详情),之后更改为+00:00(这就是为什么它适用于 1848 年的日期)。

我做了一个测试,将时区设置为Europe/London:

options = {
    year: 'numeric', month: 'numeric', day: 'numeric',
    hour: 'numeric', minute: 'numeric', second: 'numeric',
    hour12: false, timeZoneName: 'long', timeZone: 'Europe/London'
};
var workingDate = Intl.DateTimeFormat('en-GB', options).format(new Date('Fri May 11  1848 01:00:00 GMT+0100 (BST)'));
var notWorkingDate = Intl.DateTimeFormat('en-GB', options).format(new Date('Fri May 11  1847 01:00:00 GMT+0100 (BST)'));

结果是:

1848 年 11 月 5 日,00:00:00 GMT
1847 年 10 月 5 日,23:58:45 GMT-00:01:15

这证实了在 1847 年 12 月之前,日期有不同的偏移量。


解决此问题的一种方法是将日期视为 UTC:

options = {
    timeZone: 'UTC'
};
var workingDate = Intl.DateTimeFormat('en-GB', options).format(new Date('Fri May 11  1848 01:00:00 GMT+0100 (BST)'));
var notWorkingDate = Intl.DateTimeFormat('en-GB', options).format(new Date('Fri May 11  1847 01:00:00 GMT+0100 (BST)'));

这些值将是:

1848 年 11 月 5 日
1847 年 11 月 5 日

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intl.DateTimeFormat 给出 1847 年或以下年份的奇怪结果 的相关文章

随机推荐

  • read_excel 读入消息 - 抑制?

    我喜欢使用readxl包裹 然而 我一直将它用作 RMarkdown 文档的一部分以及一些read excel 读取文件时的消息在进行分析时很有用 但在尝试呈现分析时则无用 所以问题是 在使用时是否有任何方法可以抑制收到的消息 或与此相关的
  • 在 while 循环内使用 try-finally 块[重复]

    这个问题在这里已经有答案了 当我在 while 循环中使用finally 时 我试图理解该机制 在下面的代码中 终于在行打印并比 while 中断 我预计代码不会到达finally 块 或者如果它到达finally块 则有no break在
  • Grunt watch 任务似乎需要很长时间

    我正在运行两个简单的任务 每个任务运行时间 spawn to false但这似乎破坏了它 并且没有运行任何相关的任务 以下是更改 sass 文件时的示例输出 gt gt File app styles main scss changed F
  • ggplot2堆叠条形图数据标签向后

    我想在 ggplot2 中创建一个堆积条形图 其中数据标签位于与其相关的填充区域的中心 我尝试过的代码的标签顺序与应有的顺序相反 这是代码示例 data rep lt data frame Task Number c 5 004 5 004
  • Eclipse C++ 打印漂亮吗?

    从 Eclipse 打印 C 源代码时得到的输出相当难看 是否有方法 插件可以漂亮地打印 C 源代码 例如与a2ps 这可能是对C源代码使用另一个过滤器 我也用enscript为了这 这是我经常使用的别名 alias cpp2ps ensc
  • 诊断 R 包构建错误:pdfLatex 不可用

    我正在尝试构建一个包R 我制作了骨架 并运行了命令R CMD check package1 我收到一个错误描述here https stackoverflow com questions 10819959 diagnosing r pack
  • 迁移到 Jboss 7.0 AS 后 Firefox 和 IE 中的 ViewExpiredException

    我们的 JSF 2 0 Richfaces 4 0 应用程序在 Jboss 6 0 上运行得非常好 我们正在尝试将其迁移到 Jboss 7 0 AS 对于我们点击页面上的任何链接 我们在 Firefox 和 IE 中遇到 ViewExpir
  • 如何使用 boost::spirit::qi 解析行尾?

    不应该是一个简单的eol http www boost org doc libs 1 42 0 libs spirit doc html spirit qi quick reference qi parsers auxiliary html
  • ASP NET Core 2 找不到包“Projectname.Model”的编译库位置

    在我的解决方案中 我有两个项目 其中之一是web项目 另一个是Model项目 您可以在下面看到我的解决方案结构 现在 当我运行应用程序时 出现以下错误 InvalidOperationException 找不到包 ContosoUniver
  • 如何在 GWT 中取消转义字符串

    我使用了 SafeHtmlUtils htmlEscape text 并且我想使用相反的功能 你能告诉我 gwt 中是否有像 unescapeHtml 这样的函数 如果 并且仅当 您可以相信文本不包含恶意内容 您可以使用 import co
  • 客户端验证后 RegisterOnSubmitStatement

    我需要在提交 Web 表单时但在客户端验证发生之后在流程中插入一些 Javascript RegisterOnSubmitStatement 似乎将 JavaScript 放在验证之前 有人知道如何让它渲染后吗 找到解决方案 在网络控件中
  • declarative_authorization 和命名空间

    您知道 declarative authorization 是否可以控制对命名空间资源的访问吗 我尝试过类似的东西 has permission on admin users to gt index show new create edit
  • R和matlab中的qr函数

    我有一个关于将 matlab 函数转换为 R 的问题 我希望有人能提供帮助 matlab 和 R 中使用的标准 QR 分解称为 qr 据我了解 用两种语言执行 qr 分解的标准方法是 Matlab Q R qr A 满足QR A R z l
  • PDOStatement 到 JSON [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我将如何转换PDOStatement到 JSON 我需要 jsonifyPDO FETCH OBJ json encode没有能力 j
  • 如何创建 Delphi Android 应用程序 APK 来包含文件

    如何将文件和 或包含 Android 应用程序 APK 文件的文件的文件夹包含在内 Delphi 运行过程会擦除 Assets 目录的内容 并且我放置在那里的文件 文件夹不包含在 APK 包中 我假设您必须手动将 System Startu
  • 如何在 Python 中使用 tkinter 选择目录并存储位置

    我正在创建一个带有浏览按钮的 GUI 我只想返回路径 我一直在寻找使用如下代码的解决方案 Tkinter Button subframe text Browse command self loadtemplate width 10 pack
  • 使用candlestick_ohlc显示csv

    我尝试用熊猫做第一步 经过几个成功的步骤后 我坚持执行以下任务 使用 OHLC 条显示数据 我从 Google Finance 下载了 Apple 股票的数据并将其存储到 csv 文件中 经过大量搜索 我编写了以下代码 import pan
  • 与 Socket.io 保持连接

    我正在尝试使用 asterisk websocket 连接socket io 客户端 https github com socketio socket io client socket io connect url transports w
  • 根据laravel中选定的省份获取城市列表

    如何获取基于所选省份的城市列表 我的控制器 public function index province RajaOngkir Provinsi gt all city RajaOngkir kota gt all return view
  • Intl.DateTimeFormat 给出 1847 年或以下年份的奇怪结果

    为什么我选择1848以下的年份 这种格式的结果是May 10 我有一种感觉 这可能与时区有关 如果是这样 我怎样才能避免这种情况 因为我将从 ISO 日期字符串 没有时间 创建一个日期对象 如下所示 YYYY MM DD 在 Chrome