Ahmad Masykur

Share your knowledge although one function!

About the author

Ahmad Masykur is a Software Architecture Engineer at PT. Freeport Indonesia Jakarta Indonesia.
In this blog, I share things of interest to me. Most topics are likely to be related to software development, but don't hold me to it.

Certificates



Awards


Powered by

Widget Prayer Time not found.

There is an error in XML document (4, 16278).X

Page List

Validators


Ahmad Masykur

Extend Objek Date JavaScript untuk Parsing Format Tanggal ISO 8601

Perbedaan format tanggal memang menjadi permasalahan para programmer saat melakukan pertukaran data dengan tipe data Date antara satu sistem dengan sistem lainnya, antara format negara satu dengan negara lainnya. Dengan adanya perbedaan ini, dibuat standar ISO dalam merepresentasikan tanggal dalam string. Standar tersebut disebut sebagai ISO 8601. Pada standar ISO 8601, tanggal ditulis dalam format YYYY-MM-DDThh:mm:ss.sTZD. Standar ISO 8601 ini telah bayak digunakan dalam format pertukaran data seperti XML Web-Service.

Constructor Date JavaScript hanya memiliki empat bentuk sebagai berikut.

new Date()
new Date(milliseconds)
new Date(dateString)
new Date(yr_num, mo_num, day_num
        [, hr_num, min_num, sec_num, ms_num]) 

Keempat bentuk constructor tersebut tidak memiliki parameter input dalam format string ISO 8601. Pada parameter string hanya menerima tanggal dalam standar IETF seperti "Thu, 3 Jan 2008 18:30:00 GMT". Untuk melakukan parsing tanggal dalam format ISO 8601 dapat dilakukan dengan meng-extend object Date yang sudah ada (hal ini seperti penurunan/inheritance pada konsep Object Oriented Programming). Berikut kode untuk melakukan extend object Date.

 

Date.prototype.parseFromISO8601 = 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));
}

Dengan menggunakan regular expression, string tanggal dipecah ke dalam nilai tahun, bulan, tanggal, jam, menit, detik, milidetik dan offset zona waktu. Penggunaan parser ini sangat sederhana seperti pada contoh berikut.

var tgl = new Date();
tgl.parseFromISO8601('2008-01-03T18:30:00');

Sebaliknya, untuk merubah objek Date menjadi string ISO 8601 juga dapat dilakukan dengan menambahkan fungsi toISO8601String ke dalam objek Date.

Date.prototype.toISO8601String = function (format, offset) {
    /* accepted values for the format [1-6]:
     1 Year:
       YYYY (eg 1997)
     2 Year and month:
       YYYY-MM (eg 1997-07)
     3 Complete date:
       YYYY-MM-DD (eg 1997-07-16)
     4 Complete date plus hours and minutes:
       YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
     5 Complete date plus hours, minutes and seconds:
       YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
     6 Complete date plus hours, minutes, seconds and a decimal
       fraction of a second
       YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
    */
    if (!format) { var format = 6; }
    if (!offset) {
        var offset = 'Z';
        var date = this;
    } else {
        var d = offset.match(/([-+])([0-9]{2}):([0-9]{2})/);
        var offsetnum = (Number(d[2]) * 60) + Number(d[3]);
        offsetnum *= ((d[1] == '-') ? -1 : 1);
        var date = new Date(Number(Number(this) + (offsetnum * 60000)));
    }

    var zeropad = function (num) { return ((num < 10) ? '0' : '') + num; }

    var str = "";
    str += date.getUTCFullYear();
    if (format > 1) { str += "-" + zeropad(date.getUTCMonth() + 1); }
    if (format > 2) { str += "-" + zeropad(date.getUTCDate()); }
    if (format > 3) {
        str += "T" + zeropad(date.getUTCHours()) +
               ":" + zeropad(date.getUTCMinutes());
    }
    if (format > 5) {
        var secs = Number(date.getUTCSeconds() + "." +
                   ((date.getUTCMilliseconds() < 100) ? '0' : '') +
                   zeropad(date.getUTCMilliseconds()));
        str += ":" + zeropad(secs);
    } else if (format > 4) { str += ":" + zeropad(date.getUTCSeconds()); }

    if (format > 3) { str += offset; }
    return str;
}

Fungsi di atas memiliki dua parameter yang pertama adalah format yang disediakan dan kedua adalah offset zona waktu. Penggunaannya juga sangat sederhana seperti terlihat pada contoh berikut.

var strISO = tgl.toISO8601String(6);

Dengan menambahkan kedua fungsi tersebut di atas, maka data dalam format ISO 8601 seperti yang berasal dari call webservice dapat diparsing dengan mudah.


Categories: JavaScript
E-mail |