Skip to content

Commit

Permalink
Add various time iteration utilities.
Browse files Browse the repository at this point in the history
  • Loading branch information
mbostock committed Jul 19, 2011
1 parent a40876c commit ee74c46
Show file tree
Hide file tree
Showing 46 changed files with 808 additions and 2 deletions.
31 changes: 30 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,21 @@ d3.time.js: \
src/time/format.js \
src/time/format-utc.js \
src/time/format-iso.js \
src/time/range.js \
src/time/second.js \
src/time/seconds.js \
src/time/minute.js \
src/time/minutes.js \
src/time/hour.js \
src/time/hours.js \
src/time/day.js \
src/time/days.js \
src/time/week.js \
src/time/weeks.js \
src/time/month.js \
src/time/months.js \
src/time/year.js \
src/time/years.js \
src/end.js

d3.geom.js: \
Expand Down Expand Up @@ -206,7 +221,21 @@ tests: \
tests/test-svg-arc.test \
tests/test-svg-area.test \
tests/test-svg-line.test \
tests/test-svg-symbol.test
tests/test-svg-symbol.test \
tests/test-time-second.test \
tests/test-time-seconds.test \
tests/test-time-minute.test \
tests/test-time-minutes.test \
tests/test-time-hour.test \
tests/test-time-hours.test \
tests/test-time-day.test \
tests/test-time-days.test \
tests/test-time-week.test \
tests/test-time-weeks.test \
tests/test-time-month.test \
tests/test-time-months.test \
tests/test-time-year.test \
tests/test-time-years.test

%.min.js: %.js Makefile
@rm -f $@
Expand Down
97 changes: 97 additions & 0 deletions d3.time.js
Original file line number Diff line number Diff line change
Expand Up @@ -365,4 +365,101 @@ d3_time_format_utc.prototype = {
setSeconds: function(x) { this._.setUTCSeconds(x); }
};
d3.time.format.iso = d3.time.format.utc("%Y-%m-%dT%H:%M:%SZ");
function d3_time_range(floor, step) {
return function(t0, t1) {
var time = floor(t0), times = [];
if (time < t0) step(time);
while (time < t1) times.push(new Date(+time)), step(time);
return times;
};
}
d3.time.second = function(date) {
return new Date(~~(date / 1e3) * 1e3);
};

d3.time.second.utc = d3.time.second;
d3.time.seconds = d3_time_range(d3.time.second, function(date) {
date.setTime(date.getTime() + 1e3);
});

d3.time.seconds.utc = d3.time.seconds;
d3.time.minute = function(date) {
return new Date(~~(date / 6e4) * 6e4);
};

d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, function(date) {
date.setTime(date.getTime() + 6e4); // assumes no leap seconds
});

d3.time.minutes.utc = d3.time.minutes;d3.time.hour = function(date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours());
};

d3.time.hour.utc = function(date) {
return new Date(~~(date / 36e5) * 36e5);
};
d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep);
d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep);

function d3_time_hoursStep(date) {
date.setTime(date.getTime() + 36e5);
}
d3.time.day = function(date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
};

d3.time.day.utc = function(date) {
return new Date(~~(date / 864e5) * 864e5);
};
d3.time.days = d3_time_range(d3.time.day, function(date) {
date.setDate(date.getDate() + 1);
});

d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) {
date.setUTCDate(date.getUTCDate() + 1);
});
d3.time.week = function(date) {
(date = d3.time.day(date)).setDate(date.getDate() - date.getDay());
return date;
};

d3.time.week.utc = function(date) {
(date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay());
return date;
};
d3.time.weeks = d3_time_range(d3.time.week, function(date) {
date.setDate(date.getDate() + 7);
});

d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) {
date.setUTCDate(date.getUTCDate() + 7);
});
d3.time.month = function(date) {
return new Date(date.getFullYear(), date.getMonth(), 1);
};

d3.time.month.utc = function(date) {
return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));
};
d3.time.months = d3_time_range(d3.time.month, function(date) {
date.setMonth(date.getMonth() + 1);
});

d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) {
date.setUTCMonth(date.getUTCMonth() + 1);
});
d3.time.year = function(date) {
return new Date(date.getFullYear(), 0, 1);
};

d3.time.year.utc = function(date) {
return new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
};
d3.time.years = d3_time_range(d3.time.year, function(date) {
date.setFullYear(date.getFullYear() + 1);
});

d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) {
date.setUTCFullYear(date.getUTCFullYear() + 1);
});
})();
2 changes: 1 addition & 1 deletion d3.time.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions src/time/day.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.day = function(date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
};

d3.time.day.utc = function(date) {
return new Date(~~(date / 864e5) * 864e5);
};
7 changes: 7 additions & 0 deletions src/time/days.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.days = d3_time_range(d3.time.day, function(date) {
date.setDate(date.getDate() + 1);
});

d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) {
date.setUTCDate(date.getUTCDate() + 1);
});
7 changes: 7 additions & 0 deletions src/time/hour.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.hour = function(date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours());
};

d3.time.hour.utc = function(date) {
return new Date(~~(date / 36e5) * 36e5);
};
6 changes: 6 additions & 0 deletions src/time/hours.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep);
d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep);

function d3_time_hoursStep(date) {
date.setTime(date.getTime() + 36e5);
}
5 changes: 5 additions & 0 deletions src/time/minute.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
d3.time.minute = function(date) {
return new Date(~~(date / 6e4) * 6e4);
};

d3.time.minute.utc = d3.time.minute;
5 changes: 5 additions & 0 deletions src/time/minutes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
d3.time.minutes = d3_time_range(d3.time.minute, function(date) {
date.setTime(date.getTime() + 6e4); // assumes no leap seconds
});

d3.time.minutes.utc = d3.time.minutes;
7 changes: 7 additions & 0 deletions src/time/month.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.month = function(date) {
return new Date(date.getFullYear(), date.getMonth(), 1);
};

d3.time.month.utc = function(date) {
return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));
};
7 changes: 7 additions & 0 deletions src/time/months.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.months = d3_time_range(d3.time.month, function(date) {
date.setMonth(date.getMonth() + 1);
});

d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) {
date.setUTCMonth(date.getUTCMonth() + 1);
});
8 changes: 8 additions & 0 deletions src/time/range.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
function d3_time_range(floor, step) {
return function(t0, t1) {
var time = floor(t0), times = [];
if (time < t0) step(time);
while (time < t1) times.push(new Date(+time)), step(time);
return times;
};
}
5 changes: 5 additions & 0 deletions src/time/second.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
d3.time.second = function(date) {
return new Date(~~(date / 1e3) * 1e3);
};

d3.time.second.utc = d3.time.second;
5 changes: 5 additions & 0 deletions src/time/seconds.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
d3.time.seconds = d3_time_range(d3.time.second, function(date) {
date.setTime(date.getTime() + 1e3);
});

d3.time.seconds.utc = d3.time.seconds;
9 changes: 9 additions & 0 deletions src/time/week.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
d3.time.week = function(date) {
(date = d3.time.day(date)).setDate(date.getDate() - date.getDay());
return date;
};

d3.time.week.utc = function(date) {
(date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay());
return date;
};
7 changes: 7 additions & 0 deletions src/time/weeks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.weeks = d3_time_range(d3.time.week, function(date) {
date.setDate(date.getDate() + 7);
});

d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) {
date.setUTCDate(date.getUTCDate() + 7);
});
7 changes: 7 additions & 0 deletions src/time/year.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.year = function(date) {
return new Date(date.getFullYear(), 0, 1);
};

d3.time.year.utc = function(date) {
return new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
};
7 changes: 7 additions & 0 deletions src/time/years.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
d3.time.years = d3_time_range(d3.time.year, function(date) {
date.setFullYear(date.getFullYear() + 1);
});

d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) {
date.setUTCFullYear(date.getUTCFullYear() + 1);
});
Loading

0 comments on commit ee74c46

Please sign in to comment.