🌳
pt0/sharedF/langF/dur2HumanF.mts
1// import { DurationUnit } from 'luxon'
3import * as _ from 'lodash-es'
5type DurationUnit =
6 // | 'years' | 'quarters' | 'months' | 'weeks'
7 | 'days' | 'hours' | 'minutes' | 'seconds'// | 'milliseconds'
8// type DurTypeStr = DurationUnit
10const unitAbbrev : Partial<Record<DurationUnit, string>> = {
11 days: 'd',
12 hours: 'h',
13 minutes: 'm',
14 seconds: 's',
17export const dur2Human = (luxonDiff: LuxDuration): string => {
18 const sec = luxonDiff.as('seconds')
19 return (sec < 0 ? '-' : '+') + secToHumanAbs(sec)
22export const durHumanAbs = (luxonDiff: LuxDuration | undefined) => {
23 if (!luxonDiff) return luxonDiff
24 return secToHumanAbs(luxonDiff.as('seconds'))
27export const secToHumanAbs = (durSec: number): string => {
28 if (durSec < 0) {
29 durSec = Math.abs(durSec)
30 }
32 // const unitAbbrev = {
33 // days: 'notimportant',
34 // }
35 // Duration.fromMillis(1000).as(Object.keys(unitAbbrev)[0] as DurTypeStr)
36 const units = _.keys(unitAbbrev)
37 for(let i = 0; i < units.length; i += 1) {
38 const unit = units[i] as DurationUnit
39 const unitDurSec = LuxDuration.fromObject({[unit]: 1}).as('seconds')
41 if (unitDurSec <= durSec) {
42 const unitDur = _.round(LuxDuration.fromMillis(durSec * 1000).as(unit))
43 const abbrev = unitAbbrev[unit]
44 return `${unitDur}${abbrev}`
45 }
46 }
48 return '0s' // Default return to handle edge case when no condition is met