import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; import { isValid } from 'date-fns'; import { formatInTimeZone } from 'date-fns-tz'; import isObject from 'lodash/isObject'; import { hasNoValue } from './empty.util'; /** * Returns true if the passed value is a NgbDateStruct. * * @param value * The object to check * @return boolean * true if the passed value is a NgbDateStruct, false otherwise */ export function isNgbDateStruct(value: object): boolean { return isObject(value) && value.hasOwnProperty('day') && value.hasOwnProperty('month') && value.hasOwnProperty('year'); } /** * Returns a date in simplified extended ISO format (YYYY-MM-DDTHH:mm:ssZ). * The timezone is always zero UTC offset, as denoted by the suffix "Z" * * @param date * The date to format * @return string * the formatted date */ export function dateToISOFormat(date: Date | NgbDateStruct | string): string { const dateObj: Date = (date instanceof Date) ? date : ((typeof date === 'string') ? ngbDateStructToDate(stringToNgbDateStruct(date)) : ngbDateStructToDate(date)); return formatInTimeZone(dateObj, 'UTC', "yyyy-MM-dd'T'HH:mm:ss'Z'"); } /** * Returns a Date object started from a NgbDateStruct object * * @param date * The NgbDateStruct to convert * @return Date * the Date object */ export function ngbDateStructToDate(date: NgbDateStruct): Date { return new Date(Date.UTC(date.year, (date.month - 1), date.day)); } /** * Returns a NgbDateStruct object started from a string representing a date * * @param date * The Date to convert * @return NgbDateStruct * the NgbDateStruct object */ export function stringToNgbDateStruct(date: string): NgbDateStruct { return dateToNgbDateStruct(new Date(date)); } /** * Returns a NgbDateStruct object started from a Date object * * @param date * The Date to convert * @return NgbDateStruct * the NgbDateStruct object */ export function dateToNgbDateStruct(date?: Date): NgbDateStruct { if (hasNoValue(date)) { date = new Date(); } return { year: date.getUTCFullYear(), month: date.getUTCMonth() + 1, day: date.getUTCDate(), }; } /** * Returns a date in simplified format (YYYY-MM-DD). * * @param date * The date to format * @return string * the formatted date */ export function dateToString(date: Date | NgbDateStruct): string { const dateObj: Date = (date instanceof Date) ? date : ngbDateStructToDate(date); return formatInTimeZone(dateObj, 'UTC', 'yyyy-MM-dd'); } /** * Checks if the given string represents a valid date * @param date the string to be checked */ export function isValidDate(date: string) { return (hasNoValue(date)) ? false : isValid(new Date(date)); } /** * Parse given date string to a year number based on expected formats * @param date the string to be parsed * @param formats possible formats the string may align with. MUST be valid date-fns formats */ export function yearFromString(date: string) { return isValidDate(date) ? new Date(date).getUTCFullYear() : null; }