/** * Date and time operations. * * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2016 * @license Apache-2.0 * * @namespace */ const DateTime = { /** * @constant * @default */ UNITS: ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"], /** * From UNIX Timestamp operation. * * @param {number} input * @param {Object[]} args * @returns {string} */ runFromUnixTimestamp: function(input, args) { let units = args[0], d; input = parseFloat(input); if (units === "Seconds (s)") { d = moment.unix(input); return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss") + " UTC"; } else if (units === "Milliseconds (ms)") { d = moment(input); return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC"; } else if (units === "Microseconds (μs)") { d = moment(input / 1000); return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC"; } else if (units === "Nanoseconds (ns)") { d = moment(input / 1000000); return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC"; } else { throw "Unrecognised unit"; } }, /** * @constant * @default */ TREAT_AS_UTC: true, /** * To UNIX Timestamp operation. * * @param {string} input * @param {Object[]} args * @returns {number} */ runToUnixTimestamp: function(input, args) { let units = args[0], treatAsUTC = args[1], d = treatAsUTC ? moment.utc(input) : moment(input); if (units === "Seconds (s)") { return d.unix(); } else if (units === "Milliseconds (ms)") { return d.valueOf(); } else if (units === "Microseconds (μs)") { return d.valueOf() * 1000; } else if (units === "Nanoseconds (ns)") { return d.valueOf() * 1000000; } else { throw "Unrecognised unit"; } }, /** * @constant * @default */ DATETIME_FORMATS: [ { name: "Standard date and time", value: "DD/MM/YYYY HH:mm:ss" }, { name: "American-style date and time", value: "MM/DD/YYYY HH:mm:ss" }, { name: "International date and time", value: "YYYY-MM-DD HH:mm:ss" }, { name: "Verbose date and time", value: "dddd Do MMMM YYYY HH:mm:ss Z z" }, { name: "UNIX timestamp (seconds)", value: "X" }, { name: "UNIX timestamp offset (milliseconds)", value: "x" }, { name: "Automatic", value: "" }, ], /** * @constant * @default */ INPUT_FORMAT_STRING: "DD/MM/YYYY HH:mm:ss", /** * @constant * @default */ OUTPUT_FORMAT_STRING: "dddd Do MMMM YYYY HH:mm:ss Z z", /** * @constant * @default */ TIMEZONES: ["UTC"].concat(moment.tz.names()), /** * Translate DateTime Format operation. * * @param {string} input * @param {Object[]} args * @returns {html} */ runTranslateFormat: function(input, args) { let inputFormat = args[1], inputTimezone = args[2], outputFormat = args[3], outputTimezone = args[4], date; try { date = moment.tz(input, inputFormat, inputTimezone); if (!date || date.format() === "Invalid date") throw Error; } catch (err) { return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; } return date.tz(outputTimezone).format(outputFormat); }, /** * Parse DateTime operation. * * @param {string} input * @param {Object[]} args * @returns {html} */ runParse: function(input, args) { let inputFormat = args[1], inputTimezone = args[2], date, output = ""; try { date = moment.tz(input, inputFormat, inputTimezone); if (!date || date.format() === "Invalid date") throw Error; } catch (err) { return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; } output += "Date: " + date.format("dddd Do MMMM YYYY") + "\nTime: " + date.format("HH:mm:ss") + "\nPeriod: " + date.format("A") + "\nTimezone: " + date.format("z") + "\nUTC offset: " + date.format("ZZ") + "\n\nDaylight Saving Time: " + date.isDST() + "\nLeap year: " + date.isLeapYear() + "\nDays in this month: " + date.daysInMonth() + "\n\nDay of year: " + date.dayOfYear() + "\nWeek number: " + date.weekYear() + "\nQuarter: " + date.quarter(); return output; }, /** * @constant */ FORMAT_EXAMPLES: `Format string tokens:
Category | Token | Output |
---|---|---|
Month | M | 1 2 ... 11 12 |
Mo | 1st 2nd ... 11th 12th | |
MM | 01 02 ... 11 12 | |
MMM | Jan Feb ... Nov Dec | |
MMMM | January February ... November December | |
Quarter | Q | 1 2 3 4 |
Day of Month | D | 1 2 ... 30 31 |
Do | 1st 2nd ... 30th 31st | |
DD | 01 02 ... 30 31 | |
Day of Year | DDD | 1 2 ... 364 365 |
DDDo | 1st 2nd ... 364th 365th | |
DDDD | 001 002 ... 364 365 | |
Day of Week | d | 0 1 ... 5 6 |
do | 0th 1st ... 5th 6th | |
dd | Su Mo ... Fr Sa | |
ddd | Sun Mon ... Fri Sat | |
dddd | Sunday Monday ... Friday Saturday | |
Day of Week (Locale) | e | 0 1 ... 5 6 |
Day of Week (ISO) | E | 1 2 ... 6 7 |
Week of Year | w | 1 2 ... 52 53 |
wo | 1st 2nd ... 52nd 53rd | |
ww | 01 02 ... 52 53 | |
Week of Year (ISO) | W | 1 2 ... 52 53 |
Wo | 1st 2nd ... 52nd 53rd | |
WW | 01 02 ... 52 53 | |
Year | YY | 70 71 ... 29 30 |
YYYY | 1970 1971 ... 2029 2030 | |
Week Year | gg | 70 71 ... 29 30 |
gggg | 1970 1971 ... 2029 2030 | |
Week Year (ISO) | GG | 70 71 ... 29 30 |
GGGG | 1970 1971 ... 2029 2030 | |
AM/PM | A | AM PM |
a | am pm | |
Hour | H | 0 1 ... 22 23 |
HH | 00 01 ... 22 23 | |
h | 1 2 ... 11 12 | |
hh | 01 02 ... 11 12 | |
Minute | m | 0 1 ... 58 59 |
mm | 00 01 ... 58 59 | |
Second | s | 0 1 ... 58 59 |
ss | 00 01 ... 58 59 | |
Fractional Second | S | 0 1 ... 8 9 |
SS | 00 01 ... 98 99 | |
SSS | 000 001 ... 998 999 | |
SSSS ... SSSSSSSSS | 000[0..] 001[0..] ... 998[0..] 999[0..] | |
Timezone | z or zz | EST CST ... MST PST |
Z | -07:00 -06:00 ... +06:00 +07:00 | |
ZZ | -0700 -0600 ... +0600 +0700 | |
Unix Timestamp | X | 1360013296 |
Unix Millisecond Timestamp | x | 1360013296123 |