@@ -36,8 +36,14 @@ d3.time.format = function(template) {
3636 // The am-pm flag is 0 for AM, and 1 for PM.
3737 if ( "p" in d ) d . H = d . H % 12 + d . p * 12 ;
3838
39- var date = new d3_time ( ) ;
40- date . setFullYear ( d . y , d . m , d . d ) ;
39+ var date = new d3_time ;
40+ if ( "j" in d ) date . setFullYear ( d . y , 0 , d . j ) ;
41+ else if ( "w" in d && ( "W" in d || "U" in d ) ) {
42+ date . setFullYear ( d . y , 0 , 1 ) ;
43+ date . setFullYear ( d . y , 0 , "W" in d
44+ ? ( d . w + 6 ) % 7 + d . W * 7 - ( date . getDay ( ) + 5 ) % 7
45+ : d . w + d . U * 7 - ( date . getDay ( ) + 6 ) % 7 ) ;
46+ } else date . setFullYear ( d . y , d . m , d . d ) ;
4147 date . setHours ( d . H , d . M , d . S , d . L ) ;
4248 return date ;
4349 } ;
@@ -86,11 +92,14 @@ function d3_time_formatPad(value, fill, width) {
8692}
8793
8894var d3_time_dayRe = d3_time_formatRe ( d3_time_days ) ,
95+ d3_time_dayLookup = d3_time_formatLookup ( d3_time_days ) ,
8996 d3_time_dayAbbrevRe = d3_time_formatRe ( d3_time_dayAbbreviations ) ,
97+ d3_time_dayAbbrevLookup = d3_time_formatLookup ( d3_time_dayAbbreviations ) ,
9098 d3_time_monthRe = d3_time_formatRe ( d3_time_months ) ,
9199 d3_time_monthLookup = d3_time_formatLookup ( d3_time_months ) ,
92100 d3_time_monthAbbrevRe = d3_time_formatRe ( d3_time_monthAbbreviations ) ,
93- d3_time_monthAbbrevLookup = d3_time_formatLookup ( d3_time_monthAbbreviations ) ;
101+ d3_time_monthAbbrevLookup = d3_time_formatLookup ( d3_time_monthAbbreviations ) ,
102+ d3_time_percentRe = / ^ % / ;
94103
95104var d3_time_formatPads = {
96105 "-" : "" ,
@@ -135,48 +144,65 @@ var d3_time_parsers = {
135144 e : d3_time_parseDay ,
136145 H : d3_time_parseHour24 ,
137146 I : d3_time_parseHour24 ,
138- // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; } ,
147+ j : d3_time_parseDayOfYear ,
139148 L : d3_time_parseMilliseconds ,
140149 m : d3_time_parseMonthNumber ,
141150 M : d3_time_parseMinutes ,
142151 p : d3_time_parseAmPm ,
143152 S : d3_time_parseSeconds ,
144- // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; } ,
145- // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; } ,
146- // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; } ,
153+ U : d3_time_parseWeekNumberSunday ,
154+ w : d3_time_parseWeekdayNumber ,
155+ W : d3_time_parseWeekNumberMonday ,
147156 x : d3_time_parseLocaleDate ,
148157 X : d3_time_parseLocaleTime ,
149158 y : d3_time_parseYear ,
150- Y : d3_time_parseFullYear
151- // ,
159+ Y : d3_time_parseFullYear ,
152160 // Z: function(d, s, i) { /*TODO time zone */ return i; },
153- // "%": function(d, s, i) { /*TODO literal % */ return i; }
161+ "%" : d3_time_parseLiteralPercent
154162} ;
155163
156164// Note: weekday is validated, but does not set the date.
157165function d3_time_parseWeekdayAbbrev ( date , string , i ) {
158166 d3_time_dayAbbrevRe . lastIndex = 0 ;
159167 var n = d3_time_dayAbbrevRe . exec ( string . substring ( i ) ) ;
160- return n ? i += n [ 0 ] . length : - 1 ;
168+ return n ? ( date . w = d3_time_dayAbbrevLookup . get ( n [ 0 ] . toLowerCase ( ) ) , i + n [ 0 ] . length ) : - 1 ;
161169}
162170
163171// Note: weekday is validated, but does not set the date.
164172function d3_time_parseWeekday ( date , string , i ) {
165173 d3_time_dayRe . lastIndex = 0 ;
166174 var n = d3_time_dayRe . exec ( string . substring ( i ) ) ;
167- return n ? i += n [ 0 ] . length : - 1 ;
175+ return n ? ( date . w = d3_time_dayLookup . get ( n [ 0 ] . toLowerCase ( ) ) , i + n [ 0 ] . length ) : - 1 ;
176+ }
177+
178+ function d3_time_parseWeekdayNumber ( date , string , i ) {
179+ d3_time_numberRe . lastIndex = 0 ;
180+ var n = d3_time_numberRe . exec ( string . substring ( i , i + 1 ) ) ;
181+ return n ? ( date . w = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
182+ }
183+
184+ function d3_time_parseWeekNumberSunday ( date , string , i ) {
185+ d3_time_numberRe . lastIndex = 0 ;
186+ var n = d3_time_numberRe . exec ( string . substring ( i ) ) ;
187+ return n ? ( date . U = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
188+ }
189+
190+ function d3_time_parseWeekNumberMonday ( date , string , i ) {
191+ d3_time_numberRe . lastIndex = 0 ;
192+ var n = d3_time_numberRe . exec ( string . substring ( i ) ) ;
193+ return n ? ( date . W = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
168194}
169195
170196function d3_time_parseMonthAbbrev ( date , string , i ) {
171197 d3_time_monthAbbrevRe . lastIndex = 0 ;
172198 var n = d3_time_monthAbbrevRe . exec ( string . substring ( i ) ) ;
173- return n ? ( date . m = d3_time_monthAbbrevLookup . get ( n [ 0 ] . toLowerCase ( ) ) , i += n [ 0 ] . length ) : - 1 ;
199+ return n ? ( date . m = d3_time_monthAbbrevLookup . get ( n [ 0 ] . toLowerCase ( ) ) , i + n [ 0 ] . length ) : - 1 ;
174200}
175201
176202function d3_time_parseMonth ( date , string , i ) {
177203 d3_time_monthRe . lastIndex = 0 ;
178204 var n = d3_time_monthRe . exec ( string . substring ( i ) ) ;
179- return n ? ( date . m = d3_time_monthLookup . get ( n [ 0 ] . toLowerCase ( ) ) , i += n [ 0 ] . length ) : - 1 ;
205+ return n ? ( date . m = d3_time_monthLookup . get ( n [ 0 ] . toLowerCase ( ) ) , i + n [ 0 ] . length ) : - 1 ;
180206}
181207
182208function d3_time_parseLocaleFull ( date , string , i ) {
@@ -194,13 +220,13 @@ function d3_time_parseLocaleTime(date, string, i) {
194220function d3_time_parseFullYear ( date , string , i ) {
195221 d3_time_numberRe . lastIndex = 0 ;
196222 var n = d3_time_numberRe . exec ( string . substring ( i , i + 4 ) ) ;
197- return n ? ( date . y = + n [ 0 ] , i += n [ 0 ] . length ) : - 1 ;
223+ return n ? ( date . y = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
198224}
199225
200226function d3_time_parseYear ( date , string , i ) {
201227 d3_time_numberRe . lastIndex = 0 ;
202228 var n = d3_time_numberRe . exec ( string . substring ( i , i + 2 ) ) ;
203- return n ? ( date . y = d3_time_expandYear ( + n [ 0 ] ) , i += n [ 0 ] . length ) : - 1 ;
229+ return n ? ( date . y = d3_time_expandYear ( + n [ 0 ] ) , i + n [ 0 ] . length ) : - 1 ;
204230}
205231
206232function d3_time_expandYear ( d ) {
@@ -210,38 +236,44 @@ function d3_time_expandYear(d) {
210236function d3_time_parseMonthNumber ( date , string , i ) {
211237 d3_time_numberRe . lastIndex = 0 ;
212238 var n = d3_time_numberRe . exec ( string . substring ( i , i + 2 ) ) ;
213- return n ? ( date . m = n [ 0 ] - 1 , i += n [ 0 ] . length ) : - 1 ;
239+ return n ? ( date . m = n [ 0 ] - 1 , i + n [ 0 ] . length ) : - 1 ;
214240}
215241
216242function d3_time_parseDay ( date , string , i ) {
217243 d3_time_numberRe . lastIndex = 0 ;
218244 var n = d3_time_numberRe . exec ( string . substring ( i , i + 2 ) ) ;
219- return n ? ( date . d = + n [ 0 ] , i += n [ 0 ] . length ) : - 1 ;
245+ return n ? ( date . d = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
246+ }
247+
248+ function d3_time_parseDayOfYear ( date , string , i ) {
249+ d3_time_numberRe . lastIndex = 0 ;
250+ var n = d3_time_numberRe . exec ( string . substring ( i , i + 3 ) ) ;
251+ return n ? ( date . j = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
220252}
221253
222254// Note: we don't validate that the hour is in the range [0,23] or [1,12].
223255function d3_time_parseHour24 ( date , string , i ) {
224256 d3_time_numberRe . lastIndex = 0 ;
225257 var n = d3_time_numberRe . exec ( string . substring ( i , i + 2 ) ) ;
226- return n ? ( date . H = + n [ 0 ] , i += n [ 0 ] . length ) : - 1 ;
258+ return n ? ( date . H = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
227259}
228260
229261function d3_time_parseMinutes ( date , string , i ) {
230262 d3_time_numberRe . lastIndex = 0 ;
231263 var n = d3_time_numberRe . exec ( string . substring ( i , i + 2 ) ) ;
232- return n ? ( date . M = + n [ 0 ] , i += n [ 0 ] . length ) : - 1 ;
264+ return n ? ( date . M = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
233265}
234266
235267function d3_time_parseSeconds ( date , string , i ) {
236268 d3_time_numberRe . lastIndex = 0 ;
237269 var n = d3_time_numberRe . exec ( string . substring ( i , i + 2 ) ) ;
238- return n ? ( date . S = + n [ 0 ] , i += n [ 0 ] . length ) : - 1 ;
270+ return n ? ( date . S = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
239271}
240272
241273function d3_time_parseMilliseconds ( date , string , i ) {
242274 d3_time_numberRe . lastIndex = 0 ;
243275 var n = d3_time_numberRe . exec ( string . substring ( i , i + 3 ) ) ;
244- return n ? ( date . L = + n [ 0 ] , i += n [ 0 ] . length ) : - 1 ;
276+ return n ? ( date . L = + n [ 0 ] , i + n [ 0 ] . length ) : - 1 ;
245277}
246278
247279// Note: we don't look at the next directive.
@@ -265,3 +297,9 @@ function d3_time_zone(d) {
265297 zm = Math . abs ( z ) % 60 ;
266298 return zs + d3_time_formatPad ( zh , "0" , 2 ) + d3_time_formatPad ( zm , "0" , 2 ) ;
267299}
300+
301+ function d3_time_parseLiteralPercent ( date , string , i ) {
302+ d3_time_percentRe . lastIndex = 0 ;
303+ var n = d3_time_percentRe . exec ( string . substring ( i , i + 1 ) ) ;
304+ return n ? i + n [ 0 ] . length : - 1 ;
305+ }
0 commit comments