DateTime.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. /**
  2. * Date and time operations.
  3. *
  4. * @author n1474335 [n1474335@gmail.com]
  5. * @copyright Crown Copyright 2016
  6. * @license Apache-2.0
  7. *
  8. * @namespace
  9. */
  10. const DateTime = {
  11. /**
  12. * @constant
  13. * @default
  14. */
  15. UNITS: ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"],
  16. /**
  17. * From UNIX Timestamp operation.
  18. *
  19. * @param {number} input
  20. * @param {Object[]} args
  21. * @returns {string}
  22. */
  23. runFromUnixTimestamp: function(input, args) {
  24. let units = args[0],
  25. d;
  26. input = parseFloat(input);
  27. if (units === "Seconds (s)") {
  28. d = moment.unix(input);
  29. return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss") + " UTC";
  30. } else if (units === "Milliseconds (ms)") {
  31. d = moment(input);
  32. return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
  33. } else if (units === "Microseconds (μs)") {
  34. d = moment(input / 1000);
  35. return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
  36. } else if (units === "Nanoseconds (ns)") {
  37. d = moment(input / 1000000);
  38. return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
  39. } else {
  40. throw "Unrecognised unit";
  41. }
  42. },
  43. /**
  44. * @constant
  45. * @default
  46. */
  47. TREAT_AS_UTC: true,
  48. /**
  49. * To UNIX Timestamp operation.
  50. *
  51. * @param {string} input
  52. * @param {Object[]} args
  53. * @returns {number}
  54. */
  55. runToUnixTimestamp: function(input, args) {
  56. let units = args[0],
  57. treatAsUTC = args[1],
  58. d = treatAsUTC ? moment.utc(input) : moment(input);
  59. if (units === "Seconds (s)") {
  60. return d.unix();
  61. } else if (units === "Milliseconds (ms)") {
  62. return d.valueOf();
  63. } else if (units === "Microseconds (μs)") {
  64. return d.valueOf() * 1000;
  65. } else if (units === "Nanoseconds (ns)") {
  66. return d.valueOf() * 1000000;
  67. } else {
  68. throw "Unrecognised unit";
  69. }
  70. },
  71. /**
  72. * @constant
  73. * @default
  74. */
  75. DATETIME_FORMATS: [
  76. {
  77. name: "Standard date and time",
  78. value: "DD/MM/YYYY HH:mm:ss"
  79. },
  80. {
  81. name: "American-style date and time",
  82. value: "MM/DD/YYYY HH:mm:ss"
  83. },
  84. {
  85. name: "International date and time",
  86. value: "YYYY-MM-DD HH:mm:ss"
  87. },
  88. {
  89. name: "Verbose date and time",
  90. value: "dddd Do MMMM YYYY HH:mm:ss Z z"
  91. },
  92. {
  93. name: "UNIX timestamp (seconds)",
  94. value: "X"
  95. },
  96. {
  97. name: "UNIX timestamp offset (milliseconds)",
  98. value: "x"
  99. },
  100. {
  101. name: "Automatic",
  102. value: ""
  103. },
  104. ],
  105. /**
  106. * @constant
  107. * @default
  108. */
  109. INPUT_FORMAT_STRING: "DD/MM/YYYY HH:mm:ss",
  110. /**
  111. * @constant
  112. * @default
  113. */
  114. OUTPUT_FORMAT_STRING: "dddd Do MMMM YYYY HH:mm:ss Z z",
  115. /**
  116. * @constant
  117. * @default
  118. */
  119. TIMEZONES: ["UTC"].concat(moment.tz.names()),
  120. /**
  121. * Translate DateTime Format operation.
  122. *
  123. * @param {string} input
  124. * @param {Object[]} args
  125. * @returns {html}
  126. */
  127. runTranslateFormat: function(input, args) {
  128. let inputFormat = args[1],
  129. inputTimezone = args[2],
  130. outputFormat = args[3],
  131. outputTimezone = args[4],
  132. date;
  133. try {
  134. date = moment.tz(input, inputFormat, inputTimezone);
  135. if (!date || date.format() === "Invalid date") throw Error;
  136. } catch (err) {
  137. return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
  138. }
  139. return date.tz(outputTimezone).format(outputFormat);
  140. },
  141. /**
  142. * Parse DateTime operation.
  143. *
  144. * @param {string} input
  145. * @param {Object[]} args
  146. * @returns {html}
  147. */
  148. runParse: function(input, args) {
  149. let inputFormat = args[1],
  150. inputTimezone = args[2],
  151. date,
  152. output = "";
  153. try {
  154. date = moment.tz(input, inputFormat, inputTimezone);
  155. if (!date || date.format() === "Invalid date") throw Error;
  156. } catch (err) {
  157. return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
  158. }
  159. output += "Date: " + date.format("dddd Do MMMM YYYY") +
  160. "\nTime: " + date.format("HH:mm:ss") +
  161. "\nPeriod: " + date.format("A") +
  162. "\nTimezone: " + date.format("z") +
  163. "\nUTC offset: " + date.format("ZZ") +
  164. "\n\nDaylight Saving Time: " + date.isDST() +
  165. "\nLeap year: " + date.isLeapYear() +
  166. "\nDays in this month: " + date.daysInMonth() +
  167. "\n\nDay of year: " + date.dayOfYear() +
  168. "\nWeek number: " + date.weekYear() +
  169. "\nQuarter: " + date.quarter();
  170. return output;
  171. },
  172. /**
  173. * @constant
  174. */
  175. FORMAT_EXAMPLES: "Format string tokens:\n\n\
  176. <table class='table table-striped table-hover table-condensed table-bordered' style='font-family: sans-serif'>\
  177. <thead>\
  178. <tr>\
  179. <th>Category</th>\
  180. <th>Token</th>\
  181. <th>Output</th>\
  182. </tr>\
  183. </thead>\
  184. <tbody>\
  185. <tr>\
  186. <td><b>Month</b></td>\
  187. <td>M</td>\
  188. <td>1 2 ... 11 12</td>\
  189. </tr>\
  190. <tr>\
  191. <td></td>\
  192. <td>Mo</td>\
  193. <td>1st 2nd ... 11th 12th</td>\
  194. </tr>\
  195. <tr>\
  196. <td></td>\
  197. <td>MM</td>\
  198. <td>01 02 ... 11 12</td>\
  199. </tr>\
  200. <tr>\
  201. <td></td>\
  202. <td>MMM</td>\
  203. <td>Jan Feb ... Nov Dec</td>\
  204. </tr>\
  205. <tr>\
  206. <td></td>\
  207. <td>MMMM</td>\
  208. <td>January February ... November December</td>\
  209. </tr>\
  210. <tr>\
  211. <td><b>Quarter</b></td>\
  212. <td>Q</td>\
  213. <td>1 2 3 4</td>\
  214. </tr>\
  215. <tr>\
  216. <td><b>Day of Month</b></td>\
  217. <td>D</td>\
  218. <td>1 2 ... 30 31</td>\
  219. </tr>\
  220. <tr>\
  221. <td></td>\
  222. <td>Do</td>\
  223. <td>1st 2nd ... 30th 31st</td>\
  224. </tr>\
  225. <tr>\
  226. <td></td>\
  227. <td>DD</td>\
  228. <td>01 02 ... 30 31</td>\
  229. </tr>\
  230. <tr>\
  231. <td><b>Day of Year</b></td>\
  232. <td>DDD</td>\
  233. <td>1 2 ... 364 365</td>\
  234. </tr>\
  235. <tr>\
  236. <td></td>\
  237. <td>DDDo</td>\
  238. <td>1st 2nd ... 364th 365th</td>\
  239. </tr>\
  240. <tr>\
  241. <td></td>\
  242. <td>DDDD</td>\
  243. <td>001 002 ... 364 365</td>\
  244. </tr>\
  245. <tr>\
  246. <td><b>Day of Week</b></td>\
  247. <td>d</td>\
  248. <td>0 1 ... 5 6</td>\
  249. </tr>\
  250. <tr>\
  251. <td></td>\
  252. <td>do</td>\
  253. <td>0th 1st ... 5th 6th</td>\
  254. </tr>\
  255. <tr>\
  256. <td></td>\
  257. <td>dd</td>\
  258. <td>Su Mo ... Fr Sa</td>\
  259. </tr>\
  260. <tr>\
  261. <td></td>\
  262. <td>ddd</td>\
  263. <td>Sun Mon ... Fri Sat</td>\
  264. </tr>\
  265. <tr>\
  266. <td></td>\
  267. <td>dddd</td>\
  268. <td>Sunday Monday ... Friday Saturday</td>\
  269. </tr>\
  270. <tr>\
  271. <td><b>Day of Week (Locale)</b></td>\
  272. <td>e</td>\
  273. <td>0 1 ... 5 6</td>\
  274. </tr>\
  275. <tr>\
  276. <td><b>Day of Week (ISO)</b></td>\
  277. <td>E</td>\
  278. <td>1 2 ... 6 7</td>\
  279. </tr>\
  280. <tr>\
  281. <td><b>Week of Year</b></td>\
  282. <td>w</td>\
  283. <td>1 2 ... 52 53</td>\
  284. </tr>\
  285. <tr>\
  286. <td></td>\
  287. <td>wo</td>\
  288. <td>1st 2nd ... 52nd 53rd</td>\
  289. </tr>\
  290. <tr>\
  291. <td></td>\
  292. <td>ww</td>\
  293. <td>01 02 ... 52 53</td>\
  294. </tr>\
  295. <tr>\
  296. <td><b>Week of Year (ISO)</b></td>\
  297. <td>W</td>\
  298. <td>1 2 ... 52 53</td>\
  299. </tr>\
  300. <tr>\
  301. <td></td>\
  302. <td>Wo</td>\
  303. <td>1st 2nd ... 52nd 53rd</td>\
  304. </tr>\
  305. <tr>\
  306. <td></td>\
  307. <td>WW</td>\
  308. <td>01 02 ... 52 53</td>\
  309. </tr>\
  310. <tr>\
  311. <td><b>Year</b></td>\
  312. <td>YY</td>\
  313. <td>70 71 ... 29 30</td>\
  314. </tr>\
  315. <tr>\
  316. <td></td>\
  317. <td>YYYY</td>\
  318. <td>1970 1971 ... 2029 2030</td>\
  319. </tr>\
  320. <tr>\
  321. <td><b>Week Year</b></td>\
  322. <td>gg</td>\
  323. <td>70 71 ... 29 30</td>\
  324. </tr>\
  325. <tr>\
  326. <td></td>\
  327. <td>gggg</td>\
  328. <td>1970 1971 ... 2029 2030</td>\
  329. </tr>\
  330. <tr>\
  331. <td><b>Week Year (ISO)</b></td>\
  332. <td>GG</td>\
  333. <td>70 71 ... 29 30</td>\
  334. </tr>\
  335. <tr>\
  336. <td></td>\
  337. <td>GGGG</td>\
  338. <td>1970 1971 ... 2029 2030</td>\
  339. </tr>\
  340. <tr>\
  341. <td><b>AM/PM</b></td>\
  342. <td>A</td>\
  343. <td>AM PM</td>\
  344. </tr>\
  345. <tr>\
  346. <td></td>\
  347. <td>a</td>\
  348. <td>am pm</td>\
  349. </tr>\
  350. <tr>\
  351. <td><b>Hour</b></td>\
  352. <td>H</td>\
  353. <td>0 1 ... 22 23</td>\
  354. </tr>\
  355. <tr>\
  356. <td></td>\
  357. <td>HH</td>\
  358. <td>00 01 ... 22 23</td>\
  359. </tr>\
  360. <tr>\
  361. <td></td>\
  362. <td>h</td>\
  363. <td>1 2 ... 11 12</td>\
  364. </tr>\
  365. <tr>\
  366. <td></td>\
  367. <td>hh</td>\
  368. <td>01 02 ... 11 12</td>\
  369. </tr>\
  370. <tr>\
  371. <td><b>Minute</b></td>\
  372. <td>m</td>\
  373. <td>0 1 ... 58 59</td>\
  374. </tr>\
  375. <tr>\
  376. <td></td>\
  377. <td>mm</td>\
  378. <td>00 01 ... 58 59</td>\
  379. </tr>\
  380. <tr>\
  381. <td><b>Second</b></td>\
  382. <td>s</td>\
  383. <td>0 1 ... 58 59</td>\
  384. </tr>\
  385. <tr>\
  386. <td></td>\
  387. <td>ss</td>\
  388. <td>00 01 ... 58 59</td>\
  389. </tr>\
  390. <tr>\
  391. <td><b>Fractional Second</b></td>\
  392. <td>S</td>\
  393. <td>0 1 ... 8 9</td>\
  394. </tr>\
  395. <tr>\
  396. <td></td>\
  397. <td>SS</td>\
  398. <td>00 01 ... 98 99</td>\
  399. </tr>\
  400. <tr>\
  401. <td></td>\
  402. <td>SSS</td>\
  403. <td>000 001 ... 998 999</td>\
  404. </tr>\
  405. <tr>\
  406. <td></td>\
  407. <td>SSSS ... SSSSSSSSS</td>\
  408. <td>000[0..] 001[0..] ... 998[0..] 999[0..]</td>\
  409. </tr>\
  410. <tr>\
  411. <td><b>Timezone</b></td>\
  412. <td>z or zz</td>\
  413. <td>EST CST ... MST PST</td>\
  414. </tr>\
  415. <tr>\
  416. <td></td>\
  417. <td>Z</td>\
  418. <td>-07:00 -06:00 ... +06:00 +07:00</td>\
  419. </tr>\
  420. <tr>\
  421. <td></td>\
  422. <td>ZZ</td>\
  423. <td>-0700 -0600 ... +0600 +0700</td>\
  424. </tr>\
  425. <tr>\
  426. <td><b>Unix Timestamp</b></td>\
  427. <td>X</td>\
  428. <td>1360013296</td>\
  429. </tr>\
  430. <tr>\
  431. <td><b>Unix Millisecond Timestamp</b></td>\
  432. <td>x</td>\
  433. <td>1360013296123</td>\
  434. </tr>\
  435. </tbody>\
  436. </table>",
  437. };
  438. export default DateTime;