diff options
| -rw-r--r-- | CHANGELOG.md | 8 | ||||
| -rw-r--r-- | src/apis.js | 18 | ||||
| -rw-r--r-- | src/filters.js | 2 | ||||
| -rw-r--r-- | src/parser.js | 2 | ||||
| -rw-r--r-- | test/ApiSpecs.js | 9 | ||||
| -rw-r--r-- | test/FiltersSpec.js | 8 | ||||
| -rw-r--r-- | test/JsonSpec.js | 6 | ||||
| -rw-r--r-- | test/angular-mocksSpec.js | 10 |
8 files changed, 36 insertions, 27 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d0823c..af06e98d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ ### Api - date filter now accepts strings that angular.String.toDate can convert to Date objects +### Breaking changes +- we now support ISO 8601 extended format datetime strings (YYYY-MM-DDTHH:mm:ss.SSSZ) as defined + in EcmaScript 5 throughout angular. This means that the following apis switched from + YYYY-MM-DDTHH:mm:ssZ to YYYY-MM-DDTHH:mm:ss.SSSZ (note the added millis) when representing dates: + - angular.Date.toString + - angular.String.fromDate + - JSON serialization and deserialization (used by json filter, $xhr and $resource) + # <angular/> 0.9.2 faunal-mimicry (2010-11-03) # diff --git a/src/apis.js b/src/apis.js index c232e4a9..effb70d7 100644 --- a/src/apis.js +++ b/src/apis.js @@ -211,10 +211,10 @@ var angularString = { 'toDate':function(string){ var match; if (typeof string == 'string' && - (match = string.match(/^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/))){ + (match = string.match(/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)\.(\d{3})Z$/))){ var date = new Date(0); date.setUTCFullYear(match[1], match[2] - 1, match[3]); - date.setUTCHours(match[4], match[5], match[6], 0); + date.setUTCHours(match[4], match[5], match[6], match[7]); return date; } return string; @@ -223,14 +223,14 @@ var angularString = { var angularDate = { 'toString':function(date){ - function pad(n) { return n < 10 ? "0" + n : n; } return !date ? date : - date.getUTCFullYear() + '-' + - pad(date.getUTCMonth() + 1) + '-' + - pad(date.getUTCDate()) + 'T' + - pad(date.getUTCHours()) + ':' + - pad(date.getUTCMinutes()) + ':' + - pad(date.getUTCSeconds()) + 'Z' ; + padNumber(date.getUTCFullYear(), 4) + '-' + + padNumber(date.getUTCMonth() + 1, 2) + '-' + + padNumber(date.getUTCDate(), 2) + 'T' + + padNumber(date.getUTCHours(), 2) + ':' + + padNumber(date.getUTCMinutes(), 2) + ':' + + padNumber(date.getUTCSeconds(), 2) + '.' + + padNumber(date.getUTCMilliseconds(), 3) + 'Z'; } }; diff --git a/src/filters.js b/src/filters.js index ee0ef076..a166abad 100644 --- a/src/filters.js +++ b/src/filters.js @@ -169,7 +169,7 @@ var NUMBER_STRING = /^\d+$/; * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200‒1200) * * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or - * number) or ISO 8601 string (yyyy-MM-ddTHH:mm:ssZ). + * number) or ISO 8601 extended datetime string (yyyy-MM-ddTHH:mm:ss.SSSZ). * @param {string=} format Formatting rules. If not specified, Date#toLocaleDateString is used. * @returns {string} Formatted string or the input if input is not recognized as date/millis. * diff --git a/src/parser.js b/src/parser.js index 77800209..97d5740d 100644 --- a/src/parser.js +++ b/src/parser.js @@ -26,7 +26,7 @@ var OPERATORS = { var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; function lex(text, parseStringsForObjects){ - var dateParseLength = parseStringsForObjects ? 20 : -1, + var dateParseLength = parseStringsForObjects ? 24 : -1, tokens = [], token, index = 0, diff --git a/test/ApiSpecs.js b/test/ApiSpecs.js index 8969e1bf..344cf5da 100644 --- a/test/ApiSpecs.js +++ b/test/ApiSpecs.js @@ -185,18 +185,19 @@ describe('api', function(){ it('DateToUTC', function(){ var date = new Date("Sep 10 2003 13:02:03 GMT"); assertEquals("date", angular.Object.typeOf(date)); - assertEquals("2003-09-10T13:02:03Z", angular.Date.toString(date)); + assertEquals("2003-09-10T13:02:03.000Z", angular.Date.toString(date)); assertEquals(date.getTime(), angular.String.toDate(angular.Date.toString(date)).getTime()); }); it('UTCtoDate', function(){ - expect(angular.String.toDate("2003-09-10T13:02:03Z")).toEqual(new Date("Sep 10 2003 13:02:03 GMT")); + expect(angular.String.toDate("2003-09-10T13:02:03.000Z")). + toEqual(new Date("Sep 10 2003 13:02:03 GMT")); }); it('StringFromUTC', function(){ - var date = angular.String.toDate("2003-09-10T13:02:03Z"); + var date = angular.String.toDate("2003-09-10T13:02:03.000Z"); assertEquals("date", angular.Object.typeOf(date)); - assertEquals("2003-09-10T13:02:03Z", angular.Date.toString(date)); + assertEquals("2003-09-10T13:02:03.000Z", angular.Date.toString(date)); assertEquals("str", angular.String.toDate("str")); }); diff --git a/test/FiltersSpec.js b/test/FiltersSpec.js index ddbac273..34a627da 100644 --- a/test/FiltersSpec.js +++ b/test/FiltersSpec.js @@ -95,9 +95,9 @@ describe('filter', function(){ describe('date', function(){ - var morning = new TzDate(+5, '2010-09-03T12:05:08Z'); //7am - var noon = new TzDate(+5, '2010-09-03T17:05:08Z'); //12pm - var midnight = new TzDate(+5, '2010-09-03T05:05:08Z'); //12am + var morning = new TzDate(+5, '2010-09-03T12:05:08.000Z'); //7am + var noon = new TzDate(+5, '2010-09-03T17:05:08.000Z'); //12pm + var midnight = new TzDate(+5, '2010-09-03T05:05:08.000Z'); //12am it('should ignore falsy inputs', function() { @@ -130,7 +130,7 @@ describe('filter', function(){ }); it('should be able to parse ISO 8601 dates/times using', function() { - var isoString = '2010-09-03T05:05:08Z'; + var isoString = '2010-09-03T05:05:08.872Z'; expect(filter.date(isoString)). toEqual(angular.String.toDate(isoString).toLocaleDateString()); }); diff --git a/test/JsonSpec.js b/test/JsonSpec.js index e6264293..0acbd79c 100644 --- a/test/JsonSpec.js +++ b/test/JsonSpec.js @@ -62,9 +62,9 @@ describe('json', function(){ }); it('should serialize UTC dates', function() { - var date = angular.String.toDate("2009-10-09T01:02:03Z"); - expect(toJson(date)).toEqual('"2009-10-09T01:02:03Z"'); - expect(fromJson('"2009-10-09T01:02:03Z"').getTime()).toEqual(date.getTime()); + var date = angular.String.toDate("2009-10-09T01:02:03.027Z"); + expect(toJson(date)).toEqual('"2009-10-09T01:02:03.027Z"'); + expect(fromJson('"2009-10-09T01:02:03.027Z"').getTime()).toEqual(date.getTime()); }); it('should prevent recursion', function() { diff --git a/test/angular-mocksSpec.js b/test/angular-mocksSpec.js index 3daa1428..b96a9cfc 100644 --- a/test/angular-mocksSpec.js +++ b/test/angular-mocksSpec.js @@ -10,8 +10,8 @@ describe('TzDate', function() { }); it('should take dateString as constructor argument', function() { - expect(new TzDate(0, '1970-01-01T00:00:00Z').getTime()).toBe(0); - expect(new TzDate(0, '2010-09-03T23:05:08Z').getTime()).toBe(1283555108000); + expect(new TzDate(0, '1970-01-01T00:00:00.000Z').getTime()).toBe(0); + expect(new TzDate(0, '2010-09-03T23:05:08.023Z').getTime()).toBe(1283555108023); }); @@ -88,7 +88,7 @@ describe('TzDate', function() { it('should create a date representing new year in Bratislava', function() { - var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z'); + var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00.000Z'); expect(newYearInBratislava.getTimezoneOffset()).toBe(-60); expect(newYearInBratislava.getFullYear()).toBe(2010); expect(newYearInBratislava.getMonth()).toBe(0); @@ -100,7 +100,7 @@ describe('TzDate', function() { it('should delegate all the UTC methods to the original UTC Date object', function() { //from when created from string - var date1 = new TzDate(-1, '2009-12-31T23:00:00Z'); + var date1 = new TzDate(-1, '2009-12-31T23:00:00.000Z'); expect(date1.getUTCFullYear()).toBe(2009); expect(date1.getUTCMonth()).toBe(11); expect(date1.getUTCDate()).toBe(31); @@ -110,7 +110,7 @@ describe('TzDate', function() { //from when created from millis - var date2 = new TzDate(-1, angular.String.toDate('2009-12-31T23:00:00Z').getTime()); + var date2 = new TzDate(-1, angular.String.toDate('2009-12-31T23:00:00.000Z').getTime()); expect(date2.getUTCFullYear()).toBe(2009); expect(date2.getUTCMonth()).toBe(11); expect(date2.getUTCDate()).toBe(31); |
