1/* 2-------------------------------------------------------- 3dateformat.js - Simple date formatter 4Version 1.1 (Update 2008/04/02) 5 6Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com) 7 8Released under an MIT-style license. 9 10For details, see the web site: 11 http://www.enjoyxstudy.com/javascript/dateformat/ 12 13-------------------------------------------------------- 14patterns 15y : Year ex. "yyyy" -> "2007", "yy" -> "07" 16M : Month ex. "MM" -> "05" "12", "M" -> "5" "12" 17d : Day ex. "dd" -> "09" "30", "d" -> "9" "30" 18H : Hour (0-23) ex. "HH" -> "00" "23", "H" -> "0" "23" 19m : Minute ex. "mm" -> "01" "59", "m" -> "1" "59" 20s : Second ex. "ss" -> "00" "59", "H" -> "0" "59" 21S : Millisecond ex. "SSS" -> "000" "012" "999", 22 "SS" -> "00" "12" "999", "S" -> "0" "12" "999" 23 24Text can be quoted using single quotes (') to avoid interpretation. 25"''" represents a single quote. 26 27 28Useing.. 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 38var DateFormat = function(pattern) { 39 this._init(pattern); 40}; 41 42DateFormat.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}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.