Skip to content

Commit

Permalink
Implemented %V (based on d3/d3#2151)
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianMitchL committed Jan 24, 2017
1 parent ea27907 commit 054c15c
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 1 deletion.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -119,6 +119,7 @@ Returns a new formatter for the given string *specifier*. The specifier string m
* `%p` - either AM or PM.*
* `%S` - second as a decimal number [00,61].
* `%U` - Sunday-based week of the year as a decimal number [00,53].
* `%V` - ISO 8601 Monday-based week of the year as a decimal number [01,53].
* `%w` - Sunday-based weekday as a decimal number [0,6].
* `%W` - Monday-based week of the year as a decimal number [00,53].
* `%x` - the locale’s date, such as `%-m/%-d/%Y`.*
Expand Down
30 changes: 29 additions & 1 deletion src/locale.js
@@ -1,4 +1,4 @@
import {timeDay, timeSunday, timeMonday, timeYear, utcDay, utcSunday, utcMonday, utcYear} from "d3-time";
import {timeDay, timeSunday, timeMonday, timeThursday, timeYear, utcDay, utcSunday, utcMonday, utcThursday, utcYear} from "d3-time";

function localDate(d) {
if (0 <= d.y && d.y < 100) {
Expand Down Expand Up @@ -60,6 +60,7 @@ export default function formatLocale(locale) {
"p": formatPeriod,
"S": formatSeconds,
"U": formatWeekNumberSunday,
"V": formatISOWeekNumber,
"w": formatWeekdayNumber,
"W": formatWeekNumberMonday,
"x": null,
Expand Down Expand Up @@ -87,6 +88,7 @@ export default function formatLocale(locale) {
"p": formatUTCPeriod,
"S": formatUTCSeconds,
"U": formatUTCWeekNumberSunday,
"V": formatUTCISOWeekNumber,
"w": formatUTCWeekdayNumber,
"W": formatUTCWeekNumberMonday,
"x": null,
Expand Down Expand Up @@ -114,6 +116,7 @@ export default function formatLocale(locale) {
"p": parsePeriod,
"S": parseSeconds,
"U": parseWeekNumberSunday,
"V": parseISOWeekNumber,
"w": parseWeekdayNumber,
"W": parseWeekNumberMonday,
"x": parseLocaleDate,
Expand Down Expand Up @@ -349,6 +352,11 @@ function parseWeekNumberSunday(d, string, i) {
return n ? (d.U = +n[0], i + n[0].length) : -1;
}

function parseISOWeekNumber(d, string, i) {
var n = numberRe.exec(string.slice(i));
return n ? (d.V = +n[0] - 1, i + n[0].length) : -1;
}

function parseWeekNumberMonday(d, string, i) {
var n = numberRe.exec(string.slice(i));
return n ? (d.W = +n[0], i + n[0].length) : -1;
Expand Down Expand Up @@ -441,6 +449,16 @@ function formatSeconds(d, p) {
return pad(d.getSeconds(), p, 2);
}

function formatISOWeekNumber(d, p) {
var dow = d.getDay();
d = (dow >= 4 || dow === 0) ? timeThursday(d) : timeThursday.ceil(d);
var weekNum = timeMonday.count(timeYear(d), d);
if (timeYear(d).getDay() <= 4) {
weekNum++;
}
return pad(weekNum, p, 2);
}

function formatWeekNumberSunday(d, p) {
return pad(timeSunday.count(timeYear(d), d), p, 2);
}
Expand Down Expand Up @@ -504,6 +522,16 @@ function formatUTCWeekNumberSunday(d, p) {
return pad(utcSunday.count(utcYear(d), d), p, 2);
}

function formatUTCISOWeekNumber(d, p) {
var dow = d.getUTCDay();
d = (dow >= 4 || dow === 0) ? utcThursday(d) : utcThursday.ceil(d);
var weekNum = utcMonday.count(utcYear(d), d);
if (utcYear(d).getUTCDay() <= 4) {
weekNum++;
}
return pad(weekNum, p, 2);
}

function formatUTCWeekdayNumber(d) {
return d.getUTCDay();
}
Expand Down
19 changes: 19 additions & 0 deletions test/format-test.js
Expand Up @@ -204,6 +204,25 @@ tape("timeFormat(\"%U\")(date) formats zero-padded week numbers", function(test)
test.end();
});

tape("timeFormat(\"%V\")(date) formats zero-padded ISO week numbers", function(test) {
var f = timeFormat.timeFormat("%V");
test.equal(f(date.local(1990, 0, 1)), "01");
test.equal(f(date.local(1990, 5, 1)), "22");
test.equal(f(date.local(2011, 0, 1)), "52");
test.equal(f(date.local(2011, 0, 2)), "52");
test.equal(f(date.local(2011, 0, 3)), "01");
test.equal(f(date.local(2009, 11, 31)), "53"); // Test bloody week 53
test.equal(f(date.local(2010, 0, 1)), "53");
test.equal(f(date.local(2010, 0, 1)), "53");
test.equal(f(date.local(2011, 2, 13, 23)), "10");
test.equal(f(date.local(2011, 2, 14, 0)), "11"); // DST begins
test.equal(f(date.local(2011, 2, 15, 0)), "11");
test.equal(f(date.local(2011, 10, 6, 23)), "44");
test.equal(f(date.local(2011, 10, 7, 0)), "45"); // DST ends
test.equal(f(date.local(2011, 10, 8, 0)), "45");
test.end();
});

tape("timeFormat(\"%x\")(date) formats localized dates", function(test) {
var f = timeFormat.timeFormat("%x");
test.equal(f(date.local(1990, 0, 1)), "1/1/1990");
Expand Down
33 changes: 33 additions & 0 deletions test/parse-test.js
Expand Up @@ -83,6 +83,17 @@ tape("timeParse(\"%a %W %Y\")(date) parses abbreviated weekday, week number (Mon
test.end();
});

tape("timeParse(\"%a %V %Y\")(date) parses abbreviated weekday, iso week number (Monday) and year", function(test) {
var p = timeFormat.timeParse("%a %V %Y");
test.deepEqual(p("Mon 02 1990"), date.local(1990, 0, 8));
test.deepEqual(p("Sun 05 1991"), date.local(1991, 1, 3));
test.deepEqual(p("Sun 01 1995"), date.local(1995, 0, 8));
test.deepEqual(p("Wed 01 2009"), date.local(2008, 11, 31));
test.deepEqual(p("Fri 53 2009"), date.local(2010, 0, 1));
test.equal(p("XXX 03 2010"), null);
test.end();
});

tape("timeParse(\"%A %W %Y\")(date) parses weekday, week number (Monday) and year", function(test) {
var p = timeFormat.timeParse("%A %W %Y");
test.deepEqual(p("Monday 01 1990"), date.local(1990, 0, 1));
Expand All @@ -92,6 +103,17 @@ tape("timeParse(\"%A %W %Y\")(date) parses weekday, week number (Monday) and yea
test.end();
});

tape("timeParse(\"%A %V %Y\")(date) parses weekday, ISO week number (Monday) and year", function(test) {
var p = timeFormat.timeParse("%w %V %Y");
test.deepEqual(p("Monday 02 1990"), date.local(1990, 0, 8));
test.deepEqual(p("Sunday 05 1991"), date.local(1991, 1, 3));
test.deepEqual(p("Sunday 01 1995"), date.local(1995, 0, 8));
test.deepEqual(p("Wednesday 01 2009"), date.local(2008, 11, 31));
test.deepEqual(p("Friday 53 2009"), date.local(2010, 0, 1));
test.equal(p("X 03 2010"), null);
test.end();
});

tape("timeParse(\"%w %W %Y\")(date) parses numeric weekday, week number (Monday) and year", function(test) {
var p = timeFormat.timeParse("%w %W %Y");
test.deepEqual(p("1 01 1990"), date.local(1990, 0, 1));
Expand All @@ -101,6 +123,17 @@ tape("timeParse(\"%w %W %Y\")(date) parses numeric weekday, week number (Monday)
test.end();
});

tape("timeParse(\"%w %V %Y\")(date)parses numeric weekday, ISO week number (Monday) and year", function(test) {
var p = timeFormat.timeParse("%w %V %Y");
test.deepEqual(p("1 02 1990"), date.local(1990, 0, 8));
test.deepEqual(p("0 05 1991"), date.local(1991, 1, 3));
test.deepEqual(p("0 01 1995"), date.local(1995, 0, 8));
test.deepEqual(p("3 01 2009"), date.local(2008, 11, 31));
test.deepEqual(p("5 53 2009"), date.local(2010, 0, 1));
test.equal(p("X 03 2010"), null);
test.end();
});

tape("timeParse(\"%m/%d/%y\")(date) parses month, date and two-digit year", function(test) {
var p = timeFormat.timeParse("%m/%d/%y");
test.deepEqual(p("02/03/69"), date.local(1969, 1, 3));
Expand Down
19 changes: 19 additions & 0 deletions test/utcFormat-test.js
Expand Up @@ -192,6 +192,25 @@ tape("utcFormat(\"%U\")(date) formats zero-padded week numbers", function(test)
test.end();
});

tape("utcFormat(\"%V\")(date) formats zero-padded ISO week numbers", function(test) {
var f = timeFormat.timeFormat("%V");
test.equal(f(date.utc(1990, 0, 1)), "01");
test.equal(f(date.utc(1990, 5, 1)), "22");
test.equal(f(date.utc(2011, 0, 1)), "52");
test.equal(f(date.utc(2011, 0, 2)), "52");
test.equal(f(date.utc(2011, 0, 3)), "01");
test.equal(f(date.utc(2009, 11, 31)), "53");
test.equal(f(date.utc(2010, 0, 1)), "53");
test.equal(f(date.utc(2010, 0, 1)), "53");
test.equal(f(date.utc(2011, 2, 13, 23)), "10");
test.equal(f(date.utc(2011, 2, 14, 0)), "11"); // DST begins
test.equal(f(date.utc(2011, 2, 15, 0)), "11");
test.equal(f(date.utc(2011, 10, 6, 23)), "44");
test.equal(f(date.utc(2011, 10, 7, 0)), "45"); // DST ends
test.equal(f(date.utc(2011, 10, 8, 0)), "45");
test.end();
});

tape("utcFormat(\"%x\")(date) formats localized dates", function(test) {
var f = timeFormat.utcFormat("%x");
test.equal(f(date.utc(1990, 0, 1)), "1/1/1990");
Expand Down

0 comments on commit 054c15c

Please sign in to comment.