@@ -31,23 +31,24 @@ function d3_time_format(template) {
3131 }
3232
3333 format . parse = function ( string ) {
34- var d = { y : 1900 , m : 0 , d : 1 , H : 0 , M : 0 , S : 0 , L : 0 } ,
34+ var d = { y : 1900 , m : 0 , d : 1 , H : 0 , M : 0 , S : 0 , L : 0 , Z : null } ,
3535 i = d3_time_parse ( d , template , string , 0 ) ;
3636 if ( i != string . length ) return null ;
3737
3838 // The am-pm flag is 0 for AM, and 1 for PM.
3939 if ( "p" in d ) d . H = d . H % 12 + d . p * 12 ;
4040
41- var date = new d3_date ;
41+ var utcZone = d . Z != null && d3_date !== d3_date_utc ,
42+ date = new ( utcZone ? d3_date_utc : d3_date ) ;
4243 if ( "j" in d ) date . setFullYear ( d . y , 0 , d . j ) ;
4344 else if ( "w" in d && ( "W" in d || "U" in d ) ) {
4445 date . setFullYear ( d . y , 0 , 1 ) ;
4546 date . setFullYear ( d . y , 0 , "W" in d
4647 ? ( d . w + 6 ) % 7 + d . W * 7 - ( date . getDay ( ) + 5 ) % 7
4748 : d . w + d . U * 7 - ( date . getDay ( ) + 6 ) % 7 ) ;
4849 } else date . setFullYear ( d . y , d . m , d . d ) ;
49- date . setHours ( d . H , d . M , d . S , d . L ) ;
50- return date ;
50+ date . setHours ( d . H + Math . floor ( d . Z / 100 ) , d . M + d . Z % 100 , d . S , d . L ) ;
51+ return utcZone ? new d3_date ( + date ) : date ;
5152 } ;
5253
5354 format . toString = function ( ) {
@@ -161,7 +162,7 @@ var d3_time_parsers = {
161162 X : d3_time_parseLocaleTime ,
162163 y : d3_time_parseYear ,
163164 Y : d3_time_parseFullYear ,
164- // Z: function(d, s, i) { /*TODO time zone */ return i; } ,
165+ Z : d3_time_parseZone ,
165166 "%" : d3_time_parseLiteralPercent
166167} ;
167168
@@ -231,6 +232,12 @@ function d3_time_parseYear(date, string, i) {
231232 return n ? ( date . y = d3_time_expandYear ( + n [ 0 ] ) , i + n [ 0 ] . length ) : - 1 ;
232233}
233234
235+ function d3_time_parseZone ( date , string , i ) {
236+ return / ^ [ + - ] \d { 4 } $ / . test ( string = string . substring ( i , i + 5 ) )
237+ ? ( date . Z = + string , i + 5 )
238+ : - 1 ;
239+ }
240+
234241function d3_time_expandYear ( d ) {
235242 return d + ( d > 68 ? 1900 : 2000 ) ;
236243}
0 commit comments