devexpress-gantt
Version:
DevExpress Gantt Control
216 lines (209 loc) • 8.81 kB
text/typescript
import { Time } from "./Time";
import { TimeRange } from "./TimeRange";
import { isDefined } from "@devexpress/utils/lib/utils/common";
import { DateRange } from "./DateRange";
import { Month } from "./Month";
import { DayOfWeek } from "./DayOfWeek";
import { DayOfWeekMonthlyOccurrence } from "./DayOfWeekMonthlyOccurrence";
export class DateTimeUtils {
static readonly msInDay: number = 24 * 3600 * 1000;
static compareDates(date1: Date, date2: Date): number {
if(!date1 || !date2) return -1;
return date2.getTime() - date1.getTime();
}
static areDatesEqual(date1: Date, date2: Date): boolean {
return this.compareDates(date1, date2) == 0;
}
static getMaxDate(date1: Date, date2: Date): Date {
if(!date1 && !date2) return null;
if(!date1) return date2;
if(!date2) return date1;
const diff = this.compareDates(date1, date2);
return diff > 0 ? date2 : date1;
}
static getMinDate(date1: Date, date2: Date): Date {
if(!date1 && !date2) return null;
if(!date1) return date2;
if(!date2) return date1;
const diff = this.compareDates(date1, date2);
return diff > 0 ? date1 : date2;
}
static getDaysBetween(start: Date, end: Date): number {
const diff = Math.abs(end.getTime() - start.getTime());
return Math.ceil(diff / this.msInDay);
}
static getWeeksBetween(start: Date, end: Date): number {
const daysBetween = this.getDaysBetween(start, end);
let numWeeks = Math.floor(daysBetween / 7);
if(start.getDay() > end.getDay())
numWeeks++;
return numWeeks;
}
static getMonthsDifference(start: Date, end: Date): number {
const dateDiff = this.compareDates(start, end);
const from = dateDiff >= 0 ? start : end;
const to = dateDiff >= 0 ? end : start;
const yearsDiff = to.getFullYear() - from.getFullYear();
const monthDiff = yearsDiff * 12 + (to.getMonth() - from.getMonth());
return monthDiff;
}
static getYearsDifference(start: Date, end: Date): number {
return Math.abs(end.getFullYear() - start.getFullYear());
}
static getDayNumber(date: Date): number {
return Math.ceil(date.getTime() / this.msInDay);
}
static getDateByDayNumber(num: number): Date {
const date = new Date(num * this.msInDay);
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
return date;
}
static addDays(date: Date, days: number): Date {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
static checkDayOfMonth(day: number, date: Date): boolean {
return day == date.getDate();
}
static checkDayOfWeek(day: DayOfWeek, date: Date): boolean {
return day == date.getDay();
}
static checkMonth(month: Month, date: Date): boolean {
return month == date.getMonth();
}
static checkYear(year: number, date: Date): boolean {
return year == date.getFullYear();
}
static checkDayOfWeekOccurrenceInMonth(date: Date, dayOfWeek: DayOfWeek, occurrence: DayOfWeekMonthlyOccurrence): boolean {
const dayOfWeekInMonthDates = this.getSpecificDayOfWeekInMonthDates(dayOfWeek, date.getFullYear(), date.getMonth());
if(occurrence == DayOfWeekMonthlyOccurrence.Last)
return this.areDatesEqual(date, dayOfWeekInMonthDates[dayOfWeekInMonthDates.length - 1]);
return this.areDatesEqual(date, dayOfWeekInMonthDates[occurrence]);
}
static getFirstDayOfWeekInMonth(year: number, month: number): number {
const date = new Date(year, month, 1);
return date.getDay();
}
static getSpecificDayOfWeekInMonthDates(dayOfWeek: DayOfWeek, year: number, month: number): Array<Date> {
const firstDayOfWeekInMonth = this.getFirstDayOfWeekInMonth(year, month);
const diffDays = dayOfWeek >= firstDayOfWeekInMonth ? dayOfWeek - firstDayOfWeekInMonth : dayOfWeek + 7 - firstDayOfWeekInMonth;
const res = new Array<Date>();
let specificDayOfWeekDate = new Date(year, month, diffDays + 1);
while(specificDayOfWeekDate.getMonth() == month) {
res.push(specificDayOfWeekDate);
specificDayOfWeekDate = this.addDays(specificDayOfWeekDate, 7);
}
return res;
}
static getSpecificDayOfWeekInMonthDate(dayOfWeek: DayOfWeek, year: number, month: Month, occurrence: DayOfWeekMonthlyOccurrence): Date {
const dates = this.getSpecificDayOfWeekInMonthDates(dayOfWeek, year, month);
if(occurrence == DayOfWeekMonthlyOccurrence.Last)
return dates[dates.length - 1];
return dates[occurrence];
}
static checkValidDayInMonth(year: number, month: Month, day: number): boolean {
if(day < 1 || day > 31 || (new Date(year, month, day)).getMonth() != month)
return false;
return true;
}
static getNextMonth(month: Month, inc: number = 1): Month {
return (month + inc) % 12;
}
static convertToDate(src: any): Date {
if(src instanceof Date)
return new Date(src);
const ms = Date.parse(src as string);
if(!isNaN(ms))
return new Date(ms);
return null;
}
static convertTimeRangeToDateRange(timeRange: TimeRange, dayNumber: number): DateRange {
const date = this.getDateByDayNumber(dayNumber);
const year = date.getFullYear();
const month = date.getMonth();
const day = date.getDate();
const startT = timeRange.start;
const start = new Date(year, month, day, startT.hour, startT.min, startT.sec, startT.msec);
const endT = timeRange.end;
const end = new Date(year, month, day, endT.hour, endT.min, endT.sec, endT.msec);
return new DateRange(start, end);
}
static convertToTimeRanges(src: any): Array<TimeRange> {
if(src instanceof Array)
return src.map(x => this.convertToTimeRange(x));
return this.parseTimeRanges(src as string);
}
static convertToTimeRange(src: any): TimeRange {
if(!src) return null;
if(src instanceof TimeRange)
return src;
if(isDefined(src.start) && isDefined(src.end))
return new TimeRange(this.convertToTime(src.start), this.convertToTime(src.end));
return this.parseTimeRange(src as string);
}
static convertToTime(src: any): Time {
if(!src) return null;
if(src instanceof Time)
return src;
if(src instanceof Date)
return this.getTimeGromJsDate(src);
return this.parseTime(src as string);
}
static parseTimeRanges(src: string): Array<TimeRange> {
if(!src) return null;
const parts = src.split(/;|,/);
return parts.map(p => this.parseTimeRange(p)).filter(r => !!r);
}
static parseTimeRange(src: string): TimeRange {
if(!src) return null;
const parts = src.split("-");
const start = parts[0];
const end = parts[1];
if(isDefined(start) && isDefined(end))
return new TimeRange(this.parseTime(start), this.parseTime(end));
return null;
}
static parseTime(src: string): Time {
if(!src) return null;
const parts = src.split(":");
const h = parseInt(parts[0]) || 0;
const m = parseInt(parts[1]) || 0;
const s = parseInt(parts[2]) || 0;
const ms = parseInt(parts[3]) || 0;
return new Time(h, m, s, ms);
}
static getTimeGromJsDate(date: Date): Time {
if(!date) return null;
const h = date.getHours();
const m = date.getMinutes();
const s = date.getSeconds();
const ms = date.getMilliseconds();
return new Time(h, m, s, ms);
}
static caclTimeDifference(time1: Time, time2: Time): number {
return time2.getTimeInMilleconds() - time1.getTimeInMilleconds();
}
static areTimesEqual(time1: Time, time2: Time): boolean {
return this.caclTimeDifference(time1, time2) == 0;
}
static getMaxTime(time1: Time, time2: Time): Time {
if(!time1 && !time2) return null;
if(!time1) return time2;
if(!time2) return time1;
const diff = this.caclTimeDifference(time1, time2);
return diff > 0 ? time2 : time1;
}
static getMinTime(time1: Time, time2: Time): Time {
if(!time1 && !time2) return null;
if(!time1) return time2;
if(!time2) return time1;
const diff = this.caclTimeDifference(time1, time2);
return diff > 0 ? time1 : time2;
}
static getLastTimeOfDay(): Time {
return new Time(23, 59, 59, 999);
}
}