mirror of
https://github.com/aculix/negotium.git
synced 2026-09-11 07:28:17 +00:00
feat: add date-key module with local-time formatting
Switches task keys to ISO YYYY-MM-DD. They sort, so finding every day before today is a string compare instead of re-parsing each key. Two things worth knowing. fromKey builds from date parts rather than parsing a bare ISO string, which gets read as UTC and lands on the wrong day west of Greenwich. addDays goes through setDate, so it stays on the same calendar day across a DST change instead of adding a flat 24 hours.
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
const KEY_PATTERN = /^\d{4}-\d{2}-\d{2}$/
|
||||
|
||||
/** A `Date` as a local-time `YYYY-MM-DD` key. Sortable, which is what the
|
||||
* rollover logic relies on to find every day earlier than today. */
|
||||
export function toKey(date) {
|
||||
const year = date.getFullYear()
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||||
const day = String(date.getDate()).padStart(2, '0')
|
||||
return `${year}-${month}-${day}`
|
||||
}
|
||||
|
||||
/** Local midnight for a key. Built from parts rather than `new Date(key)`,
|
||||
* which parses bare ISO dates as UTC and shifts the day west of Greenwich. */
|
||||
export function fromKey(key) {
|
||||
const [year, month, day] = key.split('-').map(Number)
|
||||
return new Date(year, month - 1, day)
|
||||
}
|
||||
|
||||
/** Goes through `setDate`, so it stays on the same calendar day across a DST
|
||||
* boundary rather than adding a fixed 24 hours. */
|
||||
export function addDays(date, amount) {
|
||||
const next = new Date(date.getTime())
|
||||
next.setDate(next.getDate() + amount)
|
||||
return next
|
||||
}
|
||||
|
||||
export function isKey(value) {
|
||||
return KEY_PATTERN.test(value)
|
||||
}
|
||||
|
||||
export function labelFor(dateKey, todayKey) {
|
||||
if (dateKey === todayKey) return 'Today'
|
||||
if (dateKey === toKey(addDays(fromKey(todayKey), 1))) return 'Tomorrow'
|
||||
return fromKey(dateKey).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
|
||||
}
|
||||
|
||||
export function formatLong(dateKey) {
|
||||
return fromKey(dateKey).toLocaleDateString('en-US', {
|
||||
weekday: 'long',
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user