diff --git a/src/TimeOfDay.test.ts b/src/TimeOfDay.test.ts new file mode 100644 index 0000000..530d9a8 --- /dev/null +++ b/src/TimeOfDay.test.ts @@ -0,0 +1,54 @@ +import {dayMsToDecimal, decimalToDayMs} from './TimeOfDay'; + +describe('dayMsToDecimal', () => { + it('works', () => { + const expected = {hour: 0, minute: 0, second: 0}; + let ms = 0; + + function hour() { + for (let i = 0; i < 10000; ++i) { + expect(dayMsToDecimal(ms++)).toStrictEqual(expected); + expect(dayMsToDecimal(ms)).toStrictEqual(expected); + ms += 862; + expect(dayMsToDecimal(ms++)).toStrictEqual(expected); + + if (++expected.second >= 100) { + expected.second = 0; + if (++expected.minute >= 100) { + expected.minute = 0; + ++expected.hour; + } + } + } + } + + hour(); + hour(); + expected.hour += 7; + ms += 864 * 10_000 * 7; + hour(); + + expect(ms).toStrictEqual(86_400_000); + expect(expected).toStrictEqual({hour: 10, minute: 0, second: 0}); + }); +}); + +describe('decimalToDayMs', () => { + it('works', () => { + function hour(hour: number) { + let expected = hour * 8_640_000; + + for (let minute = 0; minute < 100; ++minute) { + for (let second = 0; second < 100; ++second) { + expect(decimalToDayMs({hour, minute, second})).toStrictEqual(expected); + expected += 864; + } + } + + expect(expected).toEqual((hour + 1) * 8_640_000); + } + + hour(0); + hour(9); + }); +}) diff --git a/src/TimeOfDay.tsx b/src/TimeOfDay.tsx index abc086e..8e66715 100644 --- a/src/TimeOfDay.tsx +++ b/src/TimeOfDay.tsx @@ -17,10 +17,9 @@ function currentDayMs(): number { } export function dayMsToDecimal(dayMs: number): DecimalTimeStamp { - const dayFrac = dayMs / 86_400_000; - const hour = Math.floor(dayFrac * 10); - const minute = Math.floor(dayFrac * 10 % 1 * 100); - const second = Math.floor(dayFrac * 1000 % 1 * 100); + const second = Math.floor(dayMs / 864 % 100); + const minute = Math.floor(dayMs / 86_400 % 100); + const hour = Math.floor(dayMs / 8_640_000); return {hour, minute, second}; }