/TmplApp/TmplApp/root/js/dateformat.js

https://github.com/jyun16/wiz-perl · JavaScript · 310 lines · 239 code · 18 blank · 53 comment · 98 complexity · c2400c5729278e9a14e6bbc6676cfc12 MD5 · raw file

  1. /*
  2. --------------------------------------------------------
  3. dateformat.js - Simple date formatter
  4. Version 1.1 (Update 2008/04/02)
  5. Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com)
  6. Released under an MIT-style license.
  7. For details, see the web site:
  8. http://www.enjoyxstudy.com/javascript/dateformat/
  9. --------------------------------------------------------
  10. patterns
  11. y : Year ex. "yyyy" -> "2007", "yy" -> "07"
  12. M : Month ex. "MM" -> "05" "12", "M" -> "5" "12"
  13. d : Day ex. "dd" -> "09" "30", "d" -> "9" "30"
  14. H : Hour (0-23) ex. "HH" -> "00" "23", "H" -> "0" "23"
  15. m : Minute ex. "mm" -> "01" "59", "m" -> "1" "59"
  16. s : Second ex. "ss" -> "00" "59", "H" -> "0" "59"
  17. S : Millisecond ex. "SSS" -> "000" "012" "999",
  18. "SS" -> "00" "12" "999", "S" -> "0" "12" "999"
  19. Text can be quoted using single quotes (') to avoid interpretation.
  20. "''" represents a single quote.
  21. Useing..
  22. var fmt = new DateFormat("yyyy/MM/dd HH:mm:ss SSS");
  23. var str = fmt.format(new Date()); // "2007/05/10 12:21:19 002"
  24. var date = fmt.parse("2007/05/10 12:21:19 002"); // return Date object
  25. --------------------------------------------------------
  26. */
  27. var DateFormat = function(pattern) {
  28. this._init(pattern);
  29. };
  30. DateFormat.prototype = {
  31. _init: function(pattern) {
  32. this.pattern = pattern;
  33. this._patterns = [];
  34. for (var i = 0; i < pattern.length; i++) {
  35. var ch = pattern.charAt(i);
  36. if (this._patterns.length == 0) {
  37. this._patterns[0] = ch;
  38. } else {
  39. var index = this._patterns.length - 1;
  40. if (this._patterns[index].charAt(0) == "'") {
  41. if (this._patterns[index].length == 1
  42. || this._patterns[index].charAt(this._patterns[index].length - 1) != "'") {
  43. this._patterns[index] += ch;
  44. } else {
  45. this._patterns[index + 1] = ch;
  46. }
  47. } else if (this._patterns[index].charAt(0) == ch) {
  48. this._patterns[index] += ch;
  49. } else {
  50. this._patterns[index + 1] = ch;
  51. }
  52. }
  53. }
  54. },
  55. format: function(date) {
  56. var result = [];
  57. for (var i = 0; i < this._patterns.length; i++) {
  58. result[i] = this._formatWord(date, this._patterns[i]);
  59. }
  60. return result.join('');
  61. },
  62. _formatWord: function(date, pattern) {
  63. var formatter = this._formatter[pattern.charAt(0)];
  64. if (formatter) {
  65. return formatter.apply(this, [date, pattern]);
  66. } else {
  67. return pattern;
  68. }
  69. },
  70. _formatter: {
  71. "y": function(date, pattern) {
  72. // Year
  73. var year = String(date.getFullYear());
  74. if (pattern.length <= 2) {
  75. year = year.substring(2, 4);
  76. } else {
  77. year = this._zeroPadding(year, pattern.length);
  78. }
  79. return year;
  80. },
  81. "M": function(date, pattern) {
  82. // Month in year
  83. return this._zeroPadding(String(date.getMonth() + 1), pattern.length);
  84. },
  85. "d": function(date, pattern) {
  86. // Day in month
  87. return this._zeroPadding(String(date.getDate()), pattern.length);
  88. },
  89. "H": function(date, pattern) {
  90. // Hour in day (0-23)
  91. return this._zeroPadding(String(date.getHours()), pattern.length);
  92. },
  93. "m": function(date, pattern) {
  94. // Minute in hour
  95. return this._zeroPadding(String(date.getMinutes()), pattern.length);
  96. },
  97. "s": function(date, pattern) {
  98. // Second in minute
  99. return this._zeroPadding(String(date.getSeconds()), pattern.length);
  100. },
  101. "S": function(date, pattern) {
  102. // Millisecond
  103. return this._zeroPadding(String(date.getMilliseconds()), pattern.length);
  104. },
  105. "'": function(date, pattern) {
  106. // escape
  107. if (pattern == "''") {
  108. return "'";
  109. } else {
  110. return pattern.replace(/'/g, '');
  111. }
  112. }
  113. },
  114. _zeroPadding: function(str, length) {
  115. if (str.length >= length) {
  116. return str;
  117. }
  118. return new Array(length - str.length + 1).join("0") + str;
  119. },
  120. /// Parser ///
  121. parse: function(text) {
  122. if (typeof text != 'string' || text == '') return null;
  123. var result = {year: 1970, month: 1, day: 1, hour: 0, min: 0, sec: 0, msec: 0};
  124. for (var i = 0; i < this._patterns.length; i++) {
  125. if (text == '') return null; // parse error!!
  126. text = this._parseWord(text, this._patterns[i], result);
  127. if (text === null) return null; // parse error!!
  128. }
  129. if (text != '') return null; // parse error!!
  130. return new Date(
  131. result.year,
  132. result.month - 1,
  133. result.day,
  134. result.hour,
  135. result.min,
  136. result.sec,
  137. result.msec);
  138. },
  139. _parseWord: function(text, pattern, result) {
  140. var parser = this._parser[pattern.charAt(0)];
  141. if (parser) {
  142. return parser.apply(this, [text, pattern, result]);
  143. } else {
  144. if (text.indexOf(pattern) != 0) {
  145. return null;
  146. } else {
  147. return text.substring(pattern.length);
  148. }
  149. }
  150. },
  151. _parser: {
  152. "y": function(text, pattern, result) {
  153. // Year
  154. var year;
  155. if (pattern.length <= 2) {
  156. year = text.substring(0, 2);
  157. year = year < 70 ? '20' + year : '19' + year;
  158. text = text.substring(2);
  159. } else {
  160. var length = (pattern.length == 3) ? 4 : pattern.length;
  161. year = text.substring(0, length);
  162. text = text.substring(length);
  163. }
  164. if (!this._isNumber(year)) return null; // error
  165. result.year = parseInt(year, 10);
  166. return text;
  167. },
  168. "M": function(text, pattern, result) {
  169. // Month in year
  170. var month;
  171. if (pattern.length == 1 && text.length > 1
  172. && text.substring(0, 2).match(/1[0-2]/) != null) {
  173. month = text.substring(0, 2);
  174. text = text.substring(2);
  175. } else {
  176. month = text.substring(0, pattern.length);
  177. text = text.substring(pattern.length);
  178. }
  179. if (!this._isNumber(month)) return null; // error
  180. result.month = parseInt(month, 10);
  181. return text;
  182. },
  183. "d": function(text, pattern, result) {
  184. // Day in month
  185. var day;
  186. if (pattern.length == 1 && text.length > 1
  187. && text.substring(0, 2).match(/1[0-9]|2[0-9]|3[0-1]/) != null) {
  188. day = text.substring(0, 2);
  189. text = text.substring(2);
  190. } else {
  191. day = text.substring(0, pattern.length);
  192. text = text.substring(pattern.length);
  193. }
  194. if (!this._isNumber(day)) return null; // error
  195. result.day = parseInt(day, 10);
  196. return text;
  197. },
  198. "H": function(text, pattern, result) {
  199. // Hour in day (0-23)
  200. var hour;
  201. if (pattern.length == 1 && text.length > 1
  202. && text.substring(0, 2).match(/1[0-9]|2[0-3]/) != null) {
  203. hour = text.substring(0, 2);
  204. text = text.substring(2);
  205. } else {
  206. hour = text.substring(0, pattern.length);
  207. text = text.substring(pattern.length);
  208. }
  209. if (!this._isNumber(hour)) return null; // error
  210. result.hour = parseInt(hour, 10);
  211. return text;
  212. },
  213. "m": function(text, pattern, result) {
  214. // Minute in hour
  215. var min;
  216. if (pattern.length == 1 && text.length > 1
  217. && text.substring(0, 2).match(/[1-5][0-9]/) != null) {
  218. min = text.substring(0, 2);
  219. text = text.substring(2);
  220. } else {
  221. min = text.substring(0, pattern.length);
  222. text = text.substring(pattern.length);
  223. }
  224. if (!this._isNumber(min)) return null; // error
  225. result.min = parseInt(min, 10);
  226. return text;
  227. },
  228. "s": function(text, pattern, result) {
  229. // Second in minute
  230. var sec;
  231. if (pattern.length == 1 && text.length > 1
  232. && text.substring(0, 2).match(/[1-5][0-9]/) != null) {
  233. sec = text.substring(0, 2);
  234. text = text.substring(2);
  235. } else {
  236. sec = text.substring(0, pattern.length);
  237. text = text.substring(pattern.length);
  238. }
  239. if (!this._isNumber(sec)) return null; // error
  240. result.sec = parseInt(sec, 10);
  241. return text;
  242. },
  243. "S": function(text, pattern, result) {
  244. // Millimsecond
  245. var msec;
  246. if (pattern.length == 1 || pattern.length == 2) {
  247. if (text.length > 2 && text.substring(0, 3).match(/[1-9][0-9][0-9]/) != null) {
  248. msec = text.substring(0, 3);
  249. text = text.substring(3);
  250. } else if (text.length > 1 && text.substring(0, 2).match(/[1-9][0-9]/) != null) {
  251. msec = text.substring(0, 2);
  252. text = text.substring(2);
  253. } else {
  254. msec = text.substring(0, pattern.length);
  255. text = text.substring(pattern.length);
  256. }
  257. } else {
  258. msec = text.substring(0, pattern.length);
  259. text = text.substring(pattern.length);
  260. }
  261. if (!this._isNumber(msec)) return null; // error
  262. result.msec = parseInt(msec, 10);
  263. return text;
  264. },
  265. "'": function(text, pattern, result) {
  266. // escape
  267. if (pattern == "''") {
  268. pattern = "'";
  269. } else {
  270. pattern = pattern.replace(/'/g, '');
  271. }
  272. if (text.indexOf(pattern) != 0) {
  273. return null; // error
  274. } else {
  275. return text.substring(pattern.length);
  276. }
  277. }
  278. },
  279. _isNumber: function(str) {
  280. return /^[0-9]*$/.test(str);
  281. }
  282. }