/* 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} */ runFromUnixTimestamp: 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} */ runToUnixTimestamp: 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} */ runTranslateFormat: function(input, args) { var 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) { var 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:\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
CategoryTokenOutput
MonthM1 2 ... 11 12
Mo1st 2nd ... 11th 12th
MM01 02 ... 11 12
MMMJan Feb ... Nov Dec
MMMMJanuary February ... November December
QuarterQ1 2 3 4
Day of MonthD1 2 ... 30 31
Do1st 2nd ... 30th 31st
DD01 02 ... 30 31
Day of YearDDD1 2 ... 364 365
DDDo1st 2nd ... 364th 365th
DDDD001 002 ... 364 365
Day of Weekd0 1 ... 5 6
do0th 1st ... 5th 6th
ddSu Mo ... Fr Sa
dddSun Mon ... Fri Sat
ddddSunday Monday ... Friday Saturday
Day of Week (Locale)e0 1 ... 5 6
Day of Week (ISO)E1 2 ... 6 7
Week of Yearw1 2 ... 52 53
wo1st 2nd ... 52nd 53rd
ww01 02 ... 52 53
Week of Year (ISO)W1 2 ... 52 53
Wo1st 2nd ... 52nd 53rd
WW01 02 ... 52 53
YearYY70 71 ... 29 30
YYYY1970 1971 ... 2029 2030
Week Yeargg70 71 ... 29 30
gggg1970 1971 ... 2029 2030
Week Year (ISO)GG70 71 ... 29 30
GGGG1970 1971 ... 2029 2030
AM/PMAAM PM
aam pm
HourH0 1 ... 22 23
HH00 01 ... 22 23
h1 2 ... 11 12
hh01 02 ... 11 12
Minutem0 1 ... 58 59
mm00 01 ... 58 59
Seconds0 1 ... 58 59
ss00 01 ... 58 59
Fractional SecondS0 1 ... 8 9
SS00 01 ... 98 99
SSS000 001 ... 998 999
SSSS ... SSSSSSSSS000[0..] 001[0..] ... 998[0..] 999[0..]
Timezonez or zzEST CST ... MST PST
Z-07:00 -06:00 ... +06:00 +07:00
ZZ-0700 -0600 ... +0600 +0700
Unix TimestampX1360013296
Unix Millisecond Timestampx1360013296123
", };