Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit ddc6120

Browse files
shahatapetebacondarwin
authored andcommitted
refactor(filters/ngModel): extract common methods
Closes #11005
1 parent 0413bee commit ddc6120

File tree

5 files changed

+30
-18
lines changed

5 files changed

+30
-18
lines changed

src/.jshintrc

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
"toJsonReplacer": false,
7272
"toJson": false,
7373
"fromJson": false,
74+
"convertTimezoneToLocal": false,
75+
"timezoneToOffset": false,
7476
"startingTag": false,
7577
"tryDecodeURIComponent": false,
7678
"parseKeyValue": false,

src/Angular.js

+22
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
toJsonReplacer: true,
6767
toJson: true,
6868
fromJson: true,
69+
convertTimezoneToLocal: true,
70+
timezoneToOffset: true,
6971
startingTag: true,
7072
tryDecodeURIComponent: true,
7173
parseKeyValue: true,
@@ -1109,6 +1111,26 @@ function fromJson(json) {
11091111
}
11101112

11111113

1114+
function timezoneToOffset(timezone, fallback) {
1115+
var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
1116+
return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
1117+
}
1118+
1119+
1120+
function addDateMinutes(date, minutes) {
1121+
date = new Date(date.getTime());
1122+
date.setMinutes(date.getMinutes() + minutes);
1123+
return date;
1124+
}
1125+
1126+
1127+
function convertTimezoneToLocal(date, timezone, reverse) {
1128+
reverse = reverse ? -1 : 1;
1129+
var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset());
1130+
return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset()));
1131+
}
1132+
1133+
11121134
/**
11131135
* @returns {string} Returns the string representation of the element.
11141136
*/

src/ng/directive/input.js

+2-10
Original file line numberDiff line numberDiff line change
@@ -1157,11 +1157,7 @@ function createDateInputType(type, regexp, parseDate, format) {
11571157
// contains some different data format!
11581158
var parsedDate = parseDate(value, previousDate);
11591159
if (timezone) {
1160-
var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
1161-
if (!isNaN(requestedTimezoneOffset)) {
1162-
parsedDate = new Date(parsedDate.getTime());
1163-
parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset() + requestedTimezoneOffset);
1164-
}
1160+
parsedDate = convertTimezoneToLocal(parsedDate, timezone);
11651161
}
11661162
return parsedDate;
11671163
}
@@ -1175,11 +1171,7 @@ function createDateInputType(type, regexp, parseDate, format) {
11751171
if (isValidDate(value)) {
11761172
previousDate = value;
11771173
if (previousDate && timezone) {
1178-
var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
1179-
if (!isNaN(requestedTimezoneOffset)) {
1180-
previousDate = new Date(previousDate.getTime());
1181-
previousDate.setMinutes(previousDate.getMinutes() + previousDate.getTimezoneOffset() - requestedTimezoneOffset);
1182-
}
1174+
previousDate = convertTimezoneToLocal(previousDate, timezone, true);
11831175
}
11841176
return $filter('date')(value, format, timezone);
11851177
} else {

src/ng/filter/filters.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -488,12 +488,8 @@ function dateFilter($locale) {
488488

489489
var dateTimezoneOffset = date.getTimezoneOffset();
490490
if (timezone) {
491-
var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
492-
if (!isNaN(requestedTimezoneOffset)) {
493-
date = new Date(date.getTime());
494-
date.setMinutes(date.getMinutes() + dateTimezoneOffset - requestedTimezoneOffset);
495-
dateTimezoneOffset = requestedTimezoneOffset;
496-
}
491+
dateTimezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset());
492+
date = convertTimezoneToLocal(date, timezone, true);
497493
}
498494
forEach(parts, function(value) {
499495
fn = DATE_FORMATS[value];

test/ng/filter/filtersSpec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -464,8 +464,8 @@ describe('filters', function() {
464464
});
465465

466466
it('should fallback to default timezone in case an unknown timezone was passed', function() {
467-
var value = new angular.mock.TzDate(-2, '2003-09-10T01:02:04.000Z');
468-
expect(date(value, 'yyyy-MM-dd HH-mm-ssZ', 'WTF')).toEqual('2003-09-10 03-02-04+0200');
467+
var value = new Date(2003, 8, 10, 3, 2, 4);
468+
expect(date(value, 'yyyy-MM-dd HH-mm-ssZ', 'WTF')).toEqual(date(value, 'yyyy-MM-dd HH-mm-ssZ'));
469469
});
470470
});
471471
});

0 commit comments

Comments
 (0)