UNPKG

5.41 kBJavaScriptView Raw
1import { padStart } from './helpers';
2/**
3 * General date-related utilities.
4 * Also handles several incompatibilities between JavaScript and Python
5 *
6 */
7export var dateutil;
8(function (dateutil) {
9 dateutil.MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
10 /**
11 * Number of milliseconds of one day
12 */
13 dateutil.ONE_DAY = 1000 * 60 * 60 * 24;
14 /**
15 * @see: <http://docs.python.org/library/datetime.html#datetime.MAXYEAR>
16 */
17 dateutil.MAXYEAR = 9999;
18 /**
19 * Python uses 1-Jan-1 as the base for calculating ordinals but we don't
20 * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER,
21 * therefore we use 1-Jan-1970 instead
22 */
23 dateutil.ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1));
24 /**
25 * Python: MO-SU: 0 - 6
26 * JS: SU-SAT 0 - 6
27 */
28 dateutil.PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5];
29 /**
30 * py_date.timetuple()[7]
31 */
32 dateutil.getYearDay = function (date) {
33 var dateNoTime = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
34 return (Math.ceil((dateNoTime.valueOf() -
35 new Date(date.getUTCFullYear(), 0, 1).valueOf()) /
36 dateutil.ONE_DAY) + 1);
37 };
38 dateutil.isLeapYear = function (year) {
39 return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
40 };
41 dateutil.isDate = function (value) {
42 return value instanceof Date;
43 };
44 dateutil.isValidDate = function (value) {
45 return dateutil.isDate(value) && !isNaN(value.getTime());
46 };
47 /**
48 * @return {Number} the date's timezone offset in ms
49 */
50 dateutil.tzOffset = function (date) {
51 return date.getTimezoneOffset() * 60 * 1000;
52 };
53 /**
54 * @see: <http://www.mcfedries.com/JavaScript/DaysBetween.asp>
55 */
56 dateutil.daysBetween = function (date1, date2) {
57 // The number of milliseconds in one day
58 // Convert both dates to milliseconds
59 var date1ms = date1.getTime() - dateutil.tzOffset(date1);
60 var date2ms = date2.getTime() - dateutil.tzOffset(date2);
61 // Calculate the difference in milliseconds
62 var differencems = date1ms - date2ms;
63 // Convert back to days and return
64 return Math.round(differencems / dateutil.ONE_DAY);
65 };
66 /**
67 * @see: <http://docs.python.org/library/datetime.html#datetime.date.toordinal>
68 */
69 dateutil.toOrdinal = function (date) {
70 return dateutil.daysBetween(date, dateutil.ORDINAL_BASE);
71 };
72 /**
73 * @see - <http://docs.python.org/library/datetime.html#datetime.date.fromordinal>
74 */
75 dateutil.fromOrdinal = function (ordinal) {
76 return new Date(dateutil.ORDINAL_BASE.getTime() + ordinal * dateutil.ONE_DAY);
77 };
78 dateutil.getMonthDays = function (date) {
79 var month = date.getUTCMonth();
80 return month === 1 && dateutil.isLeapYear(date.getUTCFullYear())
81 ? 29
82 : dateutil.MONTH_DAYS[month];
83 };
84 /**
85 * @return {Number} python-like weekday
86 */
87 dateutil.getWeekday = function (date) {
88 return dateutil.PY_WEEKDAYS[date.getUTCDay()];
89 };
90 /**
91 * @see: <http://docs.python.org/library/calendar.html#calendar.monthrange>
92 */
93 dateutil.monthRange = function (year, month) {
94 var date = new Date(Date.UTC(year, month, 1));
95 return [dateutil.getWeekday(date), dateutil.getMonthDays(date)];
96 };
97 /**
98 * @see: <http://docs.python.org/library/datetime.html#datetime.datetime.combine>
99 */
100 dateutil.combine = function (date, time) {
101 time = time || date;
102 return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds()));
103 };
104 dateutil.clone = function (date) {
105 var dolly = new Date(date.getTime());
106 return dolly;
107 };
108 dateutil.cloneDates = function (dates) {
109 var clones = [];
110 for (var i = 0; i < dates.length; i++) {
111 clones.push(dateutil.clone(dates[i]));
112 }
113 return clones;
114 };
115 /**
116 * Sorts an array of Date or dateutil.Time objects
117 */
118 dateutil.sort = function (dates) {
119 dates.sort(function (a, b) {
120 return a.getTime() - b.getTime();
121 });
122 };
123 dateutil.timeToUntilString = function (time, utc) {
124 if (utc === void 0) { utc = true; }
125 var date = new Date(time);
126 return [
127 padStart(date.getUTCFullYear().toString(), 4, '0'),
128 padStart(date.getUTCMonth() + 1, 2, '0'),
129 padStart(date.getUTCDate(), 2, '0'),
130 'T',
131 padStart(date.getUTCHours(), 2, '0'),
132 padStart(date.getUTCMinutes(), 2, '0'),
133 padStart(date.getUTCSeconds(), 2, '0'),
134 utc ? 'Z' : ''
135 ].join('');
136 };
137 dateutil.untilStringToDate = function (until) {
138 var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/;
139 var bits = re.exec(until);
140 if (!bits)
141 throw new Error("Invalid UNTIL value: " + until);
142 return new Date(Date.UTC(parseInt(bits[1], 10), parseInt(bits[2], 10) - 1, parseInt(bits[3], 10), parseInt(bits[5], 10) || 0, parseInt(bits[6], 10) || 0, parseInt(bits[7], 10) || 0));
143 };
144})(dateutil || (dateutil = {}));
145export default dateutil;
146//# sourceMappingURL=dateutil.js.map
\No newline at end of file