为什么如果我选择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时区)
答案 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日