2 --------------------------------------------------------
3 dateformat.js - Simple date formatter
4 Version 1.1 (Update 2008/04/02)
6 Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com)
8 Released under an MIT-style license.
10 For details, see the web site:
11 http://www.enjoyxstudy.com/javascript/dateformat/
13 --------------------------------------------------------
15 y : Year ex. "yyyy" -> "2007", "yy" -> "07"
16 M : Month ex. "MM" -> "05" "12", "M" -> "5" "12"
17 d : Day ex. "dd" -> "09" "30", "d" -> "9" "30"
18 H : Hour (0-23) ex. "HH" -> "00" "23", "H" -> "0" "23"
19 m : Minute ex. "mm" -> "01" "59", "m" -> "1" "59"
20 s : Second ex. "ss" -> "00" "59", "H" -> "0" "59"
21 S : Millisecond ex. "SSS" -> "000" "012" "999",
22 "SS" -> "00" "12" "999", "S" -> "0" "12" "999"
24 Text can be quoted using single quotes (') to avoid interpretation.
25 "''" represents a single quote.
30 var fmt = new DateFormat("yyyy/MM/dd HH:mm:ss SSS");
32 var str = fmt.format(new Date()); // "2007/05/10 12:21:19 002"
33 var date = fmt.parse("2007/05/10 12:21:19 002"); // return Date object
35 --------------------------------------------------------
38 var DateFormat = function(pattern) {
42 DateFormat.prototype = {
43 _init: function(pattern) {
45 this.pattern = pattern;
48 for (var i = 0; i < pattern.length; i++) {
49 var ch = pattern.charAt(i);
50 if (this._patterns.length == 0) {
51 this._patterns[0] = ch;
53 var index = this._patterns.length - 1;
54 if (this._patterns[index].charAt(0) == "'") {
55 if (this._patterns[index].length == 1
56 || this._patterns[index].charAt(this._patterns[index].length - 1) != "'") {
57 this._patterns[index] += ch;
59 this._patterns[index + 1] = ch;
61 } else if (this._patterns[index].charAt(0) == ch) {
62 this._patterns[index] += ch;
64 this._patterns[index + 1] = ch;
70 format: function(date) {
73 for (var i = 0; i < this._patterns.length; i++) {
74 result[i] = this._formatWord(date, this._patterns[i]);
76 return result.join('');
78 _formatWord: function(date, pattern) {
80 var formatter = this._formatter[pattern.charAt(0)];
82 return formatter.apply(this, [date, pattern]);
88 "y": function(date, pattern) {
90 var year = String(date.getFullYear());
91 if (pattern.length <= 2) {
92 year = year.substring(2, 4);
94 year = this._zeroPadding(year, pattern.length);
98 "M": function(date, pattern) {
100 return this._zeroPadding(String(date.getMonth() + 1), pattern.length);
102 "d": function(date, pattern) {
104 return this._zeroPadding(String(date.getDate()), pattern.length);
106 "H": function(date, pattern) {
107 // Hour in day (0-23)
108 return this._zeroPadding(String(date.getHours()), pattern.length);
110 "m": function(date, pattern) {
112 return this._zeroPadding(String(date.getMinutes()), pattern.length);
114 "s": function(date, pattern) {
116 return this._zeroPadding(String(date.getSeconds()), pattern.length);
118 "S": function(date, pattern) {
120 return this._zeroPadding(String(date.getMilliseconds()), pattern.length);
122 "'": function(date, pattern) {
124 if (pattern == "''") {
127 return pattern.replace(/'/g, '');
132 _zeroPadding: function(str, length) {
133 if (str.length >= length) {
137 return new Array(length - str.length + 1).join("0") + str;
142 parse: function(text) {
144 if (typeof text != 'string' || text == '') return null;
146 var result = {year: 1970, month: 1, day: 1, hour: 0, min: 0, sec: 0, msec: 0};
148 for (var i = 0; i < this._patterns.length; i++) {
149 if (text == '') return null; // parse error!!
150 text = this._parseWord(text, this._patterns[i], result);
151 if (text === null) return null; // parse error!!
153 if (text != '') return null; // parse error!!
164 _parseWord: function(text, pattern, result) {
166 var parser = this._parser[pattern.charAt(0)];
168 return parser.apply(this, [text, pattern, result]);
170 if (text.indexOf(pattern) != 0) {
173 return text.substring(pattern.length);
178 "y": function(text, pattern, result) {
181 if (pattern.length <= 2) {
182 year = text.substring(0, 2);
183 year = year < 70 ? '20' + year : '19' + year;
184 text = text.substring(2);
186 var length = (pattern.length == 3) ? 4 : pattern.length;
187 year = text.substring(0, length);
188 text = text.substring(length);
190 if (!this._isNumber(year)) return null; // error
191 result.year = parseInt(year, 10);
194 "M": function(text, pattern, result) {
197 if (pattern.length == 1 && text.length > 1
198 && text.substring(0, 2).match(/1[0-2]/) != null) {
199 month = text.substring(0, 2);
200 text = text.substring(2);
202 month = text.substring(0, pattern.length);
203 text = text.substring(pattern.length);
205 if (!this._isNumber(month)) return null; // error
206 result.month = parseInt(month, 10);
209 "d": function(text, pattern, result) {
212 if (pattern.length == 1 && text.length > 1
213 && text.substring(0, 2).match(/1[0-9]|2[0-9]|3[0-1]/) != null) {
214 day = text.substring(0, 2);
215 text = text.substring(2);
217 day = text.substring(0, pattern.length);
218 text = text.substring(pattern.length);
220 if (!this._isNumber(day)) return null; // error
221 result.day = parseInt(day, 10);
224 "H": function(text, pattern, result) {
225 // Hour in day (0-23)
227 if (pattern.length == 1 && text.length > 1
228 && text.substring(0, 2).match(/1[0-9]|2[0-3]/) != null) {
229 hour = text.substring(0, 2);
230 text = text.substring(2);
232 hour = text.substring(0, pattern.length);
233 text = text.substring(pattern.length);
235 if (!this._isNumber(hour)) return null; // error
236 result.hour = parseInt(hour, 10);
239 "m": function(text, pattern, result) {
242 if (pattern.length == 1 && text.length > 1
243 && text.substring(0, 2).match(/[1-5][0-9]/) != null) {
244 min = text.substring(0, 2);
245 text = text.substring(2);
247 min = text.substring(0, pattern.length);
248 text = text.substring(pattern.length);
250 if (!this._isNumber(min)) return null; // error
251 result.min = parseInt(min, 10);
254 "s": function(text, pattern, result) {
257 if (pattern.length == 1 && text.length > 1
258 && text.substring(0, 2).match(/[1-5][0-9]/) != null) {
259 sec = text.substring(0, 2);
260 text = text.substring(2);
262 sec = text.substring(0, pattern.length);
263 text = text.substring(pattern.length);
265 if (!this._isNumber(sec)) return null; // error
266 result.sec = parseInt(sec, 10);
269 "S": function(text, pattern, result) {
272 if (pattern.length == 1 || pattern.length == 2) {
273 if (text.length > 2 && text.substring(0, 3).match(/[1-9][0-9][0-9]/) != null) {
274 msec = text.substring(0, 3);
275 text = text.substring(3);
276 } else if (text.length > 1 && text.substring(0, 2).match(/[1-9][0-9]/) != null) {
277 msec = text.substring(0, 2);
278 text = text.substring(2);
280 msec = text.substring(0, pattern.length);
281 text = text.substring(pattern.length);
284 msec = text.substring(0, pattern.length);
285 text = text.substring(pattern.length);
287 if (!this._isNumber(msec)) return null; // error
288 result.msec = parseInt(msec, 10);
291 "'": function(text, pattern, result) {
293 if (pattern == "''") {
296 pattern = pattern.replace(/'/g, '');
298 if (text.indexOf(pattern) != 0) {
299 return null; // error
301 return text.substring(pattern.length);
306 _isNumber: function(str) {
307 return /^[0-9]*$/.test(str);