/** * Copyright (c) 2020 TypeFox GmbH. All rights reserved. * Licensed under the GNU Affero General Public License (AGPL). * See License-AGPL.txt in the project root for license information. */ /** * Returns the dayth of the next month from formDate. * If the next month does not have a dayth, the last day of that * month is taken. * The time is copied from fromDate. * * @param fromDate * @param day */ export function oneMonthLater(fromDate: string, day?: number): string { const later = new Date(fromDate); day = day || later.getDate(); const fromMonth = later.getMonth(); later.setDate(day); later.setMonth(later.getMonth() + 1); if (later.getMonth() - fromMonth > 1) { later.setDate(0); } return later.toISOString(); } export const yearsLater = (fromDate: string, years: number): string => liftDate1(fromDate, (d) => { d.setUTCFullYear(d.getUTCFullYear() + years); return d.toISOString(); }); // tslint:disable-next-line:no-shadowed-variable export const addMillis = (d1: string, millis: number) => liftDate1(d1, (d1) => new Date(d1.getTime() + millis).toISOString()); export const durationInHours = (d1: string, d2: string) => liftDate(d1, d2, (d1, d2) => millisecondsToHours(d1.getTime() - d2.getTime())); export const durationInMillis = (d1: string, d2: string) => liftDate(d1, d2, (d1, d2) => d1.getTime() - d2.getTime()); // tslint:disable-next-line:no-shadowed-variable export const isDateGreaterOrEqual = (d1: string, d2: string): boolean => liftDate(d1, d2, (d1, d2) => d1.getTime() >= d2.getTime()); export const isDateSmallerOrEqual = (d1: string, d2: string | undefined) => !d2 || d1 <= d2; export const isDateSmaller = (d1: string, d2: string | undefined) => !d2 || d1 < d2; export const oldest = (d1: string, d2: string): string => d1 > d2 ? d1 : d2; export const earliest = (d1: string, d2: string): string => d1 < d2 ? d1 : d2; export const orderAsc = (d1: string, d2: string): number => liftDate(d1, d2, (d1, d2) => d1.getTime() - d2.getTime()); export const liftDate1 = (d1: string, f: (d1: Date) => T): T => f(new Date(d1)); export const liftDate = (d1: string, d2: string, f: (d1: Date, d2: Date) => T): T => f(new Date(d1), new Date(d2)); export function hoursLater(date: string, hours: number): string { const result = new Date(date) result.setHours(result.getHours() + hours) return result.toISOString(); } export function secondsBefore(date: string, seconds: number): string { return new Date(new Date(date).getTime() - seconds * 1000).toISOString(); } export function rightAfter(date: string): string { return new Date(new Date(date).getTime() + 1).toISOString(); } export function rightBefore(date: string): string { return new Date(new Date(date).getTime() - 1).toISOString(); } export function millisecondsToHours(milliseconds: number): number { return milliseconds / 1000 / 60 / 60; } export function hoursToMilliseconds(hours: number): number { return hours * 60 * 60 * 1000; }