Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
| /** | |
| * Parse a backend timestamp as UTC. The API stores naive UTC datetimes that | |
| * serialize without a timezone suffix; without a trailing "Z" the browser would | |
| * wrongly read them as local time. `Date` then renders in the machine's timezone. | |
| */ | |
| export function parseUtc(iso: string): Date { | |
| const hasTz = /[zZ]|[+-]\d{2}:?\d{2}$/.test(iso); | |
| return new Date(hasTz ? iso : `${iso}Z`); | |
| } | |
| /** Human-friendly relative time ("just now", "5m ago", …) from a UTC timestamp. */ | |
| export function relTime(iso: string): string { | |
| const d = parseUtc(iso); | |
| const diff = (Date.now() - d.getTime()) / 1000; | |
| if (diff < 60) return "just now"; | |
| if (diff < 3600) return `${Math.floor(diff / 60)}m ago`; | |
| if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`; | |
| return d.toLocaleDateString(); | |
| } | |