/* -------------------------------------------------------- dateformat.js - Simple date formatter Version 1.1 (Update 2008/04/02) Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com) Released under an MIT-style license. For details, see the web site: http://www.enjoyxstudy.com/javascript/dateformat/ -------------------------------------------------------- patterns y : Year ex. "yyyy" -> "2007", "yy" -> "07" M : Month ex. "MM" -> "05" "12", "M" -> "5" "12" d : Day ex. "dd" -> "09" "30", "d" -> "9" "30" H : Hour (0-23) ex. "HH" -> "00" "23", "H" -> "0" "23" m : Minute ex. "mm" -> "01" "59", "m" -> "1" "59" s : Second ex. "ss" -> "00" "59", "H" -> "0" "59" S : Millisecond ex. "SSS" -> "000" "012" "999", "SS" -> "00" "12" "999", "S" -> "0" "12" "999" Text can be quoted using single quotes (') to avoid interpretation. "''" represents a single quote. Useing.. var fmt = new DateFormat("yyyy/MM/dd HH:mm:ss SSS"); var str = fmt.format(new Date()); // "2007/05/10 12:21:19 002" var date = fmt.parse("2007/05/10 12:21:19 002"); // return Date object -------------------------------------------------------- */ var DateFormat = function(pattern) { this._init(pattern); }; DateFormat.prototype = { _init: function(pattern) { this.pattern = pattern; this._patterns = []; for (var i = 0; i < pattern.length; i++) { var ch = pattern.charAt(i); if (this._patterns.length == 0) { this._patterns[0] = ch; } else { var index = this._patterns.length - 1; if (this._patterns[index].charAt(0) == "'") { if (this._patterns[index].length == 1 || this._patterns[index].charAt(this._patterns[index].length - 1) != "'") { this._patterns[index] += ch; } else { this._patterns[index + 1] = ch; } } else if (this._patterns[index].charAt(0) == ch) { this._patterns[index] += ch; } else { this._patterns[index + 1] = ch; } } } }, format: function(date) { var result = []; for (var i = 0; i < this._patterns.length; i++) { result[i] = this._formatWord(date, this._patterns[i]); } return result.join(''); }, _formatWord: function(date, pattern) { var formatter = this._formatter[pattern.charAt(0)]; if (formatter) { return formatter.apply(this, [date, pattern]); } else { return pattern; } }, _formatter: { "y": function(date, pattern) { // Year var year = String(date.getFullYear()); if (pattern.length <= 2) { year = year.substring(2, 4); } else { year = this._zeroPadding(year, pattern.length); } return year; }, "M": function(date, pattern) { // Month in year return this._zeroPadding(String(date.getMonth() + 1), pattern.length); }, "d": function(date, pattern) { // Day in month return this._zeroPadding(String(date.getDate()), pattern.length); }, "H": function(date, pattern) { // Hour in day (0-23) return this._zeroPadding(String(date.getHours()), pattern.length); }, "m": function(date, pattern) { // Minute in hour return this._zeroPadding(String(date.getMinutes()), pattern.length); }, "s": function(date, pattern) { // Second in minute return this._zeroPadding(String(date.getSeconds()), pattern.length); }, "S": function(date, pattern) { // Millisecond return this._zeroPadding(String(date.getMilliseconds()), pattern.length); }, "'": function(date, pattern) { // escape if (pattern == "''") { return "'"; } else { return pattern.replace(/'/g, ''); } } }, _zeroPadding: function(str, length) { if (str.length >= length) { return str; } return new Array(length - str.length + 1).join("0") + str; }, /// Parser /// parse: function(text) { if (typeof text != 'string' || text == '') return null; var result = {year: 1970, month: 1, day: 1, hour: 0, min: 0, sec: 0, msec: 0}; for (var i = 0; i < this._patterns.length; i++) { if (text == '') return null; // parse error!! text = this._parseWord(text, this._patterns[i], result); if (text === null) return null; // parse error!! } if (text != '') return null; // parse error!! return new Date( result.year, result.month - 1, result.day, result.hour, result.min, result.sec, result.msec); }, _parseWord: function(text, pattern, result) { var parser = this._parser[pattern.charAt(0)]; if (parser) { return parser.apply(this, [text, pattern, result]); } else { if (text.indexOf(pattern) != 0) { return null; } else { return text.substring(pattern.length); } } }, _parser: { "y": function(text, pattern, result) { // Year var year; if (pattern.length <= 2) { year = text.substring(0, 2); year = year < 70 ? '20' + year : '19' + year; text = text.substring(2); } else { var length = (pattern.length == 3) ? 4 : pattern.length; year = text.substring(0, length); text = text.substring(length); } if (!this._isNumber(year)) return null; // error result.year = parseInt(year, 10); return text; }, "M": function(text, pattern, result) { // Month in year var month; if (pattern.length == 1 && text.length > 1 && text.substring(0, 2).match(/1[0-2]/) != null) { month = text.substring(0, 2); text = text.substring(2); } else { month = text.substring(0, pattern.length); text = text.substring(pattern.length); } if (!this._isNumber(month)) return null; // error result.month = parseInt(month, 10); return text; }, "d": function(text, pattern, result) { // Day in month var day; if (pattern.length == 1 && text.length > 1 && text.substring(0, 2).match(/1[0-9]|2[0-9]|3[0-1]/) != null) { day = text.substring(0, 2); text = text.substring(2); } else { day = text.substring(0, pattern.length); text = text.substring(pattern.length); } if (!this._isNumber(day)) return null; // error result.day = parseInt(day, 10); return text; }, "H": function(text, pattern, result) { // Hour in day (0-23) var hour; if (pattern.length == 1 && text.length > 1 && text.substring(0, 2).match(/1[0-9]|2[0-3]/) != null) { hour = text.substring(0, 2); text = text.substring(2); } else { hour = text.substring(0, pattern.length); text = text.substring(pattern.length); } if (!this._isNumber(hour)) return null; // error result.hour = parseInt(hour, 10); return text; }, "m": function(text, pattern, result) { // Minute in hour var min; if (pattern.length == 1 && text.length > 1 && text.substring(0, 2).match(/[1-5][0-9]/) != null) { min = text.substring(0, 2); text = text.substring(2); } else { min = text.substring(0, pattern.length); text = text.substring(pattern.length); } if (!this._isNumber(min)) return null; // error result.min = parseInt(min, 10); return text; }, "s": function(text, pattern, result) { // Second in minute var sec; if (pattern.length == 1 && text.length > 1 && text.substring(0, 2).match(/[1-5][0-9]/) != null) { sec = text.substring(0, 2); text = text.substring(2); } else { sec = text.substring(0, pattern.length); text = text.substring(pattern.length); } if (!this._isNumber(sec)) return null; // error result.sec = parseInt(sec, 10); return text; }, "S": function(text, pattern, result) { // Millimsecond var msec; if (pattern.length == 1 || pattern.length == 2) { if (text.length > 2 && text.substring(0, 3).match(/[1-9][0-9][0-9]/) != null) { msec = text.substring(0, 3); text = text.substring(3); } else if (text.length > 1 && text.substring(0, 2).match(/[1-9][0-9]/) != null) { msec = text.substring(0, 2); text = text.substring(2); } else { msec = text.substring(0, pattern.length); text = text.substring(pattern.length); } } else { msec = text.substring(0, pattern.length); text = text.substring(pattern.length); } if (!this._isNumber(msec)) return null; // error result.msec = parseInt(msec, 10); return text; }, "'": function(text, pattern, result) { // escape if (pattern == "''") { pattern = "'"; } else { pattern = pattern.replace(/'/g, ''); } if (text.indexOf(pattern) != 0) { return null; // error } else { return text.substring(pattern.length); } } }, _isNumber: function(str) { return /^[0-9]*$/.test(str); } }