diff --git a/src/_lib/tzParseTimezone/index.js b/src/_lib/tzParseTimezone/index.js index 091ed50..03b542c 100644 --- a/src/_lib/tzParseTimezone/index.js +++ b/src/_lib/tzParseTimezone/index.js @@ -70,23 +70,32 @@ export default function tzParseTimezone(timezoneString, date, isUtcDate) { } function toUtcDate(date) { - return new Date( - Date.UTC( - date.getFullYear(), - date.getMonth(), - date.getDate(), - date.getHours(), - date.getMinutes(), - date.getSeconds(), - date.getMilliseconds() - ) + return newDateDateUTC( + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds() ) } +function newDateDateUTC(fullYear, month, day, hour, minute, second, millisecond) { + var utcDate = new Date(0) + utcDate.setUTCFullYear(fullYear, month, day) + utcDate.setUTCHours(hour, minute, second, millisecond) + return utcDate +} + +function DateUTC(fullYear, month, day, hour, minute, second, millisecond) { + return newDateDateUTC(fullYear, month, day, hour, minute, second, millisecond).getTime() +} + function calcOffset(date, timezoneString) { var tokens = tzTokenizeDate(date, timezoneString) - var asUTC = Date.UTC(tokens[0], tokens[1] - 1, tokens[2], tokens[3] % 24, tokens[4], tokens[5]) + var asUTC = DateUTC(tokens[0], tokens[1] - 1, tokens[2], tokens[3] % 24, tokens[4], tokens[5], 0) var asTS = date.getTime() var over = asTS % 1000 diff --git a/src/_lib/tzTokenizeDate/test.js b/src/_lib/tzTokenizeDate/test.js index 9f4b4f1..c0561a1 100644 --- a/src/_lib/tzTokenizeDate/test.js +++ b/src/_lib/tzTokenizeDate/test.js @@ -20,6 +20,11 @@ describe('tzTokenizeDate', function () { assert.deepEqual(result, [2020, 1, 23, 0, 0, 0]) }) + it('works with year < 100', function () { + var result = tzTokenizeDate(new Date('0099-01-01T00:00:00.000Z'), 'UTC') + assert.deepEqual(result, [99, 1, 1, 0, 0, 0, 0]) + }) + it('returns NaN when the date string is invalid', function () { var result = tzTokenizeDate(new Date('2014-10-25T25:46:20Z'), 'UTC') assert(Number.isNaN(result[0])) diff --git a/src/zonedTimeToUtc/index.js b/src/zonedTimeToUtc/index.js index 5f5cbc1..d7edf06 100644 --- a/src/zonedTimeToUtc/index.js +++ b/src/zonedTimeToUtc/index.js @@ -36,15 +36,11 @@ export default function zonedTimeToUtc(date, timeZone, options) { var d = toDate(date, options) - var utc = Date.UTC( - d.getFullYear(), - d.getMonth(), - d.getDate(), - d.getHours(), - d.getMinutes(), - d.getSeconds(), - d.getMilliseconds() - ) + var tmp = new Date(0) + tmp.setUTCFullYear(d.getFullYear(), d.getMonth(), d.getDate()) + tmp.setUTCHours(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()) + + var utc = tmp.getTime() var offsetMilliseconds = tzParseTimezone(timeZone, new Date(utc)) diff --git a/src/zonedTimeToUtc/test.js b/src/zonedTimeToUtc/test.js index e5d2b5a..7e405bf 100644 --- a/src/zonedTimeToUtc/test.js +++ b/src/zonedTimeToUtc/test.js @@ -45,6 +45,18 @@ describe('zonedTimeToUtc', function () { assert.deepEqual(result.toISOString(), '2014-06-25T10:00:00.123Z') }) + it('works with years < 100 (Date input)', function () { + var input = new Date(0) + input.setFullYear(99, 0, 1) + var result = zonedTimeToUtc(input, 'Europe/Berlin') + assert.deepEqual(result.toISOString(), '0099-01-01T00:06:32.000Z') + }) + + it('works with years < 100 (string input)', function () { + var result = zonedTimeToUtc('0099-01-01', 'Europe/Berlin') + assert.deepEqual(result.toISOString(), '0098-12-31T23:06:32.000Z') + }) + describe('near DST changeover (AEST to AEDT)', function () { it('zoned time one day before', function () { var result = zonedTimeToUtc(