You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					253 lines
				
				6.2 KiB
			
		
		
			
		
	
	
					253 lines
				
				6.2 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | var luxon = require('luxon'); | ||
|  | 
 | ||
|  | CronDate.prototype.addYear = function() { | ||
|  |   this._date = this._date.plus({ years: 1 }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.addMonth = function() { | ||
|  |   this._date = this._date.plus({ months: 1 }).startOf('month'); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.addDay = function() { | ||
|  |   this._date = this._date.plus({ days: 1 }).startOf('day'); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.addHour = function() { | ||
|  |   var prev = this._date; | ||
|  |   this._date = this._date.plus({ hours: 1 }).startOf('hour'); | ||
|  |   if (this._date <= prev) { | ||
|  |     this._date = this._date.plus({ hours: 1 }); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.addMinute = function() { | ||
|  |   var prev = this._date; | ||
|  |   this._date = this._date.plus({ minutes: 1 }).startOf('minute'); | ||
|  |   if (this._date < prev) { | ||
|  |     this._date = this._date.plus({ hours: 1 }); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.addSecond = function() { | ||
|  |   var prev = this._date; | ||
|  |   this._date = this._date.plus({ seconds: 1 }).startOf('second'); | ||
|  |   if (this._date < prev) { | ||
|  |     this._date = this._date.plus({ hours: 1 }); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.subtractYear = function() { | ||
|  |   this._date = this._date.minus({ years: 1 }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.subtractMonth = function() { | ||
|  |   this._date = this._date | ||
|  |     .minus({ months: 1 }) | ||
|  |     .endOf('month') | ||
|  |     .startOf('second'); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.subtractDay = function() { | ||
|  |   this._date = this._date | ||
|  |     .minus({ days: 1 }) | ||
|  |     .endOf('day') | ||
|  |     .startOf('second'); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.subtractHour = function() { | ||
|  |   var prev = this._date; | ||
|  |   this._date = this._date | ||
|  |     .minus({ hours: 1 }) | ||
|  |     .endOf('hour') | ||
|  |     .startOf('second'); | ||
|  |   if (this._date >= prev) { | ||
|  |     this._date = this._date.minus({ hours: 1 }); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.subtractMinute = function() { | ||
|  |   var prev = this._date; | ||
|  |   this._date = this._date.minus({ minutes: 1 }) | ||
|  |     .endOf('minute') | ||
|  |     .startOf('second'); | ||
|  |   if (this._date > prev) { | ||
|  |     this._date = this._date.minus({ hours: 1 }); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.subtractSecond = function() { | ||
|  |   var prev = this._date; | ||
|  |   this._date = this._date | ||
|  |     .minus({ seconds: 1 }) | ||
|  |     .startOf('second'); | ||
|  |   if (this._date > prev) { | ||
|  |     this._date = this._date.minus({ hours: 1 }); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getDate = function() { | ||
|  |   return this._date.day; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getFullYear = function() { | ||
|  |   return this._date.year; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getDay = function() { | ||
|  |   var weekday = this._date.weekday; | ||
|  |   return weekday == 7 ? 0 : weekday; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getMonth = function() { | ||
|  |   return this._date.month - 1; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getHours = function() { | ||
|  |   return this._date.hour; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getMinutes = function() { | ||
|  |   return this._date.minute; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getSeconds = function() { | ||
|  |   return this._date.second; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getMilliseconds = function() { | ||
|  |   return this._date.millisecond; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getTime = function() { | ||
|  |   return this._date.valueOf(); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCDate = function() { | ||
|  |   return this._getUTC().day; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCFullYear = function() { | ||
|  |   return this._getUTC().year; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCDay = function() { | ||
|  |   var weekday = this._getUTC().weekday; | ||
|  |   return weekday == 7 ? 0 : weekday; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCMonth = function() { | ||
|  |   return this._getUTC().month - 1; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCHours = function() { | ||
|  |   return this._getUTC().hour; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCMinutes = function() { | ||
|  |   return this._getUTC().minute; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.getUTCSeconds = function() { | ||
|  |   return this._getUTC().second; | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.toISOString = function() { | ||
|  |   return this._date.toUTC().toISO(); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.toJSON = function() { | ||
|  |   return this._date.toJSON(); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setDate = function(d) { | ||
|  |   this._date = this._date.set({ day: d }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setFullYear = function(y) { | ||
|  |   this._date = this._date.set({ year: y }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setDay = function(d) { | ||
|  |   this._date = this._date.set({ weekday: d }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setMonth = function(m) { | ||
|  |   this._date = this._date.set({ month: m + 1 }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setHours = function(h) { | ||
|  |   this._date = this._date.set({ hour: h }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setMinutes = function(m) { | ||
|  |   this._date = this._date.set({ minute: m }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setSeconds = function(s) { | ||
|  |   this._date = this._date.set({ second: s }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.setMilliseconds = function(s) { | ||
|  |   this._date = this._date.set({ millisecond: s }); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype._getUTC = function() { | ||
|  |   return this._date.toUTC(); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.toString = function() { | ||
|  |   return this.toDate().toString(); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.toDate = function() { | ||
|  |   return this._date.toJSDate(); | ||
|  | }; | ||
|  | 
 | ||
|  | CronDate.prototype.isLastDayOfMonth = function() { | ||
|  |   //next day
 | ||
|  |   var newDate = this._date.plus({ days: 1 }).startOf('day'); | ||
|  |   return this._date.month !== newDate.month; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Returns true when the current weekday is the last occurrence of this weekday | ||
|  |  * for the present month. | ||
|  |  */ | ||
|  | CronDate.prototype.isLastWeekdayOfMonth = function() { | ||
|  |   // Check this by adding 7 days to the current date and seeing if it's
 | ||
|  |   // a different month
 | ||
|  |   var newDate = this._date.plus({ days: 7 }).startOf('day'); | ||
|  |   return this._date.month !== newDate.month; | ||
|  | }; | ||
|  | 
 | ||
|  | function CronDate (timestamp, tz) { | ||
|  |   var dateOpts = { zone: tz }; | ||
|  |   if (!timestamp) { | ||
|  |     this._date = luxon.DateTime.local(); | ||
|  |   } else if (timestamp instanceof CronDate) { | ||
|  |     this._date = timestamp._date; | ||
|  |   } else if (timestamp instanceof Date) { | ||
|  |     this._date = luxon.DateTime.fromJSDate(timestamp, dateOpts); | ||
|  |   } else if (typeof timestamp === 'number') { | ||
|  |     this._date = luxon.DateTime.fromMillis(timestamp, dateOpts); | ||
|  |   } else if (typeof timestamp === 'string') { | ||
|  |     this._date = luxon.DateTime.fromISO(timestamp, dateOpts); | ||
|  |     this._date.isValid || (this._date = luxon.DateTime.fromRFC2822(timestamp, dateOpts)); | ||
|  |     this._date.isValid || (this._date = luxon.DateTime.fromSQL(timestamp, dateOpts)); | ||
|  |     // RFC2822-like format without the required timezone offset (used in tests)
 | ||
|  |     this._date.isValid || (this._date = luxon.DateTime.fromFormat(timestamp, 'EEE, d MMM yyyy HH:mm:ss', dateOpts)); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!this._date || !this._date.isValid) { | ||
|  |     throw new Error('CronDate: unhandled timestamp: ' + JSON.stringify(timestamp)); | ||
|  |   } | ||
|  |    | ||
|  |   if (tz && tz !== this._date.zoneName) { | ||
|  |     this._date = this._date.setZone(tz); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = CronDate; |