Skip to content

Commit

Permalink
Fixed zonedTimeToUtc not working with year < 100.
Browse files Browse the repository at this point in the history
  • Loading branch information
make-github-pseudonymous-again committed Mar 9, 2022
1 parent c438d29 commit 5b0ac78
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 20 deletions.
31 changes: 20 additions & 11 deletions src/_lib/tzParseTimezone/index.js
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions src/_lib/tzTokenizeDate/test.js
Expand Up @@ -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]))
Expand Down
14 changes: 5 additions & 9 deletions src/zonedTimeToUtc/index.js
Expand Up @@ -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))

Expand Down
12 changes: 12 additions & 0 deletions src/zonedTimeToUtc/test.js
Expand Up @@ -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(
Expand Down

0 comments on commit 5b0ac78

Please sign in to comment.