DateTime.js 10 KB

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