Skip to content

Instantly share code, notes, and snippets.

@thinhbuzz
Created April 8, 2019 20:53
Show Gist options
  • Save thinhbuzz/386103caf6afd757b0137be709b4237c to your computer and use it in GitHub Desktop.
Save thinhbuzz/386103caf6afd757b0137be709b4237c to your computer and use it in GitHub Desktop.
mattlewis92 Angular calendar luxon date adapter
import { DateAdapter } from 'angular-calendar';
import { DateTime, DateTimeOptions } from 'luxon';
export function getLuxonObject(value: Date | string | number, options?: DateTimeOptions & { format?: string }): DateTime {
if (value instanceof DateTime) {
return value;
}
let dateTime: DateTime;
if (value instanceof Date) {
dateTime = DateTime.fromJSDate(value, options);
} else if (typeof value === 'number') {
dateTime = DateTime.fromMillis(value, options);
} else if (typeof value === 'string') {
dateTime = DateTime.fromFormat(value, options.format, options);
}
if (dateTime && dateTime.isValid) {
return dateTime;
}
return null;
}
export function luxonAdapterFactory(): DateAdapter {
return {
addDays(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).plus({days: amount}).toJSDate();
},
addHours(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).plus({hours: amount}).toJSDate();
},
addMinutes(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).plus({minutes: amount}).toJSDate();
},
addMonths(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).plus({months: amount}).toJSDate();
},
addSeconds(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).plus({seconds: amount}).toJSDate();
},
addWeeks(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).plus({weeks: amount}).toJSDate();
},
differenceInDays(dateLeft: Date | string | number, dateRight: Date | string | number): number {
return getLuxonObject(dateLeft).diff(getLuxonObject(dateRight), 'days').days;
},
differenceInMinutes(dateLeft: Date | string | number, dateRight: Date | string | number): number {
return getLuxonObject(dateLeft).diff(getLuxonObject(dateRight), 'minutes').minutes;
},
differenceInSeconds(dateLeft: Date | string | number, dateRight: Date | string | number): number {
return getLuxonObject(dateLeft).diff(getLuxonObject(dateRight), 'seconds').seconds;
},
endOfDay(date: Date | string | number): Date {
return getLuxonObject(date).endOf('day').toJSDate();
},
endOfMonth(date: Date | string | number): Date {
return getLuxonObject(date).endOf('month').toJSDate();
},
endOfWeek(date: Date | string | number, options?: { weekStartsOn?: number }): Date {
return getLuxonObject(date).endOf('week').toJSDate();
},
getDate(date: Date | string | number): number {
return getLuxonObject(date).day;
},
getDay(date: Date | string | number): number {
const weekday = getLuxonObject(date).weekday;
return weekday === 7 ? 0 : weekday;
},
getHours(date: Date | string | number): number {
return getLuxonObject(date).hour;
},
getISOWeek(date: Date | string | number): number {
return getLuxonObject(date).weekday;
},
getMinutes(date: Date | string | number): number {
return getLuxonObject(date).minute;
},
getMonth(date: Date | string | number): number {
return getLuxonObject(date).month - 1;
},
getYear(date: Date | string | number): number {
return getLuxonObject(date).year;
},
isSameDay(dateLeft: Date | string | number, dateRight: Date | string | number): boolean {
return getLuxonObject(dateLeft).hasSame(getLuxonObject(dateRight), 'day');
},
isSameMonth(dateLeft: Date | string | number, dateRight: Date | string | number): boolean {
return getLuxonObject(dateLeft).hasSame(getLuxonObject(dateRight), 'month');
},
isSameSecond(dateLeft: Date | string | number, dateRight: Date | string | number): boolean {
return getLuxonObject(dateLeft).hasSame(getLuxonObject(dateRight), 'second');
},
max(...dates: Array<Date | string | number>): Date {
const dateTimes: DateTime[] = dates.map(date => getLuxonObject(date));
return DateTime.max(...dateTimes).toJSDate();
},
setDate(date: Date | string | number, dayOfMonth: number): Date {
return getLuxonObject(date).set({day: dayOfMonth}).toJSDate();
},
setHours(date: Date | string | number, hours: number): Date {
return getLuxonObject(date).set({hour: hours}).toJSDate();
},
setMinutes(date: Date | string | number, minutes: number): Date {
return getLuxonObject(date).set({minute: minutes}).toJSDate();
},
setMonth(date: Date | string | number, month: number): Date {
return getLuxonObject(date).set({month}).toJSDate();
},
setYear(date: Date | string | number, year: number): Date {
return getLuxonObject(date).set({year}).toJSDate();
},
startOfDay(date: Date | string | number): Date {
return getLuxonObject(date).startOf('day').toJSDate();
},
startOfMinute(date: Date | string | number): Date {
return getLuxonObject(date).startOf('minute').toJSDate();
},
startOfMonth(date: Date | string | number): Date {
return getLuxonObject(date).startOf('month').toJSDate();
},
startOfWeek(date: Date | string | number, options?: { weekStartsOn?: number }): Date {
let weekStartsOn = options && options.weekStartsOn;
if (isNaN(weekStartsOn)) {
weekStartsOn = 1;
}
if (weekStartsOn === 0) {
weekStartsOn = 7;
}
const dateTime = getLuxonObject(date);
const weekday = dateTime.weekday;
if (weekStartsOn === 1) {
return dateTime.startOf('week').toJSDate();
}
if (weekStartsOn <= weekday) {
return dateTime.startOf('week').plus({day: weekStartsOn - 1}).toJSDate();
}
return dateTime.startOf('week').minus({days: 8 - weekStartsOn}).toJSDate();
},
subDays(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).minus({days: amount}).toJSDate();
},
subMonths(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).minus({months: amount}).toJSDate();
},
subWeeks(date: Date | string | number, amount: number): Date {
return getLuxonObject(date).minus({weeks: amount}).toJSDate();
}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment