ENH - clock app

This commit is contained in:
Eichenholz
2026-08-04 10:58:04 +02:00
parent c955e31e63
commit dfc358f85a
11 changed files with 707 additions and 284 deletions
+13 -1
View File
@@ -1,9 +1,21 @@
import { describe, expect, it } from 'vitest'
import { elapsedMilliseconds, remainingMilliseconds } from './clock'
import {
elapsedMilliseconds,
formatTimer,
remainingMilliseconds,
timerPickerMilliseconds,
timerPickerValue,
} from './clock'
describe('timestamp clocks', () => {
it('derives elapsed and remaining time without an interval state', () => {
expect(elapsedMilliseconds(500, 1000, 2500)).toBe(2000)
expect(remainingMilliseconds(5000, 1000, 2500)).toBe(3500)
expect(remainingMilliseconds(100, 1000, 2500)).toBe(0)
})
it('formats and parses timer durations with hours, minutes, and seconds', () => {
expect(formatTimer(3_661_000)).toBe('01:01:01')
expect(timerPickerValue(3_661_000)).toBe('01:01:01')
expect(timerPickerMilliseconds('01:01:01')).toBe(3_661_000)
})
})
+18 -2
View File
@@ -27,7 +27,23 @@ export function formatStopwatch(milliseconds: number): string {
export function formatTimer(milliseconds: number): string {
const totalSeconds = Math.ceil(milliseconds / 1000)
const minutes = Math.floor(totalSeconds / 60)
const hours = Math.floor(totalSeconds / 3600)
const minutes = Math.floor((totalSeconds % 3600) / 60)
const seconds = totalSeconds % 60
return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`
return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`
}
export function timerPickerValue(milliseconds: number): string {
const totalSeconds = Math.floor(milliseconds / 1000)
const hours = Math.floor(totalSeconds / 3600)
const minutes = Math.floor((totalSeconds % 3600) / 60)
const seconds = totalSeconds % 60
return [hours, minutes, seconds]
.map((value) => String(value).padStart(2, '0'))
.join(':')
}
export function timerPickerMilliseconds(value: string): number {
const [hours = 0, minutes = 0, seconds = 0] = value.split(':').map(Number)
return (hours * 3600 + minutes * 60 + seconds) * 1000
}