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.