Parse week-of-year with implicit day-of-week.

If %W is specified, assume Monday; if %U is specified, assume Sunday.

Fixes #1914.
This commit is contained in:
Mike Bostock 2015-11-08 14:18:41 -08:00
Родитель d05692b4c7
Коммит e9472ba1da
4 изменённых файлов: 17 добавлений и 3 удалений

3
d3.js поставляемый
Просмотреть файл

@ -2539,7 +2539,8 @@
if (i != string.length) return null;
if ("p" in d) d.H = d.H % 12 + d.p * 12;
var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();
if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("w" in d && ("W" in d || "U" in d)) {
if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("W" in d || "U" in d) {
if (!("w" in d)) d.w = "W" in d ? 1 : 0;
date.setFullYear(d.y, 0, 1);
date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);
} else date.setFullYear(d.y, d.m, d.d);

2
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -54,7 +54,8 @@ function d3_locale_timeFormat(locale) {
// Set year, month, date.
if ("j" in d) date.setFullYear(d.y, 0, d.j);
else if ("w" in d && ("W" in d || "U" in d)) {
else if ("W" in d || "U" in d) {
if (!("w" in d)) d.w = "W" in d ? 1 : 0;
date.setFullYear(d.y, 0, 1);
date.setFullYear(d.y, 0, "W" in d
? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7

Просмотреть файл

@ -222,6 +222,12 @@ suite.addBatch({
assert.deepEqual(p("Sun 01 1995"), local(1995, 0, 1));
assert.isNull(p("XXX 03 2010"));
},
"assumes Sunday when parsing week number (Sunday) with no weekday": function(format) {
var p = format("%U %Y").parse;
assert.deepEqual(p("00 1990"), local(1989, 11, 31));
assert.deepEqual(p("05 1991"), local(1991, 1, 3));
assert.deepEqual(p("01 1995"), local(1995, 0, 1));
},
"parses weekday, week number (Sunday) and year": function(format) {
var p = format("%A %U %Y").parse;
assert.deepEqual(p("Monday 00 1990"), local(1990, 0, 1));
@ -256,6 +262,12 @@ suite.addBatch({
assert.deepEqual(p("0 04 1991"), local(1991, 1, 3));
assert.deepEqual(p("0 00 1995"), local(1995, 0, 1));
assert.isNull(p("X 03 2010"));
},
"assumes Monday when parsing week number (Monday) with no weekday": function(format) {
var p = format("%W %Y").parse;
assert.deepEqual(p("01 1990"), local(1990, 0, 1));
assert.deepEqual(p("05 1991"), local(1991, 1, 4));
assert.deepEqual(p("01 1995"), local(1995, 0, 2));
},
"parses numeric date": function(format) {
var p = format("%m/%d/%y").parse;