/** * 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} */ run_from_unix_timestamp(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'; } }, /** * To UNIX Timestamp operation. * * @param {string} input * @param {Object[]} args * @returns {number} */ run_to_unix_timestamp(input, args) { let 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(input, args) { let 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(input, args) { let 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 | \