export class DateTimeUtil { public day: number = 1 public month: number = 1 public year: number = 2017 public hour: number = 0 public minute: number = 0 public second: number = 0 constructor(yearOrDateTimeString: any = 1, month: number = 1, day: number = 1) { if (typeof yearOrDateTimeString === 'string') { if ( yearOrDateTimeString.match(DateTimeUtil.dateTimeStringRegex) || yearOrDateTimeString.match(DateTimeUtil.dateStrictStringRegex) ) { this.setFromString(yearOrDateTimeString) } } else if (typeof yearOrDateTimeString === 'number') { this.setDate(yearOrDateTimeString, month, day) } return this } public setDate(year: number, month: number, day: number) { this.year = year this.month = month this.day = day return this } public setFromString(string: string) { this.day = DateTimeUtil.getDayFromString(string) this.month = DateTimeUtil.getMonthFromString(string) this.year = DateTimeUtil.getYearFromString(string) if (string.match(DateTimeUtil.dateTimeStringRegex)) { this.hour = DateTimeUtil.getHourFromString(string) this.minute = DateTimeUtil.getMinuteFromString(string) this.second = DateTimeUtil.getSecondFromString(string) } return this } // Static // Based on mysql datetime. private static dateStringRegex = '^([0-9]{4})-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])' private static dateStrictStringRegex = '^([0-9]{4})-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])$' private static dateTimeStringRegex = '^([0-9]{4})-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1]) ([0-1][0-9]|2[0-3]):([0-4][0-9]|5[0-9]):([0-4][0-9]|5[0-9])$' private static dayOfWeekStrings = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] private static monthStrings = ['January', 'Februrary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] private static numberOfDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] static IsDateString(string: string) { return string.match(DateTimeUtil.dateStrictStringRegex) ? true : false } static IsDateTimeString(string: string) { return string.match(DateTimeUtil.dateTimeStringRegex) ? true : false } static getDayFromString(string: string) { return Number(string.match(DateTimeUtil.dateStringRegex)[3]) } static getHourFromString(string: string) { return Number(string.match(DateTimeUtil.dateTimeStringRegex)[4]) } static getMinuteFromString(string: string) { return Number(string.match(DateTimeUtil.dateTimeStringRegex)[5]) } static getMonthFromString(string: string) { return Number(string.match(DateTimeUtil.dateStringRegex)[2]) } static getSecondFromString(string: string) { return Number(string.match(DateTimeUtil.dateTimeStringRegex)[6]) } static getYearFromString(string: string) { return Number(string.match(DateTimeUtil.dateStringRegex)[1]) } static getDayOfWeek(year: number, month: number, day: number) { let days = DateTimeUtil.getNumberOfDaysFromYearZero(year, month, day) let remainder = (days + 6) % 7 return remainder + 1 } static getDayOfWeekString(year: number, month: number, day: number) { let dayOfWeek = DateTimeUtil.getDayOfWeek(year, month, day) return DateTimeUtil.dayOfWeekStrings[dayOfWeek - 1] } static getNumberOfDaysFromYearZero(year: number, month: number, day: number) { let sum = (year * 365) + DateTimeUtil.getNumberOfLeapYears(year) sum += DateTimeUtil.getNumberOfDaysInMonth(year, month) sum += day return sum } static getNumberOfDaysInMonth(year: number, month: number) { if ( DateTimeUtil.isLeapYear(year) && month === 2 ) { return 29 } else { return DateTimeUtil.numberOfDaysInMonth[month + 1] } } static getNumberOfLeapYears(year: number) { let leapYears = Math.floor(year / 4) if (year > 100) { leapYears -= Math.floor(year / 100) } if (year > 400) { leapYears -= Math.floor(year / 400) } return leapYears } static getTotalNumberOfDaysInMonth(year: number, month: number) { let sum = 0 let i = 0 while (i < month) { sum += DateTimeUtil.getNumberOfDaysInMonth(year, i + 1) i++ } return sum } // Returns true if year is a leap year. static isLeapYear(year: number) { let isLeapYear = false if (year % 4 === 0) { isLeapYear = true } // if year % 100 is 0 and year % 400 is not 0 // isLeapYear = false return isLeapYear } }