diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index a81b5ede4c31..dd2a727d598c 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -260,8 +260,8 @@ function dateStrGetter(name, shortForm) { }; } -function timeZoneGetter(date) { - var zone = -1 * date.getTimezoneOffset(); +function timeZoneGetter(date, formats, offset) { + var zone = -1 * offset; var paddedZone = (zone >= 0) ? "+" : ""; paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + @@ -482,13 +482,18 @@ function dateFilter($locale) { } } - if (timezone && timezone === 'UTC') { - date = new Date(date.getTime()); - date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); + var dateTimezoneOffset = date.getTimezoneOffset(); + if (timezone) { + var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; + if (!isNaN(requestedTimezoneOffset)) { + date = new Date(date.getTime()); + date.setMinutes(date.getMinutes() + dateTimezoneOffset - requestedTimezoneOffset); + dateTimezoneOffset = requestedTimezoneOffset; + } } forEach(parts, function(value) { fn = DATE_FORMATS[value]; - text += fn ? fn(date, $locale.DATETIME_FORMATS) + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); }); diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index 2a5c9a603dc2..6d340119cd95 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -457,5 +457,14 @@ describe('filters', function() { expect(date(new Date(2003, 8, 10, 3, 2, 4), 'yyyy-MM-dd HH-mm-ss')).toEqual('2003-09-10 03-02-04'); expect(date(new Date(Date.UTC(2003, 8, 10, 3, 2, 4)), 'yyyy-MM-dd HH-mm-ss', 'UTC')).toEqual('2003-09-10 03-02-04'); }); + + it('should support conversion to any timezone', function() { + expect(date(new Date(Date.UTC(2003, 8, 10, 3, 2, 4)), 'yyyy-MM-dd HH-mm-ssZ', 'GMT+0500')).toEqual('2003-09-10 08-02-04+0500'); + }); + + it('should fallback to default timezone in case an unknown timezone was passed', function() { + var value = new angular.mock.TzDate(-2, '2003-09-10T01:02:04.000Z'); + expect(date(value, 'yyyy-MM-dd HH-mm-ssZ', 'WTF')).toEqual('2003-09-10 03-02-04+0200'); + }); }); });