Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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_Timezone Offset - Fatal编程技术网

夏时制日期的Javascript日期计算错误

夏时制日期的Javascript日期计算错误,javascript,timezone-offset,Javascript,Timezone Offset,我在连续三个日期用JavaScript进行以下相同的计算 结果日期在墨尔本“日间节能”生效之日(2019-10-06)不同。第一个和第三个正确显示日期,第二个显示日期为10月5日 有人能告诉我哪里出了问题吗 var apiRes=“2019-10-05”; var tempDate=Date.parse(apiRes); var dApiRes=新日期(apiRes); log(dApiRes.getTimezoneOffset()); tempDate=tempDate+(dApiRes.g

我在连续三个日期用JavaScript进行以下相同的计算

结果日期在墨尔本“日间节能”生效之日(2019-10-06)不同。第一个和第三个正确显示日期,第二个显示日期为10月5日

有人能告诉我哪里出了问题吗

var apiRes=“2019-10-05”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
控制台日志(d);
var apiRes=“2019-10-06”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
控制台日志(d);
var apiRes=“2019-10-07”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);

控制台日志(d)我通常使用中午12点来确保不会遇到这种情况-也许我们需要15:00来确保

var apiRes=“2019-10-05 15:00:00”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString());
var apiRes=“2019-10-06 15:00:00”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString());
var apiRes=“2019-10-07 15:00:00”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString());
var apiRes=“2019-10-27 15:00:00”;//欧盟DST结束
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);

log(d.toString())我通常使用中午12点来确保不会遇到这种情况-也许我们需要15:00来确保

var apiRes=“2019-10-05 15:00:00”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString());
var apiRes=“2019-10-06 15:00:00”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString());
var apiRes=“2019-10-07 15:00:00”;
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString());
var apiRes=“2019-10-27 15:00:00”;//欧盟DST结束
var tempDate=Date.parse(apiRes);
var dApiRes=新日期(apiRes);
log(dApiRes.getTimezoneOffset());
tempDate=tempDate+(dApiRes.getTimezoneOffset()*60000);
var d=新日期(0)
d、 setUTCmillishes(tempDate);
log(d.toString())以解释问题:
日期“2019-10-06”是
2019-10-06:T00:00:00Z
——这是
2019-10-06:11:00:00UTC+11
,因为到了
2019-10-06:T00:00:00Z
时,夏季已经开始了

因此,当你“计算”时区时,你要减去11小时,而不是10小时

但由于墨尔本上午11点,一天只有10个小时,调整后的日期变成
2019-10-05:23:00:00UTC+10

如果您的目标是只使用YYYY-MM-DD字符串来获取午夜,那么有几种方法可以实现

在UTC和UTC以东的时区中

d.setHours(0,0);
(对于阿德莱德这样的奇数时区,您需要第二个0)

在UTC以西的时区,您将需要

d.setDate(d.getDate() + 1)
您还可以在应用更改之前和之后检查时区偏移,并进行相应调整-我没有费心编写代码

但是,我认为最简单、最可靠的方法是,只使用Date构造函数中指定的方法(即“保证”跨环境工作),如下所示

它看起来有点古怪,但根本不需要了解本地时区偏移

var apiRes=“2019-10-05”;
var d=新日期(…apiRes.split('-').map((n,i)=>Number(n)-(i%2));
log(d.toString());
var apiRes=“2019-10-06”;
var d=新日期(…apiRes.split('-').map((n,i)=>Number(n)-(i%2));
log(d.toString());
var apiRes=“2019-10-07”;
var d=新日期(…apiRes.split('-').map((n,i)=>Number(n)-(i%2));
log(d.toString())以解释问题:
日期“2019-10-06”是
2019-10-06:T00:00:00Z
——这是
2019-10-06:11:00:00UTC+11
,因为到了
2019-10-06:T00:00:00Z
时,夏季已经开始了

因此,当你“计算”时区时,你要减去11小时,而不是10小时

但由于墨尔本上午11点,一天只有10个小时,调整后的日期变成
2019-10-05:23:00:00UTC+10

如果您的目标是只使用YYYY-MM-DD字符串来获取午夜,那么有几种方法可以实现

以UTC和时区E为单位