added timezone settings

This commit is contained in:
dohsimpson
2025-01-01 22:38:45 -05:00
parent 3ac67ca413
commit 11ea0ff89e
17 changed files with 251 additions and 15 deletions

View File

@@ -58,6 +58,9 @@ export const getDefaultSettings = (): Settings => ({
ui: {
useNumberFormatting: true,
useGrouping: true,
},
system: {
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
}
});
@@ -77,6 +80,11 @@ export interface UISettings {
useGrouping: boolean;
}
export interface SystemSettings {
timezone: string;
}
export interface Settings {
ui: UISettings;
system: SystemSettings;
}

50
lib/utils.test.ts Normal file
View File

@@ -0,0 +1,50 @@
import { expect, test, describe, beforeAll, afterAll } from "bun:test";
import { cn, getDateInTimezone, getTodayInTimezone } from './utils'
describe('cn utility', () => {
test('should merge class names correctly', () => {
expect(cn('foo', 'bar')).toBe('foo bar')
expect(cn('foo', { bar: true })).toBe('foo bar')
expect(cn('foo', { bar: false })).toBe('foo')
expect(cn('foo', ['bar', 'baz'])).toBe('foo bar baz')
})
})
describe('timezone utilities', () => {
describe('getDateInTimezone', () => {
test('should convert date to specified timezone', () => {
const date = new Date('2024-01-01T00:00:00Z')
// Test with specific timezones
const nyDate = getDateInTimezone(date, 'America/New_York')
expect(nyDate.toISOString()).toBe('2023-12-31T19:00:00.000Z') // NY is UTC-5
const tokyoDate = getDateInTimezone(date, 'Asia/Tokyo')
expect(tokyoDate.toISOString()).toBe('2024-01-01T09:00:00.000Z') // Tokyo is UTC+9
})
test('should handle string dates', () => {
const dateStr = '2024-01-01T00:00:00Z'
const nyDate = getDateInTimezone(dateStr, 'America/New_York')
expect(nyDate.toISOString()).toBe('2023-12-31T19:00:00.000Z')
})
})
describe('getTodayInTimezone', () => {
let originalDate: Date;
beforeAll(() => {
originalDate = new Date();
globalThis.Date.now = () => new Date('2024-01-01T00:00:00Z').getTime();
})
afterAll(() => {
globalThis.Date.now = () => originalDate.getTime();
})
test('should return today in YYYY-MM-DD format for timezone', () => {
expect(getTodayInTimezone('America/New_York')).toBe('2023-12-31')
expect(getTodayInTimezone('Asia/Tokyo')).toBe('2024-01-01')
})
})
})

View File

@@ -1,6 +1,16 @@
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
import moment from "moment-timezone"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
export function getDateInTimezone(date: Date | string, timezone: string): Date {
const m = moment.tz(date, timezone);
return new Date(m.format('YYYY-MM-DDTHH:mm:ss.SSS[Z]'));
}
export function getTodayInTimezone(timezone: string): string {
return moment.tz(timezone).format('YYYY-MM-DD');
}