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

时间:2012-03-19 17:38:25

标签: jquery date internationalization cross-browser jquery-ui-datepicker

我有一个datepicker我正在获取并设置日期(然后使用以下代码使用json2.js将其序列化为JSON:

$('#element').datepicker('getDate'); // returns 2012-03-19T00:00:00.000Z
$('#element').datepicker('setDate', value);

不幸的是,这会将数据选择器中的日期值设置为{vi 1}下的30/08/2017(这是错误的我不知道从哪里获取此值)和IE9下的NaN/NaN/NaN

我已尝试将第二行更改为以下内容:

$('#element').datepicker('setDate', new Date(value));

这适用于Firefox,但我仍然在IE9中得到相同的结果。

然后我有点疯狂并开始尝试使用字符串操作以其他格式编写和解析日期,希望我能够可靠地获得一个简单的写/解析方案,但最终成为了比我预期的代码多得多 - 结合我需要考虑时区的事实(在某些时区,我可能会得到类似于2012年3月20日的2012-03-18T23:00:00.000Z,即日期组件表示我的信心目前有点动摇,因为它在时区和浏览器中起作用非常重要。

是否有一种可靠的方法可以安全地从JSON中轻松保存到JSON加载?

  • 我只关心日期组件,而不关心时间组件
  • 日期格式本身并不重要,只要它明确地标明日期(例如,由于美国和英国日期之间存在歧义,我想避免在01/01/2012)。如果它是人类可读的,那将是很好的,但是如果它使它起作用的区别,我宁愿让它工作!

1 个答案:

答案 0 :(得分: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));

令人惊讶的是,当尝试以上述格式解析日期时,以下方法均无效: