diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 4c7f28612606..3459ef88c79d 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -211,8 +211,12 @@ function dateStrGetter(name, shortForm) { } function timeZoneGetter(date) { - var offset = date.getTimezoneOffset(); - return padNumber(offset / 60, 2) + padNumber(Math.abs(offset % 60), 2); + var zone = -1 * date.getTimezoneOffset(); + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(zone / 60, 2) + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; } function ampmGetter(date, formats) { @@ -319,7 +323,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+ expect(binding("1288323623006 | date:'medium'")). toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")). - toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} \-?\d{4}/); + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")). toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); }); diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index 369800e9cda7..2bc709ee7997 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -193,13 +193,13 @@ describe('filters', function() { toEqual('10-09-03 07:05:08'); expect(date(midnight, "yyyy-M-d h=H:m:saZ")). - toEqual('2010-9-3 12=0:5:8AM0500'); + toEqual('2010-9-3 12=0:5:8AM-0500'); expect(date(midnight, "yyyy-MM-dd hh=HH:mm:ssaZ")). - toEqual('2010-09-03 12=00:05:08AM0500'); + toEqual('2010-09-03 12=00:05:08AM-0500'); expect(date(noon, "yyyy-MM-dd hh=HH:mm:ssaZ")). - toEqual('2010-09-03 12=12:05:08PM0500'); + toEqual('2010-09-03 12=12:05:08PM-0500'); expect(date(noon, "EEE, MMM d, yyyy")). toEqual('Fri, Sep 3, 2010'); @@ -211,14 +211,30 @@ describe('filters', function() { toEqual('September 03, 1'); }); + it('should format timezones correctly (as per ISO_8601)', function() { + //Note: TzDate's first argument is offset, _not_ timezone. + var utc = new angular.mock.TzDate( 0, '2010-09-03T12:05:08.000Z'); + var eastOfUTC = new angular.mock.TzDate(-5, '2010-09-03T12:05:08.000Z'); + var westOfUTC = new angular.mock.TzDate(+5, '2010-09-03T12:05:08.000Z'); + + expect(date(utc, "yyyy-MM-ddTHH:mm:ssZ")). + toEqual('2010-09-03T12:05:08+0000') + + expect(date(eastOfUTC, "yyyy-MM-ddTHH:mm:ssZ")). + toEqual('2010-09-03T17:05:08+0500') + + expect(date(westOfUTC, "yyyy-MM-ddTHH:mm:ssZ")). + toEqual('2010-09-03T07:05:08-0500') + }); + it('should treat single quoted strings as string literals', function() { expect(date(midnight, "yyyy'de' 'a'x'dd' 'adZ' h=H:m:saZ")). - toEqual('2010de axdd adZ 12=0:5:8AM0500'); + toEqual('2010de axdd adZ 12=0:5:8AM-0500'); }); it('should treat a sequence of two single quotes as a literal single quote', function() { expect(date(midnight, "yyyy'de' 'a''dd' 'adZ' h=H:m:saZ")). - toEqual("2010de a'dd adZ 12=0:5:8AM0500"); + toEqual("2010de a'dd adZ 12=0:5:8AM-0500"); }); it('should accept default formats', function() {