Javascript 这个小时从哪里来?
以下内容将为指定月份创建一个周(天)数组 输出如下所示:Javascript 这个小时从哪里来?,javascript,date,Javascript,Date,以下内容将为指定月份创建一个周(天)数组 输出如下所示: [ [ "2017-06-01T01:00:00.000Z", "2017-06-02T01:00:00.000Z", "2017-06-03T01:00:00.000Z", "2017-06-04T01:00:00.000Z" ], ... ] 额外的一小时是从哪里来的?我以为时间都是午夜 我目前在英国(BST) 功能月周(月、年){ var currentMonth=第1个月; var
[
[
"2017-06-01T01:00:00.000Z",
"2017-06-02T01:00:00.000Z",
"2017-06-03T01:00:00.000Z",
"2017-06-04T01:00:00.000Z"
],
...
]
额外的一小时是从哪里来的?我以为时间都是午夜
我目前在英国(BST)
功能月周(月、年){
var currentMonth=第1个月;
var日期=utcDate(新日期(年、当前月、1));
var周=[];
var周;
而(date.getMonth()==currentMonth){
如果(date.getDay()==1 | |!周){
周=[];
周。推(周);
}
周推送(utcDate(日期));
date.setDate(date.getDate()+1);
}
返回周;
}
功能utcDate(日期){
返回新日期(Date.UTC(Date.getFullYear(),Date.getMonth(),Date.getDate(),
date.getHours(),date.getMinutes(),date.getSeconds());
}
控制台日志(2017年6月6日)代码>您看到的值是正确的。
英国夏令时正好比UTC早一小时
功能月周(月、年){
var currentMonth=第1个月;
var date=新日期(date.UTC(年,当前月,1));
var周=[];
var周;
而(date.getMonth()==currentMonth){
如果(date.getDay()==1 | |!周){
周=[];
周。推(周);
}
推送(新日期(日期));
date.setDate(date.getDate()+1);
}
返回周;
}
控制台日志(2017年6月6日)代码>您得到的时间是正确的。您正在运行的代码位于基于本地时区的浏览器中。您得到的时间字符串是UTC时间
因此,当您在伦敦时,您比UTC提前1小时。因此,如果您要创建一个日期字符串,希望它是午夜。UTC午夜时间为伦敦凌晨1点
这将取决于运行客户端代码的时区。所以在美国,假设EST时区比UTC晚5小时。因此,您在EST时区客户端浏览器中的代码将显示“2017-05-31T19:00:00.000Z”
,即延迟5小时
UTC是标准时间,与所有其他时区相关。因此,无论何时获取UTC时间字符串,都不要将其与本地时区混淆。它将永远是不同的。如果伦敦是午夜,美国就不会是午夜了。因此,您的客户机日期时间代码的行为将有所不同
只是一个提示:如果你想避免时区的混淆,你是
只对日期部分感兴趣,无论时区如何。只需截断
时间和日期分开。它将不再那么令人困惑,而是更加令人困惑
一致适应
对我来说,它正确地显示了05:30
这是我在印度的时区(+5:30)这是你当前的时区与格林尼治标准时间的差异。你比格林尼治标准时间提前了1小时。这就是为什么增加了1小时。我以为我的代码都是UTC的。额外的时间从哪里来了?你得到的周不是ISO周,而是从每月的第一个星期一开始。您所需要做的不是在utcDate中设置小时、分钟和秒,使它们默认为零。但我想我是在向数组中添加UTC日期。我的意思是var date=utcDate(新日期(年,当前月,1))代码>是否应该创建UTC午夜日期?我以为我的代码是“全部在UTC中”-它不在哪里?上面添加的代码片段都在UTCIf中。你问我,你可以将年和月发送到utcDate(日期)函数本身。你的代码片段只会加剧问题,现在为每个输出的日期时间显示T02:00:00
。我刚刚意识到了这一点。正在做。如果EST是-0500,那么午夜是19:00Z,而不是20:00Z。哦,是的,谢谢你的更正。美国也实行夏时制。这又是一个棘手的问题。