d3-time.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. // https://d3js.org/d3-time/ v1.1.0 Copyright 2019 Mike Bostock
  2. (function (global, factory) {
  3. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  4. typeof define === 'function' && define.amd ? define(['exports'], factory) :
  5. (global = global || self, factory(global.d3 = global.d3 || {}));
  6. }(this, function (exports) { 'use strict';
  7. var t0 = new Date,
  8. t1 = new Date;
  9. function newInterval(floori, offseti, count, field) {
  10. function interval(date) {
  11. return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;
  12. }
  13. interval.floor = function(date) {
  14. return floori(date = new Date(+date)), date;
  15. };
  16. interval.ceil = function(date) {
  17. return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
  18. };
  19. interval.round = function(date) {
  20. var d0 = interval(date),
  21. d1 = interval.ceil(date);
  22. return date - d0 < d1 - date ? d0 : d1;
  23. };
  24. interval.offset = function(date, step) {
  25. return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
  26. };
  27. interval.range = function(start, stop, step) {
  28. var range = [], previous;
  29. start = interval.ceil(start);
  30. step = step == null ? 1 : Math.floor(step);
  31. if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
  32. do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
  33. while (previous < start && start < stop);
  34. return range;
  35. };
  36. interval.filter = function(test) {
  37. return newInterval(function(date) {
  38. if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
  39. }, function(date, step) {
  40. if (date >= date) {
  41. if (step < 0) while (++step <= 0) {
  42. while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
  43. } else while (--step >= 0) {
  44. while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
  45. }
  46. }
  47. });
  48. };
  49. if (count) {
  50. interval.count = function(start, end) {
  51. t0.setTime(+start), t1.setTime(+end);
  52. floori(t0), floori(t1);
  53. return Math.floor(count(t0, t1));
  54. };
  55. interval.every = function(step) {
  56. step = Math.floor(step);
  57. return !isFinite(step) || !(step > 0) ? null
  58. : !(step > 1) ? interval
  59. : interval.filter(field
  60. ? function(d) { return field(d) % step === 0; }
  61. : function(d) { return interval.count(0, d) % step === 0; });
  62. };
  63. }
  64. return interval;
  65. }
  66. var millisecond = newInterval(function() {
  67. // noop
  68. }, function(date, step) {
  69. date.setTime(+date + step);
  70. }, function(start, end) {
  71. return end - start;
  72. });
  73. // An optimized implementation for this simple case.
  74. millisecond.every = function(k) {
  75. k = Math.floor(k);
  76. if (!isFinite(k) || !(k > 0)) return null;
  77. if (!(k > 1)) return millisecond;
  78. return newInterval(function(date) {
  79. date.setTime(Math.floor(date / k) * k);
  80. }, function(date, step) {
  81. date.setTime(+date + step * k);
  82. }, function(start, end) {
  83. return (end - start) / k;
  84. });
  85. };
  86. var milliseconds = millisecond.range;
  87. var durationSecond = 1e3;
  88. var durationMinute = 6e4;
  89. var durationHour = 36e5;
  90. var durationDay = 864e5;
  91. var durationWeek = 6048e5;
  92. var second = newInterval(function(date) {
  93. date.setTime(date - date.getMilliseconds());
  94. }, function(date, step) {
  95. date.setTime(+date + step * durationSecond);
  96. }, function(start, end) {
  97. return (end - start) / durationSecond;
  98. }, function(date) {
  99. return date.getUTCSeconds();
  100. });
  101. var seconds = second.range;
  102. var minute = newInterval(function(date) {
  103. date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);
  104. }, function(date, step) {
  105. date.setTime(+date + step * durationMinute);
  106. }, function(start, end) {
  107. return (end - start) / durationMinute;
  108. }, function(date) {
  109. return date.getMinutes();
  110. });
  111. var minutes = minute.range;
  112. var hour = newInterval(function(date) {
  113. date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);
  114. }, function(date, step) {
  115. date.setTime(+date + step * durationHour);
  116. }, function(start, end) {
  117. return (end - start) / durationHour;
  118. }, function(date) {
  119. return date.getHours();
  120. });
  121. var hours = hour.range;
  122. var day = newInterval(function(date) {
  123. date.setHours(0, 0, 0, 0);
  124. }, function(date, step) {
  125. date.setDate(date.getDate() + step);
  126. }, function(start, end) {
  127. return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
  128. }, function(date) {
  129. return date.getDate() - 1;
  130. });
  131. var days = day.range;
  132. function weekday(i) {
  133. return newInterval(function(date) {
  134. date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
  135. date.setHours(0, 0, 0, 0);
  136. }, function(date, step) {
  137. date.setDate(date.getDate() + step * 7);
  138. }, function(start, end) {
  139. return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
  140. });
  141. }
  142. var sunday = weekday(0);
  143. var monday = weekday(1);
  144. var tuesday = weekday(2);
  145. var wednesday = weekday(3);
  146. var thursday = weekday(4);
  147. var friday = weekday(5);
  148. var saturday = weekday(6);
  149. var sundays = sunday.range;
  150. var mondays = monday.range;
  151. var tuesdays = tuesday.range;
  152. var wednesdays = wednesday.range;
  153. var thursdays = thursday.range;
  154. var fridays = friday.range;
  155. var saturdays = saturday.range;
  156. var month = newInterval(function(date) {
  157. date.setDate(1);
  158. date.setHours(0, 0, 0, 0);
  159. }, function(date, step) {
  160. date.setMonth(date.getMonth() + step);
  161. }, function(start, end) {
  162. return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
  163. }, function(date) {
  164. return date.getMonth();
  165. });
  166. var months = month.range;
  167. var year = newInterval(function(date) {
  168. date.setMonth(0, 1);
  169. date.setHours(0, 0, 0, 0);
  170. }, function(date, step) {
  171. date.setFullYear(date.getFullYear() + step);
  172. }, function(start, end) {
  173. return end.getFullYear() - start.getFullYear();
  174. }, function(date) {
  175. return date.getFullYear();
  176. });
  177. // An optimized implementation for this simple case.
  178. year.every = function(k) {
  179. return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
  180. date.setFullYear(Math.floor(date.getFullYear() / k) * k);
  181. date.setMonth(0, 1);
  182. date.setHours(0, 0, 0, 0);
  183. }, function(date, step) {
  184. date.setFullYear(date.getFullYear() + step * k);
  185. });
  186. };
  187. var years = year.range;
  188. var utcMinute = newInterval(function(date) {
  189. date.setUTCSeconds(0, 0);
  190. }, function(date, step) {
  191. date.setTime(+date + step * durationMinute);
  192. }, function(start, end) {
  193. return (end - start) / durationMinute;
  194. }, function(date) {
  195. return date.getUTCMinutes();
  196. });
  197. var utcMinutes = utcMinute.range;
  198. var utcHour = newInterval(function(date) {
  199. date.setUTCMinutes(0, 0, 0);
  200. }, function(date, step) {
  201. date.setTime(+date + step * durationHour);
  202. }, function(start, end) {
  203. return (end - start) / durationHour;
  204. }, function(date) {
  205. return date.getUTCHours();
  206. });
  207. var utcHours = utcHour.range;
  208. var utcDay = newInterval(function(date) {
  209. date.setUTCHours(0, 0, 0, 0);
  210. }, function(date, step) {
  211. date.setUTCDate(date.getUTCDate() + step);
  212. }, function(start, end) {
  213. return (end - start) / durationDay;
  214. }, function(date) {
  215. return date.getUTCDate() - 1;
  216. });
  217. var utcDays = utcDay.range;
  218. function utcWeekday(i) {
  219. return newInterval(function(date) {
  220. date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
  221. date.setUTCHours(0, 0, 0, 0);
  222. }, function(date, step) {
  223. date.setUTCDate(date.getUTCDate() + step * 7);
  224. }, function(start, end) {
  225. return (end - start) / durationWeek;
  226. });
  227. }
  228. var utcSunday = utcWeekday(0);
  229. var utcMonday = utcWeekday(1);
  230. var utcTuesday = utcWeekday(2);
  231. var utcWednesday = utcWeekday(3);
  232. var utcThursday = utcWeekday(4);
  233. var utcFriday = utcWeekday(5);
  234. var utcSaturday = utcWeekday(6);
  235. var utcSundays = utcSunday.range;
  236. var utcMondays = utcMonday.range;
  237. var utcTuesdays = utcTuesday.range;
  238. var utcWednesdays = utcWednesday.range;
  239. var utcThursdays = utcThursday.range;
  240. var utcFridays = utcFriday.range;
  241. var utcSaturdays = utcSaturday.range;
  242. var utcMonth = newInterval(function(date) {
  243. date.setUTCDate(1);
  244. date.setUTCHours(0, 0, 0, 0);
  245. }, function(date, step) {
  246. date.setUTCMonth(date.getUTCMonth() + step);
  247. }, function(start, end) {
  248. return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
  249. }, function(date) {
  250. return date.getUTCMonth();
  251. });
  252. var utcMonths = utcMonth.range;
  253. var utcYear = newInterval(function(date) {
  254. date.setUTCMonth(0, 1);
  255. date.setUTCHours(0, 0, 0, 0);
  256. }, function(date, step) {
  257. date.setUTCFullYear(date.getUTCFullYear() + step);
  258. }, function(start, end) {
  259. return end.getUTCFullYear() - start.getUTCFullYear();
  260. }, function(date) {
  261. return date.getUTCFullYear();
  262. });
  263. // An optimized implementation for this simple case.
  264. utcYear.every = function(k) {
  265. return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
  266. date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
  267. date.setUTCMonth(0, 1);
  268. date.setUTCHours(0, 0, 0, 0);
  269. }, function(date, step) {
  270. date.setUTCFullYear(date.getUTCFullYear() + step * k);
  271. });
  272. };
  273. var utcYears = utcYear.range;
  274. exports.timeDay = day;
  275. exports.timeDays = days;
  276. exports.timeFriday = friday;
  277. exports.timeFridays = fridays;
  278. exports.timeHour = hour;
  279. exports.timeHours = hours;
  280. exports.timeInterval = newInterval;
  281. exports.timeMillisecond = millisecond;
  282. exports.timeMilliseconds = milliseconds;
  283. exports.timeMinute = minute;
  284. exports.timeMinutes = minutes;
  285. exports.timeMonday = monday;
  286. exports.timeMondays = mondays;
  287. exports.timeMonth = month;
  288. exports.timeMonths = months;
  289. exports.timeSaturday = saturday;
  290. exports.timeSaturdays = saturdays;
  291. exports.timeSecond = second;
  292. exports.timeSeconds = seconds;
  293. exports.timeSunday = sunday;
  294. exports.timeSundays = sundays;
  295. exports.timeThursday = thursday;
  296. exports.timeThursdays = thursdays;
  297. exports.timeTuesday = tuesday;
  298. exports.timeTuesdays = tuesdays;
  299. exports.timeWednesday = wednesday;
  300. exports.timeWednesdays = wednesdays;
  301. exports.timeWeek = sunday;
  302. exports.timeWeeks = sundays;
  303. exports.timeYear = year;
  304. exports.timeYears = years;
  305. exports.utcDay = utcDay;
  306. exports.utcDays = utcDays;
  307. exports.utcFriday = utcFriday;
  308. exports.utcFridays = utcFridays;
  309. exports.utcHour = utcHour;
  310. exports.utcHours = utcHours;
  311. exports.utcMillisecond = millisecond;
  312. exports.utcMilliseconds = milliseconds;
  313. exports.utcMinute = utcMinute;
  314. exports.utcMinutes = utcMinutes;
  315. exports.utcMonday = utcMonday;
  316. exports.utcMondays = utcMondays;
  317. exports.utcMonth = utcMonth;
  318. exports.utcMonths = utcMonths;
  319. exports.utcSaturday = utcSaturday;
  320. exports.utcSaturdays = utcSaturdays;
  321. exports.utcSecond = second;
  322. exports.utcSeconds = seconds;
  323. exports.utcSunday = utcSunday;
  324. exports.utcSundays = utcSundays;
  325. exports.utcThursday = utcThursday;
  326. exports.utcThursdays = utcThursdays;
  327. exports.utcTuesday = utcTuesday;
  328. exports.utcTuesdays = utcTuesdays;
  329. exports.utcWednesday = utcWednesday;
  330. exports.utcWednesdays = utcWednesdays;
  331. exports.utcWeek = utcSunday;
  332. exports.utcWeeks = utcSundays;
  333. exports.utcYear = utcYear;
  334. exports.utcYears = utcYears;
  335. Object.defineProperty(exports, '__esModule', { value: true });
  336. }));