CyberChef/src/js/operations/DateTime.js

457 lines
9.5 KiB
JavaScript
Raw Normal View History

2016-11-29 02:08:20 +00:00
2016-11-28 10:42:58 +00:00
/**
* Date and time operations.
*
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*
* @namespace
*/
2016-11-29 00:22:34 +00:00
const DateTime = {
2016-11-28 10:42:58 +00:00
/**
* @constant
* @default
*/
2016-11-29 00:22:34 +00:00
UNITS: ['Seconds (s)', 'Milliseconds (ms)', 'Microseconds (μs)', 'Nanoseconds (ns)'],
2016-11-28 10:42:58 +00:00
/**
* From UNIX Timestamp operation.
*
* @param {number} input
* @param {Object[]} args
* @returns {string}
*/
2016-11-29 00:22:34 +00:00
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';
}
},
2016-11-28 10:42:58 +00:00
/**
* To UNIX Timestamp operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {number}
*/
2016-11-29 00:22:34 +00:00
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';
}
},
2016-11-28 10:42:58 +00:00
/**
* @constant
* @default
*/
2016-11-29 00:22:34 +00:00
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: '',
},
],
2016-11-28 10:42:58 +00:00
/**
* @constant
* @default
*/
2016-11-29 00:22:34 +00:00
INPUT_FORMAT_STRING: 'DD/MM/YYYY HH:mm:ss',
2016-11-28 10:42:58 +00:00
/**
* @constant
* @default
*/
2016-11-29 00:22:34 +00:00
OUTPUT_FORMAT_STRING: 'dddd Do MMMM YYYY HH:mm:ss Z z',
2016-11-28 10:42:58 +00:00
/**
* @constant
* @default
*/
2016-11-29 00:22:34 +00:00
TIMEZONES: ['UTC'].concat(moment.tz.names()),
2016-11-28 10:42:58 +00:00
/**
* Translate DateTime Format operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {html}
*/
2016-11-29 00:22:34 +00:00
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);
},
2016-11-28 10:42:58 +00:00
/**
* Parse DateTime operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {html}
*/
2016-11-29 00:22:34 +00:00
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;
},
2016-11-28 10:42:58 +00:00
/**
* @constant
*/
2016-11-29 00:22:34 +00:00
FORMAT_EXAMPLES: "Format string tokens:\n\n\
2016-11-28 10:42:58 +00:00
<table class='table table-striped table-hover table-condensed table-bordered' style='font-family: sans-serif'>\
<thead>\
<tr>\
<th>Category</th>\
<th>Token</th>\
<th>Output</th>\
</tr>\
</thead>\
<tbody>\
<tr>\
<td><b>Month</b></td>\
<td>M</td>\
<td>1 2 ... 11 12</td>\
</tr>\
<tr>\
<td></td>\
<td>Mo</td>\
<td>1st 2nd ... 11th 12th</td>\
</tr>\
<tr>\
<td></td>\
<td>MM</td>\
<td>01 02 ... 11 12</td>\
</tr>\
<tr>\
<td></td>\
<td>MMM</td>\
<td>Jan Feb ... Nov Dec</td>\
</tr>\
<tr>\
<td></td>\
<td>MMMM</td>\
<td>January February ... November December</td>\
</tr>\
<tr>\
<td><b>Quarter</b></td>\
<td>Q</td>\
<td>1 2 3 4</td>\
</tr>\
<tr>\
<td><b>Day of Month</b></td>\
<td>D</td>\
<td>1 2 ... 30 31</td>\
</tr>\
<tr>\
<td></td>\
<td>Do</td>\
<td>1st 2nd ... 30th 31st</td>\
</tr>\
<tr>\
<td></td>\
<td>DD</td>\
<td>01 02 ... 30 31</td>\
</tr>\
<tr>\
<td><b>Day of Year</b></td>\
<td>DDD</td>\
<td>1 2 ... 364 365</td>\
</tr>\
<tr>\
<td></td>\
<td>DDDo</td>\
<td>1st 2nd ... 364th 365th</td>\
</tr>\
<tr>\
<td></td>\
<td>DDDD</td>\
<td>001 002 ... 364 365</td>\
</tr>\
<tr>\
<td><b>Day of Week</b></td>\
<td>d</td>\
<td>0 1 ... 5 6</td>\
</tr>\
<tr>\
<td></td>\
<td>do</td>\
<td>0th 1st ... 5th 6th</td>\
</tr>\
<tr>\
<td></td>\
<td>dd</td>\
<td>Su Mo ... Fr Sa</td>\
</tr>\
<tr>\
<td></td>\
<td>ddd</td>\
<td>Sun Mon ... Fri Sat</td>\
</tr>\
<tr>\
<td></td>\
<td>dddd</td>\
<td>Sunday Monday ... Friday Saturday</td>\
</tr>\
<tr>\
<td><b>Day of Week (Locale)</b></td>\
<td>e</td>\
<td>0 1 ... 5 6</td>\
</tr>\
<tr>\
<td><b>Day of Week (ISO)</b></td>\
<td>E</td>\
<td>1 2 ... 6 7</td>\
</tr>\
<tr>\
<td><b>Week of Year</b></td>\
<td>w</td>\
<td>1 2 ... 52 53</td>\
</tr>\
<tr>\
<td></td>\
<td>wo</td>\
<td>1st 2nd ... 52nd 53rd</td>\
</tr>\
<tr>\
<td></td>\
<td>ww</td>\
<td>01 02 ... 52 53</td>\
</tr>\
<tr>\
<td><b>Week of Year (ISO)</b></td>\
<td>W</td>\
<td>1 2 ... 52 53</td>\
</tr>\
<tr>\
<td></td>\
<td>Wo</td>\
<td>1st 2nd ... 52nd 53rd</td>\
</tr>\
<tr>\
<td></td>\
<td>WW</td>\
<td>01 02 ... 52 53</td>\
</tr>\
<tr>\
<td><b>Year</b></td>\
<td>YY</td>\
<td>70 71 ... 29 30</td>\
</tr>\
<tr>\
<td></td>\
<td>YYYY</td>\
<td>1970 1971 ... 2029 2030</td>\
</tr>\
<tr>\
<td><b>Week Year</b></td>\
<td>gg</td>\
<td>70 71 ... 29 30</td>\
</tr>\
<tr>\
<td></td>\
<td>gggg</td>\
<td>1970 1971 ... 2029 2030</td>\
</tr>\
<tr>\
<td><b>Week Year (ISO)</b></td>\
<td>GG</td>\
<td>70 71 ... 29 30</td>\
</tr>\
<tr>\
<td></td>\
<td>GGGG</td>\
<td>1970 1971 ... 2029 2030</td>\
</tr>\
<tr>\
<td><b>AM/PM</b></td>\
<td>A</td>\
<td>AM PM</td>\
</tr>\
<tr>\
<td></td>\
<td>a</td>\
<td>am pm</td>\
</tr>\
<tr>\
<td><b>Hour</b></td>\
<td>H</td>\
<td>0 1 ... 22 23</td>\
</tr>\
<tr>\
<td></td>\
<td>HH</td>\
<td>00 01 ... 22 23</td>\
</tr>\
<tr>\
<td></td>\
<td>h</td>\
<td>1 2 ... 11 12</td>\
</tr>\
<tr>\
<td></td>\
<td>hh</td>\
<td>01 02 ... 11 12</td>\
</tr>\
<tr>\
<td><b>Minute</b></td>\
<td>m</td>\
<td>0 1 ... 58 59</td>\
</tr>\
<tr>\
<td></td>\
<td>mm</td>\
<td>00 01 ... 58 59</td>\
</tr>\
<tr>\
<td><b>Second</b></td>\
<td>s</td>\
<td>0 1 ... 58 59</td>\
</tr>\
<tr>\
<td></td>\
<td>ss</td>\
<td>00 01 ... 58 59</td>\
</tr>\
<tr>\
<td><b>Fractional Second</b></td>\
<td>S</td>\
<td>0 1 ... 8 9</td>\
</tr>\
<tr>\
<td></td>\
<td>SS</td>\
<td>00 01 ... 98 99</td>\
</tr>\
<tr>\
<td></td>\
<td>SSS</td>\
<td>000 001 ... 998 999</td>\
</tr>\
<tr>\
<td></td>\
<td>SSSS ... SSSSSSSSS</td>\
<td>000[0..] 001[0..] ... 998[0..] 999[0..]</td>\
</tr>\
<tr>\
<td><b>Timezone</b></td>\
<td>z or zz</td>\
<td>EST CST ... MST PST</td>\
</tr>\
<tr>\
<td></td>\
<td>Z</td>\
<td>-07:00 -06:00 ... +06:00 +07:00</td>\
</tr>\
<tr>\
<td></td>\
<td>ZZ</td>\
<td>-0700 -0600 ... +0600 +0700</td>\
</tr>\
<tr>\
<td><b>Unix Timestamp</b></td>\
<td>X</td>\
<td>1360013296</td>\
</tr>\
<tr>\
<td><b>Unix Millisecond Timestamp</b></td>\
<td>x</td>\
<td>1360013296123</td>\
</tr>\
</tbody>\
</table>",
2016-11-29 00:22:34 +00:00
2016-11-28 10:42:58 +00:00
};
export default DateTime;