UNPKG

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