Javscript Date()的日期格式问题。
背景:我正在修改Jquery UI datepicker,我有月份和日期返回不正确的值的麻烦。
$('#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得到前一天。
我知道这一步(原型函数)尝试从JS日期对象中格式化YYYYMMDD格式的字符串?但是为什么上面的方法会产生不同的结果,这对我来说仍然是个谜。
return [this.getFullYear(), !mm[1] && '0', mm, !dd[1] && '0', dd].join('');
为什么当对象返回7月31日时'd2'返回20160730 ?
因为当你这样做的时候:
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。主机系统时区偏移量最初用于创建时间值,用于get和set方法的年、月、日、小时等(因为夏令时更改时区)以及生成人类可读的日期字符串。
*注意,这与ISO 8601相反,该标准规定没有时间成分的日期应被视为本地日期。但是ECMA-262将它们视为UTC。在某些版本的浏览器中,'2016-07-31'将被视为无效,而在其他版本中,它将被视为本地版本,而最新版本将被视为UTC。这就是为什么强烈建议总是手动解析日期字符串(使用您自己的函数或带有解析器的库),以便您控制如何解析它以及如何应用时区。