Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解英国夏季的JavaScript日期_Javascript_Date - Fatal编程技术网

了解英国夏季的JavaScript日期

了解英国夏季的JavaScript日期,javascript,date,Javascript,Date,我住在英国。如果我为6月1日创建一个日期对象,我会期望.getUTCDate()返回一个月中“正确”的日期为1,但它会返回31和.getDate(),我认为这是为了返回区域设置日期返回值1 新日期(2020,5,1).getUTCDate()//31 新日期(2020年5月1日)。getDate();//1. 为什么会这样?是因为新日期(2020年5月1日)已转换为当地时间还是其他原因?我认为日期是普遍存储的,只有当打印出日期时,才会应用区域设置规则?我已经阅读了所有的MDN文档,但仍然不明白

我住在英国。如果我为6月1日创建一个日期对象,我会期望
.getUTCDate()
返回一个月中“正确”的日期为
1
,但它会返回
31
.getDate()
,我认为这是为了返回区域设置日期返回值
1

新日期(2020,5,1).getUTCDate()//31
新日期(2020年5月1日)。getDate();//1.

为什么会这样?是因为新日期(2020年5月1日)已转换为当地时间还是其他原因?我认为日期是普遍存储的,只有当打印出日期时,才会应用区域设置规则?我已经阅读了所有的MDN文档,但仍然不明白,如果有人能够完成上述步骤,返回
31
1
,ECMAScript日期构造函数的工作原理,我将不胜感激

单字符串值被解析并以奇怪而奇妙的方式转换为日期,这些方式主要依赖于实现,见下文。因此,以下所有内容都忽略解析,并假设调用日期构造函数时至少有两个参数:year和month。在这种情况下,字符串值被转换为数字,就像通过
number(value)
一样

所有非UTC方法均在本地时间工作,即基于主机系统日期、时间和时区偏移设置。使用构造函数和年、月、日等的值创建日期对象时,任何缺少的值都将被视为0,但日期除外,该日期默认为1

所以

基于该日期和时间的日期、时间和时区偏移的主机(本地)设置创建一个日期,并考虑历史变化,如夏令时和其他调整(1900年之前常见),如同通过以下方式:

new Date(2020, 5, 1, 0, 0, 0, 0); // Local 1 Jun 2020 00:00:00.000
因此,对于时区偏移量小于零的系统,getUTCDate将返回31(即5月31日),对于偏移量大于等于零的任何系统,getUTCDate将返回1(即6月1日)。常用的最大正偏移量为+14,最小为-10

如果要基于UTC值创建日期,请使用whcih返回数字的方法,即时间值,因此必须将其传递给日期构造函数以创建日期对象:

new Date(Date.UTC(2020, 5, 1)).getUTCDate(); // 1 regardless of host settings
解析字符串:
newdate(string)
Date.parse(string)

这是日期对象崩溃和烧毁的地方。虽然构造函数主要使用本地,但即使未指定UTC,它也可以使用UTC。字符串解析几乎完全依赖于实现,ECMA-262支持的3种格式除外。即使支持的格式在实现之间也没有得到一致的解析,因此一般的建议是不要使用内置的解析器。看

你回答了自己的问题。默认情况下,除非指定utc,否则日期由本地计算机确定。请参见此处@full stack,但如果“日期对象的内部表示形式是单个数字,表示自1970-01-01 00:00:00 UTC以来经过的毫秒数”,则新日期(2020,5,1)肯定应该是2020年6月1日UTC,而新日期(2020,5,1)应该是1。我不明白BST是在什么时候进入混合并使其变为31。请参见此处:“当使用Date对象的各种功能时,计算机的本地时区将应用于内部表示”。似乎
新日期(2020,5,1)
将按预期将日期存储为UTC,但当您调用
.getUTCDate()时
.getDate()
,然后将日期视为实际存储为本地时间,并首先从本地时间(在英国夏令时提前1小时)转换回UTC(因此返回1小时),然后
。getUTCDate
将返回此日期,
。getDate
将转换为“返回本地”,因此添加一小时,将我们带回最初的2020年6月1日。这是正确的吗?
new Date(Date.UTC(2020, 5, 1)).getUTCDate(); // 1 regardless of host settings