gpt4 book ai didi

Javascript 日期问题返回比设置日期-时区少 1 天

转载 作者:行者123 更新时间:2023-12-03 06:15:46 29 4
gpt4 key购买 nike

Javscript Date() 的日期格式问题。

背景:我正在修改 Jquery UI 日期选择器,但在月份和日期返回错误值时遇到问题。

$('#datefield').datepicker({
beforeShowDay: function(date) {
// issues experienced here - isolation test code below
// Mon Aug 01 2016 00:00:00 GMT+1000 (AUS Eastern Standard Time)
// DateMonth: 8 - ISO: 20160731
}
})

基于 http://www.w3schools.com/jsref/jsref_obj_date.asp 的 JS Date() 构造

示例代码:

var d1 = new Date();
var d1Month = d1.getMonth()+1;
var d1ISO = d1.toISOString().slice(0,10).replace(/-/g,"");

console.log(d1);
console.log('1Month: '+d1Month+' ISO: '+d1ISO);

var d2 = new Date(2016,06,31);
var d2Month = d2.getMonth()+1;
var d2ISO = d2.toISOString().slice(0,10).replace(/-/g,"");

console.log(d2);
console.log('2Month: '+d2Month+' ISO: '+d2ISO);

var d3 = new Date('2016-07-31');
var d3Month = d3.getMonth()+1;
var d3ISO = d3.toISOString().slice(0,10).replace(/-/g,"");

console.log(d3);
console.log('3Month: '+d3Month+' ISO: '+d3ISO);

var d4 = new Date(2016, 07, 01);
var d4Month = d4.getMonth()+1;
var d4ISO = d4.toISOString().slice(0,10).replace(/-/g,"");

console.log(d4);
console.log('4Month: '+d4Month+' ISO: '+d4ISO);

输出(控制台):

Wed Aug 24 2016 11:30:51 GMT+1000 (AUS Eastern Standard Time)
1Month: 8 ISO: 20160824

*Sun Jul 31 2016 00:00:00 GMT+1000 (AUS Eastern Standard Time)
2Month: 7 ISO: 20160730

Sun Jul 31 2016 10:00:00 GMT+1000 (AUS Eastern Standard Time)
3Month: 7 ISO: 20160731

*Mon Aug 01 2016 00:00:00 GMT+1000 (AUS Eastern Standard Time)
4Month: 8 ISO: 20160731

当对象返回 7 月 31 日时,为什么“d2”返回 20160730?

当设置的日期是 8 月 1 日时,为什么“d4”返回 20160731?

为什么 d3 可以正常工作?

我的假设是 ISO 日期以某种方式减去 GMT+10 并得到前一天。

我知道这一步(函数原型(prototype))尝试格式化 Get String in YYYYMMDD format from JS date object?但对我来说,为什么上面的结果会产生不同的结果仍然是个谜......

return [this.getFullYear(), !mm[1] && '0', mm, !dd[1] && '0', dd].join('');

最佳答案

Why does 'd2' return 20160730 when the object returns 31st July?

因为当你这样做时:

var d2 = new Date(2016,06,31);

您创建一个相当于主机系统当前时区 2016 年 7 月 31 日 00:00:00 的日期。当你这样做时:

console.log(d2);

您当前的系统设置用于在主机系统的时区(显然是 GMT+10:00)中生成字符串,并将显示相当于 2016-07-31T00:00:00+10:00 的字符串。

但是当你这样做时:

console.log('2Month: '+d2Month+' ISO: '+d2ISO);

日期采用 GMT 时区,即早 10 小时,因此如果时间在 10:00 之前,则日期将为前一天 (GMT),您将看到:

2016-07-30T14:00:00Z

但是因为您从字符串中切出了时间部分,所以您只能看到日期部分。

它对 d3 “有效”,因为当你这样做时:

var d3 = new Date('2016-07-31');

日期字符串被视为 UTC*,因此您要创建 2016-07-31T00:00:00Z 的日期,它相当于 2016-07-31T10:00:00+10:00,即 UTC日期与您本地的日期相同。请注意,输出:

console.log(d3);

是在 10:00:00(因为内置的 toString 考虑了您的系统时区,因此在显示的日期上添加了 10 个小时),这是您的时区偏移量。

在上述所有内容中,Date 对象的实际时间值为 UTC。主机系统时区偏移量用于最初创建时间值,用于年、月、日、小时等的 getset 方法。(自夏令时以来)更改时区)以及生成人类可读的日期字符串时。

* 请注意,这与 ISO 8601 相悖,ISO 8601 规定不带时间部分的日期应被视为本地日期。但 ECMA-262 将它们视为 UTC。在某些版本的浏览器中,“2016-07-31”将被视为无效,其他浏览器版本将被视为本地浏览器,而最新版本则将其视为 UTC。这就是为什么强烈建议始终手动解析日期字符串(使用您自己的函数或带有解析器的库),以便您控制它的解析方式以及时区的应用方式。

关于Javascript 日期问题返回比设置日期-时区少 1 天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113293/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com