Handle non-numeric timestamps

This commit is contained in:
Sam Becker 2024-01-07 22:47:09 -06:00
parent 95be04f185
commit 8efe9529e3
3 changed files with 52 additions and 5 deletions

View File

@ -13,6 +13,7 @@
"exiftool", "exiftool",
"favs", "favs",
"ghijklmnopqrstuv", "ghijklmnopqrstuv",
"Hasselblad",
"hgetall", "hgetall",
"hset", "hset",
"Lightbox", "Lightbox",

33
__tests__/date.test.ts Normal file
View File

@ -0,0 +1,33 @@
import {
convertTimestampToNaivePostgresString,
convertTimestampWithOffsetToPostgresString,
} from '../src/utility/date';
describe('Date utility', () => {
describe('parses ambiguous timestamps', () => {
it('iPhone 15 Pro', () => {
const timestamp = 1704641450;
const offset = '-06:00';
expect(convertTimestampWithOffsetToPostgresString(timestamp, offset))
.toBe('2024-01-07T21:30:50.000Z');
expect(convertTimestampToNaivePostgresString(timestamp))
.toBe('2024-01-07 15:30:50');
});
it('Fujifilm X-T5', () => {
const timestamp = 1698086000;
const offset = '-05:00';
expect(convertTimestampWithOffsetToPostgresString(timestamp, offset))
.toBe('2023-10-23T23:33:20.000Z');
expect(convertTimestampToNaivePostgresString(timestamp))
.toBe('2023-10-23 18:33:20');
});
it('Hasselblad X2D 100C', () => {
const timestamp = '2023-12-02T16:38:36';
const offset = '+00:00';
expect(convertTimestampWithOffsetToPostgresString(timestamp, offset))
.toBe('2023-12-02T16:38:36.000Z');
expect(convertTimestampToNaivePostgresString(timestamp))
.toBe('2023-12-02 16:38:36');
});
});
});

View File

@ -4,6 +4,8 @@ const DATE_STRING_FORMAT_SHORT = 'dd MMM yyyy';
const DATE_STRING_FORMAT = 'd MMM yyyy h:mma'; const DATE_STRING_FORMAT = 'd MMM yyyy h:mma';
const DATE_STRING_FORMAT_POSTGRES = 'yyyy-MM-dd HH:mm:ss'; const DATE_STRING_FORMAT_POSTGRES = 'yyyy-MM-dd HH:mm:ss';
type AmbiguousTimestamp = number | string;
export const formatDate = (date: Date, short?: boolean) => export const formatDate = (date: Date, short?: boolean) =>
format(date, short? DATE_STRING_FORMAT_SHORT : DATE_STRING_FORMAT); format(date, short? DATE_STRING_FORMAT_SHORT : DATE_STRING_FORMAT);
@ -16,10 +18,19 @@ export const formatDateForPostgres = (date: Date) =>
'$1-$2-$3 $4', '$1-$2-$3 $4',
); );
const dateFromTimestamp = (timestamp?: number) => const dateFromTimestamp = (timestamp?: AmbiguousTimestamp): Date =>
timestamp !== undefined ? new Date(timestamp * 1000) : new Date(); typeof timestamp === 'number'
? new Date(timestamp * 1000)
: typeof timestamp === 'string'
? /.+Z/i.test(timestamp)
? new Date(timestamp)
: new Date(`${timestamp}Z`)
: new Date();
const createNaiveDateWithOffset = (timestamp?: number, offset = '+00:00') => { const createNaiveDateWithOffset = (
timestamp?: AmbiguousTimestamp,
offset = '+00:00',
) => {
const date = dateFromTimestamp(timestamp); const date = dateFromTimestamp(timestamp);
const dateString = `${date.toISOString()}`.replace(/\.[\d]+Z/, offset); const dateString = `${date.toISOString()}`.replace(/\.[\d]+Z/, offset);
return parseISO(dateString); return parseISO(dateString);
@ -28,12 +39,14 @@ const createNaiveDateWithOffset = (timestamp?: number, offset = '+00:00') => {
// Run on the server, when there are date/timestamp/offset inputs // Run on the server, when there are date/timestamp/offset inputs
export const convertTimestampWithOffsetToPostgresString = ( export const convertTimestampWithOffsetToPostgresString = (
timestamp?: number, timestamp?: AmbiguousTimestamp,
offset?: string, offset?: string,
) => ) =>
formatDateForPostgres(createNaiveDateWithOffset(timestamp, offset)); formatDateForPostgres(createNaiveDateWithOffset(timestamp, offset));
export const convertTimestampToNaivePostgresString = (timestamp?: number) => export const convertTimestampToNaivePostgresString = (
timestamp?: AmbiguousTimestamp,
) =>
dateFromTimestamp(timestamp) dateFromTimestamp(timestamp)
.toISOString().replace( .toISOString().replace(
/(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(.[\d]+Z)*/, /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(.[\d]+Z)*/,