/* globals moment */ /** * Date and time operations. * * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2016 * @license Apache-2.0 * * @namespace */ var DateTime = { /** * @constant * @default */ UNITS: ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"], /** * From UNIX Timestamp operation. * * @param {number} input * @param {Object[]} args * @returns {string} */ run_from_unix_timestamp: function(input, args) { var 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"; } }, /** * To UNIX Timestamp operation. * * @param {string} input * @param {Object[]} args * @returns {number} */ run_to_unix_timestamp: function(input, args) { var units = args[0], d = 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} */ run_translate_format: function(input, args) { var input_format = args[1], input_timezone = args[2], output_format = args[3], output_timezone = args[4], date; try { date = moment.tz(input, input_format, input_timezone); if (!date || date.format() == "Invalid date") throw Error; } catch(err) { return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; } return date.tz(output_timezone).format(output_format); }, /** * Parse DateTime operation. * * @param {string} input * @param {Object[]} args * @returns {html} */ run_parse: function(input, args) { var input_format = args[1], input_timezone = args[2], date, output = ""; try { date = moment.tz(input, input_format, input_timezone); 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:\n\n\
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 | \