可靠的跨浏览器设置和获取日期选择器的方法



我有一个日期选择器,我用它来获取和设置日期(然后使用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

最新更新