aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Angular.js3
-rw-r--r--src/JSON.js21
-rw-r--r--test/JsonSpec.js56
3 files changed, 45 insertions, 35 deletions
diff --git a/src/Angular.js b/src/Angular.js
index 3ce8e7df..3c5bfa4b 100644
--- a/src/Angular.js
+++ b/src/Angular.js
@@ -73,8 +73,7 @@ var $boolean = 'boolean',
angularModule,
/** @name angular.module.ng */
nodeName_,
- uid = ['0', '0', '0'],
- DATE_ISOSTRING_LN = 24;
+ uid = ['0', '0', '0'];
/**
* @ngdoc function
diff --git a/src/JSON.js b/src/JSON.js
index 983a53e8..83d1e927 100644
--- a/src/JSON.js
+++ b/src/JSON.js
@@ -47,7 +47,7 @@ function fromJson(json, useNative) {
// TODO make forEach optionally recursive and remove this function
// TODO(misko): remove this once the $http service is checked in.
function transformDates(obj) {
- if (isString(obj) && obj.length === DATE_ISOSTRING_LN) {
+ if (isString(obj) && 15 <= obj.length && obj.length <= 24) {
return jsonStringToDate(obj);
} else if (isArray(obj) || isObject(obj)) {
forEach(obj, function(val, name) {
@@ -58,16 +58,25 @@ function fromJson(json, useNative) {
}
}
-var R_ISO8061_STR = /^(\d{4})-(\d\d)-(\d\d)(?:T(\d\d)(?:\:(\d\d)(?:\:(\d\d)(?:\.(\d{3}))?)?)?Z)?$/;
+var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
function jsonStringToDate(string){
var match;
- if (isString(string) && (match = string.match(R_ISO8061_STR))){
- var date = new Date(0);
- date.setUTCFullYear(match[1], match[2] - 1, match[3]);
- date.setUTCHours(match[4]||0, match[5]||0, match[6]||0, match[7]||0);
+ if (match = string.match(R_ISO8061_STR)) {
+ var date = new Date(0),
+ tzHour = 0,
+ tzMin = 0;
+ if (match[9]) {
+ tzHour = int(match[9] + match[10]);
+ tzMin = int(match[9] + match[11]);
+ }
+ date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
+ date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));
return date;
}
return string;
+ function int(str) {
+ return parseInt(str, 10);
+ }
}
function jsonDateToString(date){
diff --git a/test/JsonSpec.js b/test/JsonSpec.js
index df1e428a..e4abeef9 100644
--- a/test/JsonSpec.js
+++ b/test/JsonSpec.js
@@ -220,42 +220,44 @@ describe('json', function() {
});
- it('should read/write to date', function() {
- var date = new Date('Sep 10 2003 13:02:03 GMT');
- expect(jsonDateToString(date)).toBe('2003-09-10T13:02:03.000Z');
- expect(jsonStringToDate(jsonDateToString(date)).getTime()).toBe(date.getTime());
- });
+ describe('iso 8061 date', function() {
+ it('should read/write to date', function() {
+ var date = new Date('Sep 10 2003 13:02:03 GMT');
+ expect(jsonDateToString(date)).toBe('2003-09-10T13:02:03.000Z');
+ expect(jsonStringToDate(jsonDateToString(date)).getTime()).toBe(date.getTime());
+ });
- it('should convert to date', function() {
- //full ISO8061
- expect(jsonStringToDate('2003-09-10T13:02:03.000Z')).
- toEqual(new Date('Sep 10 2003 13:02:03 GMT'));
+ it('should convert to date', function() {
+ //full ISO8061
+ expect(jsonStringToDate('2003-09-10T13:02:03.000Z')).toEqual(new Date('Sep 10 2003 13:02:03 GMT'));
- //no millis
- expect(jsonStringToDate('2003-09-10T13:02:03Z')).
- toEqual(new Date('Sep 10 2003 13:02:03 GMT'));
+ expect(jsonStringToDate('2003-09-10T13:02:03.000+00:00')).toEqual(new Date('Sep 10 2003 13:02:03 GMT'));
- //no seconds
- expect(jsonStringToDate('2003-09-10T13:02Z')).
- toEqual(new Date('Sep 10 2003 13:02:00 GMT'));
+ expect(jsonStringToDate('20030910T033203-0930')).toEqual(new Date('Sep 10 2003 13:02:03 GMT'));
- //no minutes
- expect(jsonStringToDate('2003-09-10T13Z')).
- toEqual(new Date('Sep 10 2003 13:00:00 GMT'));
+ //no millis
+ expect(jsonStringToDate('2003-09-10T13:02:03Z')).toEqual(new Date('Sep 10 2003 13:02:03 GMT'));
- //no time
- expect(jsonStringToDate('2003-09-10')).
- toEqual(new Date('Sep 10 2003 00:00:00 GMT'));
- });
+ //no seconds
+ expect(jsonStringToDate('2003-09-10T13:02Z')).toEqual(new Date('Sep 10 2003 13:02:00 GMT'));
+ //no minutes
+ expect(jsonStringToDate('2003-09-10T13Z')).toEqual(new Date('Sep 10 2003 13:00:00 GMT'));
- it('should parse date', function() {
- var date = jsonStringToDate('2003-09-10T13:02:03.000Z');
- expect(jsonDateToString(date)).toBe('2003-09-10T13:02:03.000Z');
- expect(jsonStringToDate('str')).toBe('str');
- });
+ //no time
+ expect(jsonStringToDate('2003-09-10')).toEqual(new Date('Sep 10 2003 00:00:00 GMT'));
+ expect(jsonStringToDate('2011-12-28T13:02:09-08:00')).toEqual(new Date('Dec 28 2011 21:02:09 GMT'));
+ });
+
+
+ it('should parse date', function() {
+ var date = jsonStringToDate('2003-09-10T13:02:03.000Z');
+ expect(jsonDateToString(date)).toBe('2003-09-10T13:02:03.000Z');
+ expect(jsonStringToDate('str')).toBe('str');
+ });
+ });
describe('string', function() {
it('should quote', function() {