@onereach/time-interpreter
Version:
Convert dates, durations and time to canonical format (dates -> ISO 8601, durations -> milliseconds).
463 lines (418 loc) • 12.6 kB
JavaScript
const jsonfile = require("jsonfile/index.js");
const _ = require("lodash");
const assert = require("assert").strict;
const Interpreter = require("../index.js");
const converter = new Interpreter();
const dates = jsonfile.readFileSync("test/parse/dates/dates.json");
const dates_ordinalDay = jsonfile.readFileSync(
"test/parse/dates/ordinal-day.json"
);
const dates_strDay = jsonfile.readFileSync("test/parse/dates/str-day.json");
const dates_strMonth = jsonfile.readFileSync("test/parse/dates/str-month.json");
const datetimes = jsonfile.readFileSync("test/parse/datetimes/datetimes.json");
const datetimes_ordinalDay = jsonfile.readFileSync(
"test/parse/datetimes/ordinal-day.json"
);
const datetimes_strDay = jsonfile.readFileSync(
"test/parse/datetimes/str-day.json"
);
const datetimes_strMonth = jsonfile.readFileSync(
"test/parse/datetimes/str-month.json"
);
const datetimes_dd_mm_yyyy = jsonfile.readFileSync(
"test/parse/datetimes/dd-mm-yyyy-time.json"
);
const objects = jsonfile.readFileSync("test/parse/objects.json");
const numbers = jsonfile.readFileSync("test/parse/numbers.json");
const stringNumbers = jsonfile.readFileSync("test/parse/string-numbers.json");
const invalid = jsonfile.readFileSync("test/parse/invalid.json");
const testParseMethod = (assert, describe, input, expected) => {
describe("test-1 #parse(date)", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].datetime;
const actualResult = converter.parse(date, "", "", "2021");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(actualResult, expectedResult);
});
});
});
describe("test-2 #parse(date, 'America/Denver')", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].inZone;
const actualResult = converter.parse(date, "America/Denver", "", "2021");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(
actualResult,
expectedResult
);
});
});
});
describe("test-3 #parse(date, '+01:00')", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].inOffset;
const actualResult = converter.parse(date, "+01:00", "", "2021");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(actualResult, expectedResult);
});
});
});
describe("test-4 #parse(date, '+01:00', 'GMT+0')", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].outZone;
const actualResult = converter.parse(date, "+01:00", "GMT+0", "2021");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(
actualResult,
expectedResult
);
});
});
});
describe("test-5 #parse(date, 'America/Denver', '-01:00')", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].outOffset;
const actualResult = converter.parse(date, "America/Denver", "-01:00", "2021");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(
actualResult,
expectedResult
);
});
});
});
describe("test-6 #parse(date, '', '', '2005')", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].year;
const actualResult = converter.parse(date, "", "", "2005");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(actualResult, expectedResult);
});
});
});
describe("test-7 #parse(date, '+01:00', 'GMT+0', '2021', '2008-12-15')", function () {
input.forEach((date, i) => {
if (typeof date === "number") key = "input-" + date;
else if (typeof date === "object") key = JSON.stringify(date);
else key = date;
const expectedResult = expected[key].date;
const actualResult = converter.parse(date, "+01:00", "GMT+0", "2021", "2008-12-15");
if (actualResult) delete actualResult.isoWithFractSec;
it(key, function () {
assert.deepEqual(
actualResult,
expectedResult
);
});
});
});
};
// TYPE OF DATE WITHOUT TIME
const ddmmyyyy = [
"6-10-2020, Indian/Kerguelen",
"1995-02-04",
"2020-18-04",
"04-18-2020",
"1995 2 04",
"2020/18/4",
"4-18-2020",
"6-1-2020",
"16.10.2020",
];
describe("input dates in format 'dd-mm-yyyy'", function () {
testParseMethod(assert, describe, ddmmyyyy, dates);
});
const ddmmyy = [
"20-18-4 Indian/Kerguelen",
"95-02-04",
"20.18.04",
"04-18-20",
"06.10.20",
"4 18 20",
"6-10-20",
"20/18/04",
"10/06/20",
];
describe("input dates in format 'dd-mm-yy'", function () {
testParseMethod(assert, describe, ddmmyy, dates);
});
describe("input dates in format '1st April 2020', '1999 sep 3rd' etc.", function () {
testParseMethod(
assert,
describe,
Object.keys(dates_ordinalDay),
dates_ordinalDay
);
});
describe("input dates in format 'mm-yyyy', 'yyyy/mm' etc.", function () {
testParseMethod(assert, describe, ["12/1999", "10.2020"], dates);
});
describe("input dates in format 'first April 2020', '1999 sep twenty' etc.", function () {
testParseMethod(assert, describe, Object.keys(dates_strDay), dates_strDay);
});
describe("input dates in format '6 April 2020', '1999 sep 20' etc.", function () {
testParseMethod(
assert,
describe,
Object.keys(dates_strMonth),
dates_strMonth
);
});
// TYPE OF DATE/TIME
describe("input dates in format 'dd-mm-yyyy'", function () {
testParseMethod(
assert,
describe,
Object.keys(datetimes_dd_mm_yyyy),
datetimes_dd_mm_yyyy
);
});
describe("input dates in format 'dd-mm-yy' + time, '20150930 212421 -0400', '1995-02-04T10:00+01:00' etc.", function () {
testParseMethod(assert, describe, Object.keys(datetimes), datetimes);
});
describe("input dates in format '1st April 2020', '1999 sep 3rd' etc. + time", function () {
testParseMethod(
assert,
describe,
Object.keys(datetimes_ordinalDay),
datetimes_ordinalDay
);
});
describe("input dates in format 'first April 2020', '1999 sep twenty' etc. + time", function () {
testParseMethod(
assert,
describe,
Object.keys(datetimes_strDay),
datetimes_strDay
);
});
describe("input dates in format '6 April 2020', '1999 sep 20' etc. + time", function () {
testParseMethod(
assert,
describe,
Object.keys(datetimes_strMonth),
datetimes_strMonth
);
});
// TYPE OF NUMBER
describe("input number timestamp", function () {
testParseMethod(
assert,
describe,
[
1234567,
123456,
34567890,
169753368995,
11234566744,
1560211200000,
1318874398,
283142,
583042,
],
numbers
);
});
// TYPE OF STRING NUMBER
describe("input string number timestamp", function () {
testParseMethod(assert, describe, Object.keys(stringNumbers), stringNumbers);
});
// TYPE OF OBJECT
describe("input date/datetime object", function () {
const obj = Object.keys(objects).map((k) => JSON.parse(k.replace(/\//g, "")));
testParseMethod(assert, describe, obj, objects);
});
// INVALID
describe("invalid input", function () {
testParseMethod(assert, describe, Object.keys(invalid), invalid);
});
// v1.0.14
it(`"2021-06-10T10:24:19Z+03:00", "GMT+0", "GMT+0"`, function () {
assert.deepEqual(
converter.parse("2021-06-10T10:24:19Z+03:00", "GMT+0", "GMT+0"),
{
time: {
hourMinute12: '07:24',
hourMinute24: '07:24',
hour12: 7,
hour24: 7,
amPm: 'am',
minute: 24
},
duration: 1623309859000,
iso: '2021-06-10T07:24:19+00:00',
isoWithFractSec: '2021-06-10T07:24:19.000+00:00',
date: {
dayOfWeek: 'Thursday',
isWeekend: false,
day: 10,
month: 6,
monthName: 'June',
year: 2021
},
timezone: { name: 'GMT+0', offsetNum: 0, offsetText: '+00:00' }
}
);
});
it(`"2021-06-10T10:24:19Z+03:00"`, function () {
assert.deepEqual(
converter.parse("2021-06-10T10:24:19Z+03:00"),
{
time: {
hourMinute12: '10:24',
hourMinute24: '10:24',
hour12: 10,
hour24: 10,
amPm: 'am',
minute: 24
},
duration: 1623309859000,
iso: '2021-06-10T10:24:19+03:00',
isoWithFractSec: '2021-06-10T10:24:19.000+03:00',
date: {
dayOfWeek: 'Thursday',
isWeekend: false,
day: 10,
month: 6,
monthName: 'June',
year: 2021
},
timezone: { name: '', offsetNum: 3, offsetText: '+03:00' }
}
);
});
// v1.0.16
it(`"6 April, 3456", "GMT+0", "GMT+0"`, function () {
assert.deepEqual(
converter.parse("6 April, 3456", "GMT+0", "GMT+0"),
{
time: {
hourMinute12: '12:00',
hourMinute24: '00:00',
hour12: 12,
hour24: 0,
amPm: 'am',
minute: 0
},
duration: 46901894400000,
iso: '3456-04-06T00:00:00+00:00',
isoWithFractSec: '3456-04-06T00:00:00.000+00:00',
date: {
dayOfWeek: 'Sunday',
isWeekend: true,
day: 6,
month: 4,
monthName: 'April',
year: 3456
},
timezone: { name: 'GMT+0', offsetNum: 0, offsetText: '+00:00' }
}
);
});
it(`"5432-06-10T10:24:19Z+03:00"`, function () {
assert.deepEqual(
converter.parse("5432-06-10T10:24:19Z+03:00"),
{
time: {
hourMinute12: '10:24',
hourMinute24: '10:24',
hour12: 10,
hour24: 10,
amPm: 'am',
minute: 24
},
duration: 109264058659000,
iso: '5432-06-10T10:24:19+03:00',
isoWithFractSec: '5432-06-10T10:24:19.000+03:00',
date: {
dayOfWeek: 'Sunday',
isWeekend: true,
day: 10,
month: 6,
monthName: 'June',
year: 5432
},
timezone: { name: '', offsetNum: 3, offsetText: '+03:00' }
}
);
});
// 1.0.17
it(`"2010-04-05T15:10:03+00:00"`, function () {
assert.deepEqual(
converter.parse("2010-04-05T15:10:03+00:00"),
{
"time": {
"hourMinute12": "03:10",
"hourMinute24": "15:10",
"hour12": 3,
"hour24": 15,
"amPm": "pm",
"minute": 10
},
"duration": 1270480203000,
"iso": "2010-04-05T15:10:03+00:00",
"isoWithFractSec": "2010-04-05T15:10:03.000+00:00",
"date": {
"dayOfWeek": "Monday",
"isWeekend": false,
"day": 5,
"month": 4,
"monthName": "April",
"year": 2010
},
"timezone": {
"name": "",
"offsetNum": 0,
"offsetText": "+00:00"
}
}
);
});
it(`"12-30-00.123Z"`, function () {
assert.deepEqual(
converter.parse("12-30-00.123Z"),
{
"time": {
"hourMinute12": "12:30",
"hourMinute24": "12:30",
"hour12": 12,
"hour24": 12,
"amPm": "pm",
"minute": 30
},
"duration": 45000000,
"iso": "12:30:00Z",
"isoWithFractSec": "12:30:00.123Z",
"date": null,
"timezone": {
"name": "",
"offsetNum": 0,
"offsetText": "+00:00"
}
}
);
});