chronoshift
Advanced tools
Comparing version 0.4.1 to 0.4.2
@@ -103,2 +103,10 @@ /// <reference path="../typings/immutable-class.d.ts" /> | ||
function parseISODate(date: string, timezone?: Timezone): Date; | ||
interface IntervalParse { | ||
computedStart: Date; | ||
computedEnd: Date; | ||
start?: Date; | ||
end?: Date; | ||
duration?: Duration; | ||
} | ||
function parseInterval(str: string, timezone?: Timezone, now?: Date): IntervalParse; | ||
} | ||
@@ -105,0 +113,0 @@ |
@@ -664,2 +664,65 @@ "use strict"; | ||
Chronoshift.parseISODate = parseISODate; | ||
function parseInterval(str, timezone, now) { | ||
if (timezone === void 0) { timezone = Chronoshift.Timezone.UTC; } | ||
if (now === void 0) { now = new Date(); } | ||
var parts = str.split('/'); | ||
if (parts.length > 2) | ||
throw new Error("Can not parse string " + str); | ||
var start = null; | ||
var end = null; | ||
var duration = null; | ||
var p0 = parts[0]; | ||
if (parts.length === 1) { | ||
duration = Chronoshift.Duration.fromJS(p0); | ||
} | ||
else { | ||
var p1 = parts[1]; | ||
if (p0[0] === 'P') { | ||
duration = Chronoshift.Duration.fromJS(p0); | ||
end = parseISODate(p1, timezone); | ||
if (!end) | ||
throw new Error("can not parse '" + p1 + "' as ISO date"); | ||
} | ||
else if (p1[0] === 'P') { | ||
start = parseISODate(p0, timezone); | ||
if (!start) | ||
throw new Error("can not parse '" + p0 + "' as ISO date"); | ||
duration = Chronoshift.Duration.fromJS(p1); | ||
} | ||
else { | ||
start = parseISODate(p0, timezone); | ||
if (!start) | ||
throw new Error("can not parse '" + p0 + "' as ISO date"); | ||
end = parseISODate(p1, timezone); | ||
if (!end) | ||
throw new Error("can not parse '" + p1 + "' as ISO date"); | ||
if (end < start) { | ||
throw new Error("start must be <= end in '" + str + "'"); | ||
} | ||
} | ||
} | ||
var computedStart = null; | ||
var computedEnd = null; | ||
if (start) { | ||
computedStart = start; | ||
if (duration) { | ||
computedEnd = duration.shift(computedStart, timezone, 1); | ||
} | ||
else { | ||
computedEnd = end; | ||
} | ||
} | ||
else { | ||
computedEnd = end || now; | ||
computedStart = duration.shift(computedEnd, timezone, -1); | ||
} | ||
return { | ||
computedStart: computedStart, | ||
computedEnd: computedEnd, | ||
start: start, | ||
end: end, | ||
duration: duration | ||
}; | ||
} | ||
Chronoshift.parseInterval = parseInterval; | ||
})(Chronoshift || (Chronoshift = {})); | ||
@@ -666,0 +729,0 @@ if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { |
{ | ||
"name": "chronoshift", | ||
"version": "0.4.1", | ||
"version": "0.4.2", | ||
"description": "A tiny library for shifting time with timezones", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -160,2 +160,74 @@ module Chronoshift { | ||
export interface IntervalParse { | ||
computedStart: Date; | ||
computedEnd: Date; | ||
start?: Date; | ||
end?: Date; | ||
duration?: Duration; | ||
} | ||
export function parseInterval(str: string, timezone = Timezone.UTC, now = new Date()): IntervalParse { | ||
var parts = str.split('/'); | ||
if (parts.length > 2) throw new Error(`Can not parse string ${str}`); | ||
var start: Date = null; | ||
var end: Date = null; | ||
var duration: Duration = null; | ||
var p0: string = parts[0]; | ||
if (parts.length === 1) { | ||
duration = Duration.fromJS(p0); | ||
} else { | ||
var p1 = parts[1]; | ||
if (p0[0] === 'P') { | ||
duration = Duration.fromJS(p0); | ||
end = parseISODate(p1, timezone); | ||
if (!end) throw new Error(`can not parse '${p1}' as ISO date`); | ||
} else if (p1[0] === 'P') { | ||
start = parseISODate(p0, timezone); | ||
if (!start) throw new Error(`can not parse '${p0}' as ISO date`); | ||
duration = Duration.fromJS(p1); | ||
} else { | ||
start = parseISODate(p0, timezone); | ||
if (!start) throw new Error(`can not parse '${p0}' as ISO date`); | ||
end = parseISODate(p1, timezone); | ||
if (!end) throw new Error(`can not parse '${p1}' as ISO date`); | ||
if (end < start) { | ||
throw new Error(`start must be <= end in '${str}'`); | ||
} | ||
} | ||
} | ||
/* | ||
Has to be one of: | ||
<start>/<end> | ||
<start>/<duration> | ||
<duration>/<end> | ||
<duration> | ||
*/ | ||
var computedStart: Date = null; | ||
var computedEnd: Date = null; | ||
if (start) { | ||
computedStart = start; | ||
if (duration) { | ||
computedEnd = duration.shift(computedStart, timezone, 1); | ||
} else { | ||
computedEnd = end; | ||
} | ||
} else { | ||
computedEnd = end || now; | ||
computedStart = duration.shift(computedEnd, timezone, -1); | ||
} | ||
return { | ||
computedStart, | ||
computedEnd, | ||
start, | ||
end, | ||
duration | ||
}; | ||
} | ||
} |
@@ -13,83 +13,139 @@ /// <reference path="../typings/mocha/mocha.d.ts" /> | ||
} | ||
var parseISODate = chronoshift.parseISODate; | ||
describe('parseISODate', function () { | ||
var sixHours = 6 * 60 * 60 * 1000, sixHoursThirty = sixHours + 30 * 60 * 1000; | ||
// Taken from https://github.com/csnover/js-iso8601/blob/lax/tests/test.js | ||
it('date-part', function () { | ||
deepEqual(parseISODate('1970-01-01'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'Unix epoch'); | ||
deepEqual(parseISODate('2001'), new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)), '2001'); | ||
deepEqual(parseISODate('2001-02'), new Date(Date.UTC(2001, 1, 1, 0, 0, 0, 0)), '2001-02'); | ||
deepEqual(parseISODate('2001-02-03'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03'); | ||
deepEqual(parseISODate('2001-02-03Z'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03Z'); | ||
deepEqual(parseISODate('-002001'), new Date(Date.UTC(-2001, 0, 1, 0, 0, 0, 0)), '-002001'); | ||
deepEqual(parseISODate('-002001-02'), new Date(Date.UTC(-2001, 1, 1, 0, 0, 0, 0)), '-002001-02'); | ||
deepEqual(parseISODate('-002001-02-03'), new Date(Date.UTC(-2001, 1, 3, 0, 0, 0, 0)), '-002001-02-03'); | ||
deepEqual(parseISODate('+010000-02'), new Date(Date.UTC(10000, 1, 1, 0, 0, 0, 0)), '+010000-02'); | ||
deepEqual(parseISODate('+010000-02-03'), new Date(Date.UTC(10000, 1, 3, 0, 0, 0, 0)), '+010000-02-03'); | ||
deepEqual(parseISODate('-010000-02'), new Date(Date.UTC(-10000, 1, 1, 0, 0, 0, 0)), '-010000-02'); | ||
deepEqual(parseISODate('-010000-02-03'), new Date(Date.UTC(-10000, 1, 3, 0, 0, 0, 0)), '-010000-02-03'); | ||
deepEqual(parseISODate('19700101'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch'); | ||
deepEqual(parseISODate('19700101Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch Z'); | ||
deepEqual(parseISODate('asdf'), null, 'invalid YYYY (non-digits)'); | ||
deepEqual(parseISODate('1970-as-df'), null, 'invalid YYYY-MM-DD (non-digits)'); | ||
deepEqual(parseISODate('1970-01-'), null, 'invalid YYYY-MM- (extra hyphen)'); | ||
deepEqual(parseISODate('197001'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month'); | ||
deepEqual(parseISODate('197001Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month Z'); | ||
// TODO: Test for invalid YYYYMM and invalid YYYYY? | ||
var parseISODate = chronoshift.parseISODate, parseInterval = chronoshift.parseInterval; | ||
describe('date parser', function () { | ||
describe('parseISODate', function () { | ||
var sixHours = 6 * 60 * 60 * 1000, sixHoursThirty = sixHours + 30 * 60 * 1000; | ||
// Taken from https://github.com/csnover/js-iso8601/blob/lax/tests/test.js | ||
it('date-part', function () { | ||
deepEqual(parseISODate('1970-01-01'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'Unix epoch'); | ||
deepEqual(parseISODate('2001'), new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)), '2001'); | ||
deepEqual(parseISODate('2001-02'), new Date(Date.UTC(2001, 1, 1, 0, 0, 0, 0)), '2001-02'); | ||
deepEqual(parseISODate('2001-02-03'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03'); | ||
deepEqual(parseISODate('2001-02-03Z'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03Z'); | ||
deepEqual(parseISODate('-002001'), new Date(Date.UTC(-2001, 0, 1, 0, 0, 0, 0)), '-002001'); | ||
deepEqual(parseISODate('-002001-02'), new Date(Date.UTC(-2001, 1, 1, 0, 0, 0, 0)), '-002001-02'); | ||
deepEqual(parseISODate('-002001-02-03'), new Date(Date.UTC(-2001, 1, 3, 0, 0, 0, 0)), '-002001-02-03'); | ||
deepEqual(parseISODate('+010000-02'), new Date(Date.UTC(10000, 1, 1, 0, 0, 0, 0)), '+010000-02'); | ||
deepEqual(parseISODate('+010000-02-03'), new Date(Date.UTC(10000, 1, 3, 0, 0, 0, 0)), '+010000-02-03'); | ||
deepEqual(parseISODate('-010000-02'), new Date(Date.UTC(-10000, 1, 1, 0, 0, 0, 0)), '-010000-02'); | ||
deepEqual(parseISODate('-010000-02-03'), new Date(Date.UTC(-10000, 1, 3, 0, 0, 0, 0)), '-010000-02-03'); | ||
deepEqual(parseISODate('19700101'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch'); | ||
deepEqual(parseISODate('19700101Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch Z'); | ||
deepEqual(parseISODate('asdf'), null, 'invalid YYYY (non-digits)'); | ||
deepEqual(parseISODate('1970-as-df'), null, 'invalid YYYY-MM-DD (non-digits)'); | ||
deepEqual(parseISODate('1970-01-'), null, 'invalid YYYY-MM- (extra hyphen)'); | ||
deepEqual(parseISODate('197001'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month'); | ||
deepEqual(parseISODate('197001Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month Z'); | ||
// TODO: Test for invalid YYYYMM and invalid YYYYY? | ||
}); | ||
it('date-time (tz = UTC)', function () { | ||
deepEqual(parseISODate('2001-02-03T04:05'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) + sixHoursThirty), '2001-02-03T04:05-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) + sixHoursThirty), '2001-02-03T04:05:06-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) - sixHoursThirty), '2001-02-03T04:05+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) - sixHoursThirty), '2001-02-03T04:05:06+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) - sixHoursThirty), '2001-02-03T04:05:06.007+06:30'); | ||
deepEqual(parseISODate('2001T04:05:06.007'), new Date(Date.UTC(2001, 0, 1, 4, 5, 6, 7)), '2001T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02T04:05:06.007'), new Date(Date.UTC(2001, 1, 1, 4, 5, 6, 7)), '2001-02T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.07'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 70)), '2001-02-03T04:05:06.07'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.7'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 700)), '2001-02-03T04:05:06.7'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('-010000T04:05'), new Date(Date.UTC(-10000, 0, 1, 4, 5, 0, 0)), '-010000T04:05'); | ||
deepEqual(parseISODate('-010000-02T04:05'), new Date(Date.UTC(-10000, 1, 1, 4, 5, 0, 0)), '-010000-02T04:05'); | ||
deepEqual(parseISODate('-010000-02-03T04:05'), new Date(Date.UTC(-10000, 1, 3, 4, 5, 0, 0)), '-010000-02-03T04:05'); | ||
deepEqual(parseISODate('1970-01-01 00:00:00Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'space-separated datetime'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00.987654'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 987)), 'extended sub-second precision'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00,123'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 123)), 'comma-delimited milliseconds'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00+0630'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0) - sixHoursThirty), 'colon-free timezone part'); | ||
deepEqual(parseISODate('1970-01-01T000000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part'); | ||
deepEqual(parseISODate('1970-01-01T0000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part minute hour'); | ||
deepEqual(parseISODate('1970-01-01T00'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'hour only time part'); | ||
deepEqual(parseISODate('1970-01-01T00:00.000'), null, 'invalid date-time (msec with missing seconds)'); | ||
}); | ||
it('date-time (tz = America/Los_Angeles)', function () { | ||
var tz = Timezone.fromJS('America/Los_Angeles'); | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
}); | ||
it('date-time (tz = null / local)', function () { | ||
var tz = null; | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(2001, 1, 3, 4, 5, 0, 0), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(2001, 1, 3, 4, 5, 6, 0), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(2001, 1, 3, 4, 5, 6, 7), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
}); | ||
}); | ||
it('date-time (tz = UTC)', function () { | ||
deepEqual(parseISODate('2001-02-03T04:05'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) + sixHoursThirty), '2001-02-03T04:05-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) + sixHoursThirty), '2001-02-03T04:05:06-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) - sixHoursThirty), '2001-02-03T04:05+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) - sixHoursThirty), '2001-02-03T04:05:06+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) - sixHoursThirty), '2001-02-03T04:05:06.007+06:30'); | ||
deepEqual(parseISODate('2001T04:05:06.007'), new Date(Date.UTC(2001, 0, 1, 4, 5, 6, 7)), '2001T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02T04:05:06.007'), new Date(Date.UTC(2001, 1, 1, 4, 5, 6, 7)), '2001-02T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.07'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 70)), '2001-02-03T04:05:06.07'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.7'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 700)), '2001-02-03T04:05:06.7'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('-010000T04:05'), new Date(Date.UTC(-10000, 0, 1, 4, 5, 0, 0)), '-010000T04:05'); | ||
deepEqual(parseISODate('-010000-02T04:05'), new Date(Date.UTC(-10000, 1, 1, 4, 5, 0, 0)), '-010000-02T04:05'); | ||
deepEqual(parseISODate('-010000-02-03T04:05'), new Date(Date.UTC(-10000, 1, 3, 4, 5, 0, 0)), '-010000-02-03T04:05'); | ||
deepEqual(parseISODate('1970-01-01 00:00:00Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'space-separated datetime'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00.987654'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 987)), 'extended sub-second precision'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00,123'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 123)), 'comma-delimited milliseconds'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00+0630'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0) - sixHoursThirty), 'colon-free timezone part'); | ||
deepEqual(parseISODate('1970-01-01T000000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part'); | ||
deepEqual(parseISODate('1970-01-01T0000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part minute hour'); | ||
deepEqual(parseISODate('1970-01-01T00'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'hour only time part'); | ||
deepEqual(parseISODate('1970-01-01T00:00.000'), null, 'invalid date-time (msec with missing seconds)'); | ||
describe('parseInterval', function () { | ||
it('errors on bad start', function () { | ||
chai_1.expect(function () { | ||
parseInterval('2001-02-03T03:05:06.wdf007Z/2001-02-03T04:05:06.007Z'); | ||
}).to.throw("can not parse '2001-02-03T03:05:06.wdf007Z' as ISO date"); | ||
}); | ||
it('errors on bad end', function () { | ||
chai_1.expect(function () { | ||
parseInterval('2001-02-03T03:05:06.007Z/2001-02-03T04:0ada5:06.007Z'); | ||
}).to.throw("can not parse '2001-02-03T04:0ada5:06.007Z' as ISO date"); | ||
}); | ||
it('errors on bad duration', function () { | ||
chai_1.expect(function () { | ||
parseInterval('P1poop'); | ||
}).to.throw("Can not parse duration 'P1poop'"); | ||
}); | ||
it('errors on flipped start end', function () { | ||
chai_1.expect(function () { | ||
parseInterval('2001-02-03T07:05:06.007Z/2001-02-03T04:05:06.007Z'); | ||
}).to.throw("start must be <= end in '2001-02-03T07:05:06.007Z/2001-02-03T04:05:06.007Z'"); | ||
}); | ||
/* | ||
Has to be one of: | ||
[start]/[end] | ||
[start]/[duration] | ||
[duration]/[end] | ||
[duration] | ||
*/ | ||
it('works with [start]/[end]', function () { | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('2001-02-03T03:05:06.007Z/2001-02-03T04:05:06.007Z', tz); | ||
chai_1.expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
chai_1.expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
it('works with [start]/[duration]', function () { | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('2001-02-03T03:05:06.007Z/PT1H', tz); | ||
chai_1.expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
chai_1.expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
it('works with [duration]/[end]', function () { | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('PT1H/2001-02-03T04:05:06.007Z', tz); | ||
chai_1.expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
chai_1.expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
it('works with [duration]', function () { | ||
var now = new Date('2001-02-03T04:05:06.007Z'); | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('PT1H', tz, now); | ||
chai_1.expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
chai_1.expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
}); | ||
it('date-time (tz = America/Los_Angeles)', function () { | ||
var tz = Timezone.fromJS('America/Los_Angeles'); | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
}); | ||
it('date-time (tz = null / local)', function () { | ||
var tz = null; | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(2001, 1, 3, 4, 5, 0, 0), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(2001, 1, 3, 4, 5, 6, 0), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(2001, 1, 3, 4, 5, 6, 7), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
}); | ||
}); |
@@ -5,3 +5,3 @@ /// <reference path="../typings/mocha/mocha.d.ts" /> | ||
import { assert } from "chai"; | ||
import { expect, assert } from "chai"; | ||
var { deepEqual } = assert; | ||
@@ -19,110 +19,180 @@ | ||
var { parseISODate } = chronoshift; | ||
var { parseISODate, parseInterval } = chronoshift; | ||
describe('parseISODate', () => { | ||
var sixHours = 6 * 60 * 60 * 1000, | ||
sixHoursThirty = sixHours + 30 * 60 * 1000; | ||
describe('date parser', () => { | ||
// Taken from https://github.com/csnover/js-iso8601/blob/lax/tests/test.js | ||
it('date-part', function () { | ||
deepEqual(parseISODate('1970-01-01'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'Unix epoch'); | ||
describe('parseISODate', () => { | ||
var sixHours = 6 * 60 * 60 * 1000, | ||
sixHoursThirty = sixHours + 30 * 60 * 1000; | ||
deepEqual(parseISODate('2001'), new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)), '2001'); | ||
deepEqual(parseISODate('2001-02'), new Date(Date.UTC(2001, 1, 1, 0, 0, 0, 0)), '2001-02'); | ||
deepEqual(parseISODate('2001-02-03'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03'); | ||
deepEqual(parseISODate('2001-02-03Z'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03Z'); | ||
// Taken from https://github.com/csnover/js-iso8601/blob/lax/tests/test.js | ||
it('date-part', () => { | ||
deepEqual(parseISODate('1970-01-01'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'Unix epoch'); | ||
deepEqual(parseISODate('-002001'), new Date(Date.UTC(-2001, 0, 1, 0, 0, 0, 0)), '-002001'); | ||
deepEqual(parseISODate('-002001-02'), new Date(Date.UTC(-2001, 1, 1, 0, 0, 0, 0)), '-002001-02'); | ||
deepEqual(parseISODate('-002001-02-03'), new Date(Date.UTC(-2001, 1, 3, 0, 0, 0, 0)), '-002001-02-03'); | ||
deepEqual(parseISODate('2001'), new Date(Date.UTC(2001, 0, 1, 0, 0, 0, 0)), '2001'); | ||
deepEqual(parseISODate('2001-02'), new Date(Date.UTC(2001, 1, 1, 0, 0, 0, 0)), '2001-02'); | ||
deepEqual(parseISODate('2001-02-03'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03'); | ||
deepEqual(parseISODate('2001-02-03Z'), new Date(Date.UTC(2001, 1, 3, 0, 0, 0, 0)), '2001-02-03Z'); | ||
deepEqual(parseISODate('+010000-02'), new Date(Date.UTC(10000, 1, 1, 0, 0, 0, 0)), '+010000-02'); | ||
deepEqual(parseISODate('+010000-02-03'), new Date(Date.UTC(10000, 1, 3, 0, 0, 0, 0)), '+010000-02-03'); | ||
deepEqual(parseISODate('-010000-02'), new Date(Date.UTC(-10000, 1, 1, 0, 0, 0, 0)), '-010000-02'); | ||
deepEqual(parseISODate('-010000-02-03'), new Date(Date.UTC(-10000, 1, 3, 0, 0, 0, 0)), '-010000-02-03'); | ||
deepEqual(parseISODate('-002001'), new Date(Date.UTC(-2001, 0, 1, 0, 0, 0, 0)), '-002001'); | ||
deepEqual(parseISODate('-002001-02'), new Date(Date.UTC(-2001, 1, 1, 0, 0, 0, 0)), '-002001-02'); | ||
deepEqual(parseISODate('-002001-02-03'), new Date(Date.UTC(-2001, 1, 3, 0, 0, 0, 0)), '-002001-02-03'); | ||
deepEqual(parseISODate('19700101'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch'); | ||
deepEqual(parseISODate('19700101Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch Z'); | ||
deepEqual(parseISODate('+010000-02'), new Date(Date.UTC(10000, 1, 1, 0, 0, 0, 0)), '+010000-02'); | ||
deepEqual(parseISODate('+010000-02-03'), new Date(Date.UTC(10000, 1, 3, 0, 0, 0, 0)), '+010000-02-03'); | ||
deepEqual(parseISODate('-010000-02'), new Date(Date.UTC(-10000, 1, 1, 0, 0, 0, 0)), '-010000-02'); | ||
deepEqual(parseISODate('-010000-02-03'), new Date(Date.UTC(-10000, 1, 3, 0, 0, 0, 0)), '-010000-02-03'); | ||
deepEqual(parseISODate('asdf'), null, 'invalid YYYY (non-digits)'); | ||
deepEqual(parseISODate('1970-as-df'), null, 'invalid YYYY-MM-DD (non-digits)'); | ||
deepEqual(parseISODate('1970-01-'), null, 'invalid YYYY-MM- (extra hyphen)'); | ||
deepEqual(parseISODate('197001'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month'); | ||
deepEqual(parseISODate('197001Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month Z'); | ||
deepEqual(parseISODate('19700101'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch'); | ||
deepEqual(parseISODate('19700101Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated Unix epoch Z'); | ||
// TODO: Test for invalid YYYYMM and invalid YYYYY? | ||
}); | ||
deepEqual(parseISODate('asdf'), null, 'invalid YYYY (non-digits)'); | ||
deepEqual(parseISODate('1970-as-df'), null, 'invalid YYYY-MM-DD (non-digits)'); | ||
deepEqual(parseISODate('1970-01-'), null, 'invalid YYYY-MM- (extra hyphen)'); | ||
deepEqual(parseISODate('197001'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month'); | ||
deepEqual(parseISODate('197001Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'non-hyphenated year-month Z'); | ||
it('date-time (tz = UTC)', function () { | ||
deepEqual(parseISODate('2001-02-03T04:05'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
// TODO: Test for invalid YYYYMM and invalid YYYYY? | ||
}); | ||
deepEqual(parseISODate('2001-02-03T04:05Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
it('date-time (tz = UTC)', () => { | ||
deepEqual(parseISODate('2001-02-03T04:05'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007-00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) + sixHoursThirty), '2001-02-03T04:05-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) + sixHoursThirty), '2001-02-03T04:05:06-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+00:00'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007+00:00'); | ||
deepEqual(parseISODate('2001-02-03T04:05+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) - sixHoursThirty), '2001-02-03T04:05+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) - sixHoursThirty), '2001-02-03T04:05:06+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) - sixHoursThirty), '2001-02-03T04:05:06.007+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) + sixHoursThirty), '2001-02-03T04:05-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) + sixHoursThirty), '2001-02-03T04:05:06-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('2001T04:05:06.007'), new Date(Date.UTC(2001, 0, 1, 4, 5, 6, 7)), '2001T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02T04:05:06.007'), new Date(Date.UTC(2001, 1, 1, 4, 5, 6, 7)), '2001-02T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.07'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 70)), '2001-02-03T04:05:06.07'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.7'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 700)), '2001-02-03T04:05:06.7'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0) - sixHoursThirty), '2001-02-03T04:05+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0) - sixHoursThirty), '2001-02-03T04:05:06+06:30'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007+06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) - sixHoursThirty), '2001-02-03T04:05:06.007+06:30'); | ||
deepEqual(parseISODate('-010000T04:05'), new Date(Date.UTC(-10000, 0, 1, 4, 5, 0, 0)), '-010000T04:05'); | ||
deepEqual(parseISODate('-010000-02T04:05'), new Date(Date.UTC(-10000, 1, 1, 4, 5, 0, 0)), '-010000-02T04:05'); | ||
deepEqual(parseISODate('-010000-02-03T04:05'), new Date(Date.UTC(-10000, 1, 3, 4, 5, 0, 0)), '-010000-02-03T04:05'); | ||
deepEqual(parseISODate('2001T04:05:06.007'), new Date(Date.UTC(2001, 0, 1, 4, 5, 6, 7)), '2001T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02T04:05:06.007'), new Date(Date.UTC(2001, 1, 1, 4, 5, 6, 7)), '2001-02T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.07'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 70)), '2001-02-03T04:05:06.07'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.7'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 700)), '2001-02-03T04:05:06.7'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007-06:30'), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7) + sixHoursThirty), '2001-02-03T04:05:06.007-06:30'); | ||
deepEqual(parseISODate('1970-01-01 00:00:00Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'space-separated datetime'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00.987654'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 987)), 'extended sub-second precision'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00,123'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 123)), 'comma-delimited milliseconds'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00+0630'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0) - sixHoursThirty), 'colon-free timezone part'); | ||
deepEqual(parseISODate('1970-01-01T000000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part'); | ||
deepEqual(parseISODate('1970-01-01T0000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part minute hour'); | ||
deepEqual(parseISODate('1970-01-01T00'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'hour only time part'); | ||
deepEqual(parseISODate('1970-01-01T00:00.000'), null, 'invalid date-time (msec with missing seconds)'); | ||
}); | ||
deepEqual(parseISODate('-010000T04:05'), new Date(Date.UTC(-10000, 0, 1, 4, 5, 0, 0)), '-010000T04:05'); | ||
deepEqual(parseISODate('-010000-02T04:05'), new Date(Date.UTC(-10000, 1, 1, 4, 5, 0, 0)), '-010000-02T04:05'); | ||
deepEqual(parseISODate('-010000-02-03T04:05'), new Date(Date.UTC(-10000, 1, 3, 4, 5, 0, 0)), '-010000-02-03T04:05'); | ||
it('date-time (tz = America/Los_Angeles)', function () { | ||
var tz = Timezone.fromJS('America/Los_Angeles'); | ||
deepEqual(parseISODate('1970-01-01 00:00:00Z'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'space-separated datetime'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00.987654'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 987)), 'extended sub-second precision'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00,123'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 123)), 'comma-delimited milliseconds'); | ||
deepEqual(parseISODate('1970-01-01T00:00:00+0630'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0) - sixHoursThirty), 'colon-free timezone part'); | ||
deepEqual(parseISODate('1970-01-01T000000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part'); | ||
deepEqual(parseISODate('1970-01-01T0000'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'colon-free time part minute hour'); | ||
deepEqual(parseISODate('1970-01-01T00'), new Date(Date.UTC(1970, 0, 1, 0, 0, 0, 0)), 'hour only time part'); | ||
deepEqual(parseISODate('1970-01-01T00:00.000'), null, 'invalid date-time (msec with missing seconds)'); | ||
}); | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
it('date-time (tz = America/Los_Angeles)', () => { | ||
var tz = Timezone.fromJS('America/Los_Angeles'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 0, 0)), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 0)), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(Date.UTC(2001, 1, 3, 4 + 8, 5, 6, 7)), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
}); | ||
it('date-time (tz = null / local)', () => { | ||
var tz: any = null; | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(2001, 1, 3, 4, 5, 0, 0), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(2001, 1, 3, 4, 5, 6, 0), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(2001, 1, 3, 4, 5, 6, 7), '2001-02-03T04:05:06.007'); | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
}); | ||
}); | ||
it('date-time (tz = null / local)', function () { | ||
var tz: any = null; | ||
deepEqual(parseISODate('2001-02-03T04:05', tz), new Date(2001, 1, 3, 4, 5, 0, 0), '2001-02-03T04:05'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06', tz), new Date(2001, 1, 3, 4, 5, 6, 0), '2001-02-03T04:05:06'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007', tz), new Date(2001, 1, 3, 4, 5, 6, 7), '2001-02-03T04:05:06.007'); | ||
describe('parseInterval', () => { | ||
deepEqual(parseISODate('2001-02-03T04:05Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 0, 0)), '2001-02-03T04:05Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 0)), '2001-02-03T04:05:06Z'); | ||
deepEqual(parseISODate('2001-02-03T04:05:06.007Z', tz), new Date(Date.UTC(2001, 1, 3, 4, 5, 6, 7)), '2001-02-03T04:05:06.007Z'); | ||
it('errors on bad start', () => { | ||
expect(() => { | ||
parseInterval('2001-02-03T03:05:06.wdf007Z/2001-02-03T04:05:06.007Z'); | ||
}).to.throw("can not parse '2001-02-03T03:05:06.wdf007Z' as ISO date") | ||
}); | ||
it('errors on bad end', () => { | ||
expect(() => { | ||
parseInterval('2001-02-03T03:05:06.007Z/2001-02-03T04:0ada5:06.007Z'); | ||
}).to.throw("can not parse '2001-02-03T04:0ada5:06.007Z' as ISO date") | ||
}); | ||
it('errors on bad duration', () => { | ||
expect(() => { | ||
parseInterval('P1poop'); | ||
}).to.throw("Can not parse duration 'P1poop'") | ||
}); | ||
it('errors on flipped start end', () => { | ||
expect(() => { | ||
parseInterval('2001-02-03T07:05:06.007Z/2001-02-03T04:05:06.007Z'); | ||
}).to.throw("start must be <= end in '2001-02-03T07:05:06.007Z/2001-02-03T04:05:06.007Z'") | ||
}); | ||
/* | ||
Has to be one of: | ||
[start]/[end] | ||
[start]/[duration] | ||
[duration]/[end] | ||
[duration] | ||
*/ | ||
it('works with [start]/[end]', () => { | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('2001-02-03T03:05:06.007Z/2001-02-03T04:05:06.007Z', tz); | ||
expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
it('works with [start]/[duration]', () => { | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('2001-02-03T03:05:06.007Z/PT1H', tz); | ||
expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
it('works with [duration]/[end]', () => { | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('PT1H/2001-02-03T04:05:06.007Z', tz); | ||
expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
it('works with [duration]', () => { | ||
var now = new Date('2001-02-03T04:05:06.007Z'); | ||
var tz = Timezone.UTC; | ||
var interval = parseInterval('PT1H', tz, now); | ||
expect(interval.computedStart).to.deep.equal(new Date('2001-02-03T03:05:06.007Z')); | ||
expect(interval.computedEnd).to.deep.equal(new Date('2001-02-03T04:05:06.007Z')); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is too big to display
867424
9198