2013年1月31日 星期四

ISO8601 and User Timezone in JavaScript

以下程式碼主要是參考:
  1. JavaScript and ISO 8601
  2. Getting the client's timezone in JavaScript
除了Date.prototype.setISO8601之外我都改寫過。
Date.prototype.setISO8601
Date.prototype.setISO8601 = function(string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})"
            + "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?"
            + "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) {
        date.setMonth(d[3] - 1);
    }
    if (d[5]) {
        date.setDate(d[5]);
    }
    if (d[7]) {
        date.setHours(d[7]);
    }
    if (d[8]) {
        date.setMinutes(d[8]);
    }
    if (d[10]) {
        date.setSeconds(d[10]);
    }
    if (d[12]) {
        date.setMilliseconds(Number("0." + d[12]) * 1000);
    }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
};
Date.prototype.getISO8601
Date.prototype.getISO8601 = function() {
    return this.getFullYear() + '-' + (this.getMonth() + 1).format(2) + '-'
            + this.getDate().format(2) + 'T' + this.getHours().format(2) + ':'
            + this.getMinutes().format(2) + ':' + this.getSeconds().format(2)
            + '.' + this.getMilliseconds().format(3) + this.getTimezone();
};
Date.prototype.getTimezone
Date.prototype.getTimezone = function() {
    var offset = -this.getTimezoneOffset();
    if (offset == 0) {
        return "Z";
    }
    var hour = parseInt(Math.abs(offset / 60)).format(2);
    var minute = Math.abs(offset % 60).format(2)
    var sign = offset > 0 ? "+" : "-";
    return sign + hour + ":" + minute;
};
Number.prototype.format
Number.prototype.format = function(length) {
    var str = "" + this;
    while (str.length < length) {
        str = '0' + str;
    }
    return str;
};
Test Case
var date = new Date();
date.setISO8601('2012-01-30T16:07:03.007Z');
print(date.getISO8601());

date.setISO8601('2012-01-30T16:07:03.012+08:00');
print(date.getISO8601());

var today = new Date();
print(today.getISO8601());
Test Result