00001 var dateFormatter = exports
00002
00003
00004 var iso8601 = new RegExp(
00005 '([0-9]{4})([-]?([0-9]{2})([-]?([0-9]{2})'
00006 + '(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?'
00007 + '(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?'
00008 )
00009
00010
00011
00012
00013
00014
00015
00016
00017 dateFormatter.decodeIso8601 = function(time) {
00018 var dateParts = time.toString().match(iso8601)
00019 if (!dateParts) {
00020 throw new Error('Expected a ISO8601 datetime but got \'' + time + '\'')
00021 }
00022
00023 var date = [
00024 [dateParts[1], dateParts[3] || '01', dateParts[5] || '01'].join('-')
00025 , 'T'
00026 , [dateParts[7] || '00', dateParts[8] || '00', dateParts[10] || '00'].join(':')
00027 , '.'
00028 , dateParts[12] || '000'
00029 , dateParts[13] || dateFormatter.formatCurrentOffset()
00030 ].join('')
00031
00032 return new Date(date)
00033 }
00034
00041 dateFormatter.encodeIso8601 = function(date) {
00042 return date.toISOString().replace(/\.\d{3}Z/, 'Z')
00043 }
00044
00054 function zeroPad(digit, length) {
00055 var padded = '' + digit
00056 while (padded.length < length) {
00057 padded = '0' + padded
00058 }
00059
00060 return padded
00061 }
00062
00069 dateFormatter.formatCurrentOffset = function () {
00070 var offset = new Date().getTimezoneOffset()
00071 return (offset === 0) ? 'Z' : [
00072 (offset < 0) ? '+' : '-'
00073 , zeroPad(Math.abs(Math.floor(offset/60)),2)
00074 , ':'
00075 , zeroPad(Math.abs(offset%60),2)
00076 ].join('')
00077 }