OSDN Git Service

d9017db20621c42d100992d94a61715a7fe53f9c
[webchat/WebChat.git] / public / scripts / dateformat.js
1 /*
2 --------------------------------------------------------
3 dateformat.js - Simple date formatter
4 Version 1.1 (Update 2008/04/02)
5
6 Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com)
7
8 Released under an MIT-style license.
9
10 For details, see the web site:
11  http://www.enjoyxstudy.com/javascript/dateformat/
12
13 --------------------------------------------------------
14 patterns
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"
23
24 Text can be quoted using single quotes (') to avoid interpretation.
25 "''" represents a single quote. 
26
27
28 Useing..
29
30  var fmt = new DateFormat("yyyy/MM/dd HH:mm:ss SSS");
31
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
34
35 --------------------------------------------------------
36 */
37
38 var DateFormat = function(pattern) {
39   this._init(pattern);
40 };
41
42 DateFormat.prototype = {
43   _init: function(pattern) {
44
45     this.pattern = pattern;
46     this._patterns = [];
47
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;
52       } else {
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;
58           } else {
59             this._patterns[index + 1] = ch;
60           }
61         } else if (this._patterns[index].charAt(0) == ch) {
62           this._patterns[index] += ch;
63         } else {
64           this._patterns[index + 1] = ch;
65         }
66       }
67     }
68   },
69
70   format: function(date) {
71
72     var result = [];
73     for (var i = 0; i < this._patterns.length; i++) {
74       result[i] = this._formatWord(date, this._patterns[i]);
75     }
76     return result.join('');
77   },
78   _formatWord: function(date, pattern) {
79
80     var formatter = this._formatter[pattern.charAt(0)];
81     if (formatter) {
82       return formatter.apply(this, [date, pattern]);
83     } else {
84       return pattern;
85     }
86   },
87   _formatter: {
88     "y": function(date, pattern) {
89       // Year
90       var year = String(date.getFullYear());
91       if (pattern.length <= 2) {
92         year = year.substring(2, 4);
93       } else {
94         year = this._zeroPadding(year, pattern.length);
95       }
96       return year;
97     },
98     "M": function(date, pattern) {
99       // Month in year
100       return this._zeroPadding(String(date.getMonth() + 1), pattern.length);
101     },
102     "d": function(date, pattern) {
103       // Day in month
104       return this._zeroPadding(String(date.getDate()), pattern.length);
105     },
106     "H": function(date, pattern) {
107       // Hour in day (0-23)
108       return this._zeroPadding(String(date.getHours()), pattern.length);
109     },
110     "m": function(date, pattern) {
111       // Minute in hour
112       return this._zeroPadding(String(date.getMinutes()), pattern.length);
113     },
114     "s": function(date, pattern) {
115       // Second in minute
116       return this._zeroPadding(String(date.getSeconds()), pattern.length);
117     },
118     "S": function(date, pattern) {
119       // Millisecond
120       return this._zeroPadding(String(date.getMilliseconds()), pattern.length);
121     },
122     "'": function(date, pattern) {
123       // escape
124       if (pattern == "''") {
125         return "'";
126       } else {
127         return pattern.replace(/'/g, '');
128       }
129     }
130   },
131
132   _zeroPadding: function(str, length) {
133     if (str.length >= length) {
134       return str;
135     }
136
137     return new Array(length - str.length + 1).join("0") + str;
138   },
139
140
141   /// Parser ///
142   parse: function(text) {
143
144     if (typeof text != 'string' || text == '') return null;
145
146     var result = {year: 1970, month: 1, day: 1, hour: 0, min: 0, sec: 0, msec: 0};
147
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!!
152     }
153     if (text != '') return null; // parse error!!
154
155     return new Date(
156                 result.year,
157                 result.month - 1,
158                 result.day,
159                 result.hour,
160                 result.min,
161                 result.sec,
162                 result.msec);
163   },
164   _parseWord: function(text, pattern, result) {
165
166     var parser = this._parser[pattern.charAt(0)];
167     if (parser) {
168       return parser.apply(this, [text, pattern, result]);
169     } else {
170       if (text.indexOf(pattern) != 0) {
171         return null;
172       } else {
173         return text.substring(pattern.length);
174       }
175     }
176   },
177   _parser: {
178     "y": function(text, pattern, result) {
179       // Year
180       var year;
181       if (pattern.length <= 2) {
182         year = text.substring(0, 2);
183         year = year < 70 ? '20' + year : '19' + year;
184         text = text.substring(2);
185       } else {
186         var length = (pattern.length == 3) ? 4 : pattern.length;
187         year = text.substring(0, length);
188         text = text.substring(length);
189       }
190       if (!this._isNumber(year)) return null; // error
191       result.year = parseInt(year, 10);
192       return text;
193     },
194     "M": function(text, pattern, result) {
195       // Month in year
196       var month;
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);
201       } else {
202         month = text.substring(0, pattern.length);
203         text  = text.substring(pattern.length);
204       }
205       if (!this._isNumber(month)) return null; // error
206       result.month = parseInt(month, 10);
207       return text;
208     },
209     "d": function(text, pattern, result) {
210       // Day in month
211       var day;
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);
216       } else {
217         day  = text.substring(0, pattern.length);
218         text = text.substring(pattern.length);
219       }
220       if (!this._isNumber(day)) return null; // error
221       result.day = parseInt(day, 10);
222       return text;
223     },
224     "H": function(text, pattern, result) {
225       // Hour in day (0-23)
226       var hour;
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);
231       } else {
232         hour = text.substring(0, pattern.length);
233         text = text.substring(pattern.length);
234       }
235       if (!this._isNumber(hour)) return null; // error
236       result.hour = parseInt(hour, 10);
237       return text;
238     },
239     "m": function(text, pattern, result) {
240       // Minute in hour
241       var min;
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);
246       } else {
247         min  = text.substring(0, pattern.length);
248         text = text.substring(pattern.length);
249       }
250       if (!this._isNumber(min)) return null; // error
251       result.min = parseInt(min, 10);
252       return text;
253     },
254     "s": function(text, pattern, result) {
255       // Second in minute
256       var sec;
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);
261       } else {
262         sec  = text.substring(0, pattern.length);
263         text = text.substring(pattern.length);
264       }
265       if (!this._isNumber(sec)) return null; // error
266       result.sec = parseInt(sec, 10);
267       return text;
268     },
269     "S": function(text, pattern, result) {
270       // Millimsecond
271       var msec;
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);
279         } else {
280           msec = text.substring(0, pattern.length);
281           text = text.substring(pattern.length);
282         }
283       } else {
284         msec = text.substring(0, pattern.length);
285         text = text.substring(pattern.length);
286       }
287       if (!this._isNumber(msec)) return null; // error
288       result.msec = parseInt(msec, 10);
289       return text;
290     },
291     "'": function(text, pattern, result) {
292       // escape
293       if (pattern == "''") {
294         pattern = "'";
295       } else {
296         pattern = pattern.replace(/'/g, '');
297       }
298       if (text.indexOf(pattern) != 0) {
299         return null; // error
300       } else {
301         return text.substring(pattern.length);
302       }
303     }
304   },
305
306   _isNumber: function(str) {
307     return /^[0-9]*$/.test(str);
308   }
309 }