@@ -133,6 +133,18 @@ angular.module('ui.bootstrap.dateparser', [])
133
133
this . hours += 12 ;
134
134
}
135
135
}
136
+ } ,
137
+ {
138
+ key : 'Z' ,
139
+ regex : '[+-]\\d{4}' ,
140
+ apply : function ( value ) {
141
+ var matches = value . match ( / ( [ + - ] ) ( \d { 2 } ) ( \d { 2 } ) / ) ,
142
+ sign = matches [ 1 ] ,
143
+ hours = matches [ 2 ] ,
144
+ minutes = matches [ 3 ] ;
145
+ this . hours += toInt ( sign + hours ) ;
146
+ this . minutes += toInt ( sign + minutes ) ;
147
+ }
136
148
}
137
149
] ;
138
150
} ;
@@ -185,7 +197,11 @@ angular.module('ui.bootstrap.dateparser', [])
185
197
}
186
198
format = format . join ( '' ) ;
187
199
188
- map . push ( { index : index , apply : data . apply } ) ;
200
+ map . push ( {
201
+ index : index ,
202
+ apply : data . apply ,
203
+ matcher : data . regex
204
+ } ) ;
189
205
}
190
206
} ) ;
191
207
@@ -214,15 +230,19 @@ angular.module('ui.bootstrap.dateparser', [])
214
230
var parser = this . parsers [ format ] ,
215
231
regex = parser . regex ,
216
232
map = parser . map ,
217
- results = input . match ( regex ) ;
218
-
233
+ results = input . match ( regex ) ,
234
+ tzOffset = false ;
219
235
if ( results && results . length ) {
220
236
var fields , dt ;
221
237
if ( angular . isDate ( baseDate ) && ! isNaN ( baseDate . getTime ( ) ) ) {
222
238
fields = {
223
239
year : baseDate . getFullYear ( ) ,
224
240
month : baseDate . getMonth ( ) ,
225
- date : baseDate . getDate ( )
241
+ date : baseDate . getDate ( ) ,
242
+ hours : baseDate . getHours ( ) ,
243
+ minutes : baseDate . getMinutes ( ) ,
244
+ seconds : baseDate . getSeconds ( ) ,
245
+ milliseconds : baseDate . getMilliseconds ( )
226
246
} ;
227
247
} else {
228
248
if ( baseDate ) {
@@ -232,21 +252,32 @@ angular.module('ui.bootstrap.dateparser', [])
232
252
}
233
253
234
254
for ( var i = 1 , n = results . length ; i < n ; i ++ ) {
235
- var mapper = map [ i - 1 ] ;
255
+ var mapper = map [ i - 1 ] ;
256
+ if ( mapper . matcher === 'Z' ) {
257
+ tzOffset = true ;
258
+ }
259
+
236
260
if ( mapper . apply ) {
237
261
mapper . apply . call ( fields , results [ i ] ) ;
238
262
}
239
263
}
240
264
265
+ var datesetter = tzOffset ? Date . prototype . setUTCFullYear :
266
+ Date . prototype . setFullYear ;
267
+ var timesetter = tzOffset ? Date . prototype . setUTCHours :
268
+ Date . prototype . setHours ;
269
+
241
270
if ( isValid ( fields . year , fields . month , fields . date ) ) {
242
- if ( angular . isDate ( baseDate ) && ! isNaN ( baseDate . getTime ( ) ) ) {
271
+ if ( angular . isDate ( baseDate ) && ! isNaN ( baseDate . getTime ( ) ) && ! tzOffset ) {
243
272
dt = new Date ( baseDate ) ;
244
- dt . setFullYear ( fields . year , fields . month , fields . date ) ;
273
+ datesetter . call ( dt , fields . year , fields . month , fields . date ) ;
274
+ timesetter . call ( dt , fields . hours , fields . minutes ,
275
+ fields . seconds , fields . milliseconds ) ;
245
276
} else {
246
- dt = new Date ( fields . year , fields . month , fields . date ,
247
- fields . hours , fields . minutes , fields . seconds ,
248
- fields . milliseconds || 0 ) ;
249
- dt . setFullYear ( fields . year ) ;
277
+ dt = new Date ( 0 ) ;
278
+ datesetter . call ( dt , fields . year , fields . month , fields . date ) ;
279
+ timesetter . call ( dt , fields . hours || 0 , fields . minutes || 0 ,
280
+ fields . seconds || 0 , fields . milliseconds || 0 ) ;
250
281
}
251
282
}
252
283
@@ -271,4 +302,8 @@ angular.module('ui.bootstrap.dateparser', [])
271
302
272
303
return true ;
273
304
}
305
+
306
+ function toInt ( str ) {
307
+ return parseInt ( str , 10 ) ;
308
+ }
274
309
} ] ) ;
0 commit comments