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

时间:2017-08-04 17:45:29

标签: javascript date internationalization timezone

为什么如果我选择1848年以下的年份,这种格式的结果是TypeError: a bytes-like object is required, not 'int'

我觉得这可能是关于时区的?如果是这样,我怎么能避免这种情况,因为我将从ISO日期字符串(没有时间)创建一个日期对象,如下所示:May 10

(在Chrome 59上测试)



YYYY-MM-DD




上面的日期字符串来自例如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);(我在BST时区)

1 个答案:

答案 0 :(得分:2)

此测试是在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年之前你总能得到那些奇怪的结果。 实际上,作为Matt explained in the comments,UTC于1972年实施,在此之前,大部分区域被定义为GMT的偏移量。无论如何,对于非常古老的日期,特别是在1900年之前,你可能会想到像上面那样的偏移

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

在伦敦(我假设它是您的默认时区),before 1847-12-01 the offset was -00:01:15(由lat / lon计算,再次查看Matt's comment以获取更多详细信息),之后它被更改为+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)'));

结果是:

  

11/05/1848,00:00:00 GMT
  10/05 / 1847,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日