夏时制日期的Javascript日期计算错误
我在连续三个日期用JavaScript进行以下相同的计算 结果日期在墨尔本“日间节能”生效之日(2019-10-06)不同。第一个和第三个正确显示日期,第二个显示日期为10月5日 有人能告诉我哪里出了问题吗夏时制日期的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
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为单位