我有一个日期选择器,我用它来获取和设置日期(然后使用json2.js将其串行化为JSON,使用以下代码:
$('#element').datepicker('getDate'); // returns 2012-03-19T00:00:00.000Z
$('#element').datepicker('setDate', value);
然而,不幸的是,在Firefox v11下,这将datpicker中的日期值设置为30/08/2017
(这是迄今为止错误的,我不知道它是从哪里得到这个值的),在IE9下,它将NaN/NaN/NaN
设置为。
我试着把第二行改成如下:
$('#element').datepicker('setDate', new Date(value));
这在Firefox中是有效的,但我在IE9中仍然得到相同的结果。
然后我有点疯了,开始尝试使用字符串操作以其他格式写入和解析日期,希望我能够可靠地获得一个简单的写入/解析场景,但这最终比我预期的要多得多,再加上我需要考虑时区的事实(在某些时区,我可能会得到2012-03-20的2012-03-18T23:00:00.000Z
,即日期组件表示之前的日期),我的信心目前有所动摇,因为这在时区和浏览器之间都很重要。
有没有一种可靠的方法可以安全地从JSON加载这种简单的保存到JSON?
- 我只关心日期部分,不关心时间部分
- 日期格式本身并不重要,只要它明确地标识了日期(例如,由于美国和英国日期之间的歧义,我希望避免2012年1月1日)。如果它是人类可读的,那就太好了,但如果它能区分它的工作和不工作,我宁愿让它工作
目前,我已经为自己编写了一些简短的JavaScript函数,用于发出和解析ISO8601格式的日期字符串(例如2012-03-20
),它们是:
/**
* Parses an ISO8601 date string
*/
function parseISODate(str) {
var dateParts = str.split('-');
var retVal = new Date;
retVal.setUTCFullYear(Number(dateParts[0]));
retVal.setUTCMonth(Number(dateParts[1]) - 1);
retVal.setUTCDate(Number(dateParts[2]));
return retVal;
}
/**
* Gets an ISO8601 date string
*/
function iSODateString(d) {
function pad(n) {
return n < 10 ? '0' + n : n;
}
return d.getUTCFullYear() + '-'
+ pad(d.getUTCMonth() + 1) + '-'
+ pad(d.getUTCDate());
}
除此之外,我还需要将日期分析器给我的日期调整回UTC,否则在某些时区,我最终会得到昨天的日期:
var value = $('#element').datepicker('getDate');
value.setMinutes(value.getMinutes() - value.getTimezoneOffset());
return iSODateString(value); // gives me 2012-03-19
$('#element').datepicker('setDate', parseISODate(value));
令人惊讶的是,当试图以上述格式解析日期时,以下方法都不起作用:
- 标准IE9
Date.parse
- js-iso860
- Datejs