fp/services/next/app/lib/dates.ts

58 lines
1.8 KiB
TypeScript

import { parse } from 'date-fns';
import { format } from 'date-fns-tz'
import { toZonedTime, fromZonedTime } from 'date-fns-tz'
const safeDateFormatString: string = "yyyyMMdd'T'HHmmss'Z'"
const localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
export function getSafeDate(date: string | Date): string {
let dateString: string;
if (!date) throw new Error(`date passed to getSafeDate() was falsy`);
if (typeof date === 'string') {
const dateObject = toZonedTime(date, 'UTC');
dateString = format(dateObject, safeDateFormatString, { timeZone: 'UTC' });
} else {
dateString = format(date, safeDateFormatString, { timeZone: 'UTC' });
}
return dateString;
}
export function getDateFromSafeDate(safeDate: string): Date {
const date = parse(safeDate, safeDateFormatString, new Date())
const utcDate = fromZonedTime(date, 'UTC')
return utcDate;
}
export function formatTimestamp(seconds: number = 0): string {
return new Date(seconds * 1000).toISOString().slice(11, 19);
}
export function formatUrlTimestamp(timestampInSeconds: number): string {
const hours = Math.floor(timestampInSeconds / 3600);
const minutes = Math.floor((timestampInSeconds % 3600) / 60);
const seconds = timestampInSeconds % 60;
return `${hours}h${minutes}m${seconds}s`;
}
export function parseUrlTimestamp(timestamp: string): number | null {
// Regular expression to match the "XhYmZs" format
const regex = /^(\d+)h(\d+)m(\d+)s$/;
const match = timestamp.match(regex);
if (match) {
const hours = parseInt(match[1], 10);
const minutes = parseInt(match[2], 10);
const seconds = parseInt(match[3], 10);
if (!isNaN(hours) && !isNaN(minutes) && !isNaN(seconds)) {
return hours * 3600 + minutes * 60 + seconds;
}
}
// If the format doesn't match or parsing fails, return null
return null;
}