Skip to content

Commit

Permalink
Merge pull request #253 from lchngr/master
Browse files Browse the repository at this point in the history
fix daylight saving issue for non utc dates
  • Loading branch information
patriksimek committed Jun 17, 2015
2 parents 2ffdb7f + b70721c commit f360b09
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 5 deletions.
14 changes: 9 additions & 5 deletions src/data-type.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ guidParser = require('./guid-parser')
NULL = (1 << 16) - 1
EPOCH_DATE = new Date(1900, 0, 1)
UTC_EPOCH_DATE = new Date(Date.UTC(1900, 0, 1))
YEAR_ONE = new Date(2000, 0, -730118).getTime()
YEAR_ONE = new Date(2000, 0, -730118)
UTC_YEAR_ONE = Date.UTC(2000, 0, -730118)
MAX = (1 << 16) - 1

Expand Down Expand Up @@ -114,7 +114,8 @@ TYPE =
days = Math.floor (parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)
minutes = (parameter.value.getUTCHours() * 60) + parameter.value.getUTCMinutes()
else
days = Math.floor (parameter.value.getTime() - EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)
dstDiff = -(parameter.value.getTimezoneOffset() - EPOCH_DATE.getTimezoneOffset()) * 60 * 1000
days = Math.floor (parameter.value.getTime() - EPOCH_DATE.getTime() + dstDiff) / (1000 * 60 * 60 * 24)
minutes = (parameter.value.getHours() * 60) + parameter.value.getMinutes()

buffer.writeUInt8(4)
Expand Down Expand Up @@ -189,7 +190,8 @@ TYPE =
seconds += parameter.value.getUTCSeconds()
milliseconds = (seconds * 1000) + parameter.value.getUTCMilliseconds()
else
days = Math.floor (parameter.value.getTime() - EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24)
dstDiff = -(parameter.value.getTimezoneOffset() - EPOCH_DATE.getTimezoneOffset()) * 60 * 1000
days = Math.floor (parameter.value.getTime() - EPOCH_DATE.getTime() + dstDiff) / (1000 * 60 * 60 * 24)
seconds = parameter.value.getHours() * 60 * 60
seconds += parameter.value.getMinutes() * 60
seconds += parameter.value.getSeconds()
Expand Down Expand Up @@ -903,7 +905,8 @@ TYPE =
if options.useUTC
buffer.writeUInt24LE Math.floor (+parameter.value - UTC_YEAR_ONE) / 86400000
else
buffer.writeUInt24LE Math.floor (+parameter.value - YEAR_ONE) / 86400000
dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000
buffer.writeUInt24LE Math.floor (+parameter.value - YEAR_ONE + dstDiff) / 86400000
else
buffer.writeUInt8 0
validate: (value) ->
Expand Down Expand Up @@ -964,7 +967,8 @@ TYPE =
if options.useUTC
buffer.writeUInt24LE Math.floor (+parameter.value - UTC_YEAR_ONE) / 86400000
else
buffer.writeUInt24LE Math.floor (+parameter.value - YEAR_ONE) / 86400000
dstDiff = -(parameter.value.getTimezoneOffset() - YEAR_ONE.getTimezoneOffset()) * 60 * 1000
buffer.writeUInt24LE Math.floor (+parameter.value - YEAR_ONE + dstDiff) / 86400000
else
buffer.writeUInt8 0
validate: (value) ->
Expand Down
60 changes: 60 additions & 0 deletions test/unit/data-type.coffee
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
TYPES = require('../../src/data-type')
WritableTrackingBuffer = require('../../src/tracking-buffer/writable-tracking-buffer')
ReadableTrackingBuffer = require('../../src/tracking-buffer/readable-tracking-buffer')

exports.noTypeOverridesByAliases = (test) ->
typesByName = {}
Expand All @@ -17,3 +19,61 @@ exports.knownAliases = (test) ->
test.strictEqual(TYPES.typeByName[alias], TYPES.typeByName["#{alias}N"], "Alias #{alias} is not pointing to #{alias}N type.")

test.done()

# Test date calculation for non utc date during daylight savings period
exports.smallDateTimeDaylightSaving = (test) ->
type = TYPES.typeByName['SmallDateTime']
for testSet in [[new Date(2015,5,18,23,59,59),42171],
[new Date(2015,5,19,0,0,0),42172],
[new Date(2015,5,19,23,59,59),42172],
[new Date(2015,5,20,0,0,0),42173]]
buffer = new WritableTrackingBuffer 8
parameter = { value: testSet[0] }
expectedNoOfDays = testSet[1]
type.writeParameterData(buffer, parameter, { useUTC: false })
test.strictEqual(buffer.buffer.readUInt16LE(1), expectedNoOfDays)
test.done()

exports.dateTimeDaylightSaving = (test) ->
type = TYPES.typeByName['DateTime']
for testSet in [[new Date(2015,5,18,23,59,59),42171],
[new Date(2015,5,19,0,0,0),42172],
[new Date(2015,5,19,23,59,59),42172],
[new Date(2015,5,20,0,0,0),42173]]
buffer = new WritableTrackingBuffer 16
parameter = { value: testSet[0] }
expectedNoOfDays = testSet[1]
type.writeParameterData(buffer, parameter, { useUTC: false })
test.strictEqual(buffer.buffer.readInt32LE(1), expectedNoOfDays)
test.done()

exports.dateTime2DaylightSaving = (test) ->
type = TYPES.typeByName['DateTime2']
for testSet in [[new Date(2015,5,18,23,59,59),735766],
[new Date(2015,5,19,0,0,0),735767],
[new Date(2015,5,19,23,59,59),735767],
[new Date(2015,5,20,0,0,0),735768]]
buffer = new WritableTrackingBuffer 16
parameter = { value: testSet[0], scale: 0 }
expectedNoOfDays = testSet[1]
type.writeParameterData(buffer, parameter, { useUTC: false })
rBuffer = new ReadableTrackingBuffer(buffer.buffer)
rBuffer.readUInt8()
rBuffer.readUInt24LE()
test.strictEqual(rBuffer.readUInt24LE(), expectedNoOfDays)
test.done()

exports.dateDaylightSaving = (test) ->
type = TYPES.typeByName['Date']
for testSet in [[new Date(2015,5,18,23,59,59),735766],
[new Date(2015,5,19,0,0,0),735767],
[new Date(2015,5,19,23,59,59),735767],
[new Date(2015,5,20,0,0,0),735768]]
buffer = new WritableTrackingBuffer 16
parameter = { value: testSet[0] }
expectedNoOfDays = testSet[1]
type.writeParameterData(buffer, parameter, { useUTC: false })
rBuffer = new ReadableTrackingBuffer(buffer.buffer)
rBuffer.readUInt8()
test.strictEqual(rBuffer.readUInt24LE(), expectedNoOfDays)
test.done()

0 comments on commit f360b09

Please sign in to comment.