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

Commit 9b31d65

Browse files
committed
refactor(filters/ngModel): extract common methods
1 parent bf6d4ae commit 9b31d65

File tree

5 files changed

+37
-18
lines changed

5 files changed

+37
-18
lines changed

src/.jshintrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@
7070
"toJsonReplacer": false,
7171
"toJson": false,
7272
"fromJson": false,
73+
"fromTimezoneToLocal": false,
74+
"fromLocalToTimezone": false,
75+
"timezoneToOffset": false,
7376
"startingTag": false,
7477
"tryDecodeURIComponent": false,
7578
"parseKeyValue": false,

src/Angular.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@
6565
toJsonReplacer: true,
6666
toJson: true,
6767
fromJson: true,
68+
fromTimezoneToLocal: true,
69+
fromLocalToTimezone: true,
70+
timezoneToOffset: true,
6871
startingTag: true,
6972
tryDecodeURIComponent: true,
7073
parseKeyValue: true,
@@ -1068,6 +1071,31 @@ function fromJson(json) {
10681071
}
10691072

10701073

1074+
function timezoneToOffset(timezone, fallback) {
1075+
var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
1076+
return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;
1077+
}
1078+
1079+
1080+
function addDateMinutes(date, minutes) {
1081+
date = new Date(date.getTime());
1082+
date.setMinutes(date.getMinutes() + minutes);
1083+
return date;
1084+
}
1085+
1086+
1087+
function fromTimezoneToLocal(date, timezone) {
1088+
var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset());
1089+
return addDateMinutes(date, timezoneOffset - date.getTimezoneOffset());
1090+
}
1091+
1092+
1093+
function fromLocalToTimezone(date, timezone) {
1094+
var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset());
1095+
return addDateMinutes(date, date.getTimezoneOffset() - timezoneOffset);
1096+
}
1097+
1098+
10711099
/**
10721100
* @returns {string} Returns the string representation of the element.
10731101
*/

src/ng/directive/input.js

Lines changed: 2 additions & 10 deletions
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 = fromTimezoneToLocal(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 = fromLocalToTimezone(previousDate, timezone);
11831175
}
11841176
return $filter('date')(value, format, timezone);
11851177
} else {

src/ng/filter/filters.js

Lines changed: 2 additions & 6 deletions
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 = fromLocalToTimezone(date, timezone);
497493
}
498494
forEach(parts, function(value) {
499495
fn = DATE_FORMATS[value];

test/ng/filter/filtersSpec.js

Lines changed: 2 additions & 2 deletions
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)