From c597a3adb0ac2d889a89b31c1f010796d820a4aa Mon Sep 17 00:00:00 2001 From: William Becker Date: Wed, 9 Jul 2014 09:00:22 +0100 Subject: [PATCH] handle non-standard HH:mm:ss, that occur with old times. --- lib/textParsers.js | 14 ++++--- test/dates.js | 100 ++++++++++++++++++++++++++++++++------------- 2 files changed, 81 insertions(+), 33 deletions(-) diff --git a/lib/textParsers.js b/lib/textParsers.js index 1149786..147df8b 100644 --- a/lib/textParsers.js +++ b/lib/textParsers.js @@ -39,9 +39,10 @@ var parseDate = function(isoDate) { //Z (UTC) //-05 //+06:30 - var tZone = /([Z|+\-])(\d{2})?:?(\d{2})?/.exec(isoDate.split(' ')[1]); + var tZone = /([Z|+\-])(\d{2})?:?(\d{2})?:?(\d{2})?/.exec(isoDate.split(' ')[1]); //minutes to adjust for timezone var tzAdjust = 0; + var tzSign = 1; var date; if(tZone) { var type = tZone[1]; @@ -49,10 +50,13 @@ var parseDate = function(isoDate) { case 'Z': break; case '-': - tzAdjust = -(((parseInt(tZone[2],10)*60)+(parseInt(tZone[3]||0,10)))); - break; + tzSign = -1; case '+': - tzAdjust = (((parseInt(tZone[2],10)*60)+(parseInt(tZone[3]||0,10)))); + tzAdjust = tzSign * ( + (parseInt(tZone[2], 10) * 3600) + + (parseInt(tZone[3] || 0, 10) * 60) + + (parseInt(tZone[4] || 0, 10)) + ); break; default: throw new Error("Unidentifed tZone part " + type); @@ -60,7 +64,7 @@ var parseDate = function(isoDate) { var utcOffset = Date.UTC(year, month, day, hour, min, seconds, mili); - date = new Date(utcOffset - (tzAdjust * 60* 1000)); + date = new Date(utcOffset - (tzAdjust * 1000)); } //no timezone information else { diff --git a/test/dates.js b/test/dates.js index 725b0b9..8a0bc87 100644 --- a/test/dates.js +++ b/test/dates.js @@ -1,41 +1,85 @@ -var parse = require('../').getTypeParser(1114, 'text'); -var assert = require('./assert') +/*global describe, it*/ +var parse = require("../").getTypeParser(1114, "text"); +var assert = require("./assert"); //some of these tests might be redundant //they were ported over from node-postgres //regardles: more tests is a good thing, right? :+1: -describe('date parser', function() { - it('parses date', function() { - assert.equal(parse("2010-12-11 09:09:04").toString(),new Date("2010-12-11 09:09:04").toString()); +describe("date parser", function() { + it("parses date", function() { + assert.equal( + parse("2010-12-11 09:09:04").toString(), + new Date("2010-12-11 09:09:04").toString() + ); }); var testForMs = function(part, expected) { var dateString = "2010-01-01 01:01:01" + part; - it('testing for correcting parsing of ' + dateString, function() { + it("testing for correcting parsing of " + dateString, function() { var ms = parse(dateString).getMilliseconds(); - assert.equal(ms, expected) - }) - } - - testForMs('.1', 100); - testForMs('.01', 10); - testForMs('.74', 740); - - it("dates without timezones", function() { - var actual = "2010-12-11 09:09:04.1"; - var expected = JSON.stringify(new Date(2010,11,11,9,9,4,100)) - assert.equal(JSON.stringify(parse(actual)),expected); - }); + assert.equal(ms, expected); + }); + }; - it("with timezones", function() { - var actual = "2011-01-23 22:15:51.28-06"; - var expected = "\"2011-01-24T04:15:51.280Z\""; - assert.equal(JSON.stringify(parse(actual)),expected); - }); + testForMs(".1", 100); + testForMs(".01", 10); + testForMs(".74", 740); + + describe("parses dates with", function () { + + it("no timezones", function() { + var actual = "2010-12-11 09:09:04.1"; + var expected = JSON.stringify(new Date(2010,11,11,9,9,4,100)); + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("huge millisecond value", function() { + var actual = "2011-01-23 22:15:51.280843-06"; + var expected = "\"2011-01-24T04:15:51.280Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("Zulu time offset", function() { + var actual = "2011-01-23 22:15:51Z"; + var expected = "\"2011-01-23T22:15:51.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); - it("with huge millisecond value", function() { - var actual = "2011-01-23 22:15:51.280843-06"; - var expected = "\"2011-01-24T04:15:51.280Z\""; - assert.equal(JSON.stringify(parse(actual)),expected); + it("positive hour offset", function() { + var actual = "2011-01-23 10:15:51+04"; + var expected = "\"2011-01-23T06:15:51.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("negative hour offset", function() { + var actual = "2011-01-23 10:15:51-04"; + var expected = "\"2011-01-23T14:15:51.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("positive HH:mm offset", function() { + var actual = "2011-01-23 10:15:51+06:10"; + var expected = "\"2011-01-23T04:05:51.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("negative HH:mm offset", function() { + var actual = "2011-01-23 10:15:51-06:10"; + var expected = "\"2011-01-23T16:25:51.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("positive HH:mm:ss offset", function() { + var actual = "0005-02-03 10:53:28+01:53:28"; + var expected = "\"0005-02-03T09:00:00.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); + + it("negative HH:mm:ss offset", function() { + var actual = "0005-02-03 09:58:45-02:01:15"; + var expected = "\"0005-02-03T12:00:00.000Z\""; + assert.equal(JSON.stringify(parse(actual)),expected); + }); }); + });