Skip to content

Commit b96f736

Browse files
committed
fixed date formater and make it work on ie
1 parent f886545 commit b96f736

2 files changed

Lines changed: 48 additions & 23 deletions

File tree

src/filters.js

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,37 +42,49 @@ function padNumber(num, digits, trim) {
4242
num = num.substr(num.length - digits);
4343
return neg + num;
4444
}
45-
function dateGetter(name, size, option) {
45+
function dateGetter(name, size, offset, trim) {
4646
return function(date) {
47-
var value = date[name].call(date) + 1*(option===1);
48-
if (option == -12 && value > 12) value += option;
49-
return padNumber(value, size, option === true);
47+
var value = date['get' + name].call(date);
48+
if (offset > 0 || value > -offset)
49+
value += offset;
50+
if (value == 0 && offset == -12 ) value = 12;
51+
return padNumber(value, size, trim);
5052
};
5153
}
5254
var DATE_FORMATS = {
53-
yyyy: dateGetter('getFullYear', 4),
54-
yy: dateGetter('getFullYear', 2, true),
55-
MM: dateGetter('getMonth', 2, 1),
56-
dd: dateGetter('getDate', 2),
57-
HH: dateGetter('getHours', 2),
58-
KK: dateGetter('getHours', 2, -12),
59-
mm: dateGetter('getMinutes', 2),
60-
ss: dateGetter('getSeconds', 2),
55+
yyyy: dateGetter('FullYear', 4),
56+
yy: dateGetter('FullYear', 2, 0, true),
57+
MM: dateGetter('Month', 2, 1),
58+
M: dateGetter('Month', 1, 1),
59+
dd: dateGetter('Date', 2),
60+
d: dateGetter('Date', 1),
61+
HH: dateGetter('Hours', 2),
62+
H: dateGetter('Hours', 1),
63+
hh: dateGetter('Hours', 2, -12),
64+
h: dateGetter('Hours', 1, -12),
65+
mm: dateGetter('Minutes', 2),
66+
m: dateGetter('Minutes', 1),
67+
ss: dateGetter('Seconds', 2),
68+
s: dateGetter('Seconds', 1),
6169
a: function(date){return date.getHours() < 12 ? 'am' : 'pm'; },
6270
Z: function(date){
6371
var offset = date.getTimezoneOffset();
6472
return padNumber(offset / 60, 2) + padNumber(Math.abs(offset % 60), 2);
6573
}
6674
};
67-
var DATE_FORMATS_SPLIT = new RegExp('('+
68-
map(DATE_FORMATS, function(value, key){return key;}).join('|')+')');
75+
var DATE_FORMATS_SPLIT = /([^yMdHhmsaZ]*)(y+|M+|d+|H+|h+|m+|s+|a|Z)(.*)/;
6976

7077
angularFilter.date = function(date, format) {
7178
if (!date instanceof Date) return date;
7279
var text = date.toLocaleDateString(), fn;
7380
if (format && isString(format)) {
7481
text = '';
75-
foreach(format.split(DATE_FORMATS_SPLIT), function(value){
82+
var parts = [];
83+
while(format) {
84+
parts = concat(parts, DATE_FORMATS_SPLIT.exec(format), 1);
85+
format = parts.pop();
86+
}
87+
foreach(parts, function(value){
7688
fn = DATE_FORMATS[value];
7789
text += fn ? fn(date) : value;
7890
});

test/FiltersSpec.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,21 +87,34 @@ describe('filter', function(){
8787
});
8888

8989
describe('date', function(){
90-
var date = angular.String.toDate('2010-10-13T14:45:23Z');
90+
var morning = angular.String.toDate('2010-09-03T23:05:08Z');
91+
var midnight = angular.String.toDate('2010-09-03T23:05:08Z');
92+
var noon = angular.String.toDate('2010-09-03T23:05:08Z');
93+
morning.setHours(7);
94+
noon.setHours(12);
95+
midnight.setHours(0);
9196

9297
//butt-ugly hack: force the date to be 2pm PDT for locale testing
93-
date.setHours(14);
94-
date.getTimezoneOffset = function() { return 7 * 60; };
95-
98+
morning.getTimezoneOffset =
99+
noon.getTimezoneOffset =
100+
midnight.getTimezoneOffset =
101+
function() { return 7 * 60; };
96102

97103
it('should do basic filter', function() {
98-
expect(filter.date(date)).toEqual(date.toLocaleDateString());
99-
expect(filter.date(date, '')).toEqual(date.toLocaleDateString());
104+
expect(filter.date(noon)).toEqual(noon.toLocaleDateString());
105+
expect(filter.date(noon, '')).toEqual(noon.toLocaleDateString());
100106
});
101107

102108
it('should accept format', function() {
103-
expect(filter.date(date, "yyyy-MM-dd HH:mm:ss")).toEqual('2010-10-13 14:45:23');
104-
expect(filter.date(date, "yy-MM-dd KK:mm:ssaZ")).toEqual('10-10-13 02:45:23pm0700');
109+
expect(filter.date(midnight, "yyyy-M-d h=H:m:saZ")).
110+
toEqual('2010-9-3 12=0:5:8am0700');
111+
112+
expect(filter.date(midnight, "yyyy-MM-dd hh=HH:mm:ssaZ")).
113+
toEqual('2010-09-03 12=00:05:08am0700');
114+
115+
expect(filter.date(noon, "yyyy-MM-dd hh=HH:mm:ssaZ")).
116+
toEqual('2010-09-03 12=12:05:08pm0700');
117+
105118
});
106119

107120

0 commit comments

Comments
 (0)