get a little more accurate with month length (#3981)

* get a little more accurate with month length

* create some wiggle room, create some specific tests

* update more tests
zio/stable
Hailey 2024-05-13 08:39:34 -07:00 committed by GitHub
parent 73d094c67e
commit 5cd4ac3a34
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 57 additions and 6 deletions

View File

@ -143,6 +143,10 @@ describe('makeRecordUri', () => {
}) })
describe('ago', () => { describe('ago', () => {
const oneYearDate = new Date(
new Date().setMonth(new Date().getMonth() - 11),
).setDate(new Date().getDate() - 28)
const inputs = [ const inputs = [
1671461038, 1671461038,
'04 Dec 1995 00:12:00 GMT', '04 Dec 1995 00:12:00 GMT',
@ -151,7 +155,32 @@ describe('ago', () => {
new Date().setMinutes(new Date().getMinutes() - 10), new Date().setMinutes(new Date().getMinutes() - 10),
new Date().setHours(new Date().getHours() - 1), new Date().setHours(new Date().getHours() - 1),
new Date().setDate(new Date().getDate() - 1), new Date().setDate(new Date().getDate() - 1),
new Date().setDate(new Date().getDate() - 20),
new Date().setDate(new Date().getDate() - 25),
new Date().setDate(new Date().getDate() - 28),
new Date().setDate(new Date().getDate() - 29),
new Date().setDate(new Date().getDate() - 30),
new Date().setMonth(new Date().getMonth() - 1), new Date().setMonth(new Date().getMonth() - 1),
new Date(new Date().setMonth(new Date().getMonth() - 1)).setDate(
new Date().getDate() - 20,
),
new Date(new Date().setMonth(new Date().getMonth() - 1)).setDate(
new Date().getDate() - 25,
),
new Date(new Date().setMonth(new Date().getMonth() - 1)).setDate(
new Date().getDate() - 28,
),
new Date(new Date().setMonth(new Date().getMonth() - 1)).setDate(
new Date().getDate() - 29,
),
new Date().setMonth(new Date().getMonth() - 11),
new Date(new Date().setMonth(new Date().getMonth() - 11)).setDate(
new Date().getDate() - 20,
),
new Date(new Date().setMonth(new Date().getMonth() - 11)).setDate(
new Date().getDate() - 25,
),
oneYearDate,
] ]
const outputs = [ const outputs = [
new Date(1671461038).toLocaleDateString(), new Date(1671461038).toLocaleDateString(),
@ -161,7 +190,20 @@ describe('ago', () => {
'10m', '10m',
'1h', '1h',
'1d', '1d',
'20d',
'25d',
'28d',
'29d',
'1mo', '1mo',
'1mo',
'1mo',
'1mo',
'2mo',
'2mo',
'11mo',
'11mo',
'11mo',
new Date(oneYearDate).toLocaleDateString(),
] ]
it('correctly calculates how much time passed, in a string', () => { it('correctly calculates how much time passed, in a string', () => {

View File

@ -2,8 +2,8 @@ const NOW = 5
const MINUTE = 60 const MINUTE = 60
const HOUR = MINUTE * 60 const HOUR = MINUTE * 60
const DAY = HOUR * 24 const DAY = HOUR * 24
const MONTH = DAY * 28 const MONTH_30 = DAY * 30
const YEAR = DAY * 365 const MONTH = DAY * 30.41675 // This results in 365.001 days in a year, which is close enough for nearly all cases
export function ago(date: number | string | Date): string { export function ago(date: number | string | Date): string {
let ts: number let ts: number
if (typeof date === 'string') { if (typeof date === 'string') {
@ -22,14 +22,23 @@ export function ago(date: number | string | Date): string {
return `${Math.floor(diffSeconds / MINUTE)}m` return `${Math.floor(diffSeconds / MINUTE)}m`
} else if (diffSeconds < DAY) { } else if (diffSeconds < DAY) {
return `${Math.floor(diffSeconds / HOUR)}h` return `${Math.floor(diffSeconds / HOUR)}h`
} else if (diffSeconds < MONTH) { } else if (diffSeconds < MONTH_30) {
return `${Math.round(diffSeconds / DAY)}d` return `${Math.round(diffSeconds / DAY)}d`
} else if (diffSeconds < YEAR) { } else {
return `${Math.floor(diffSeconds / MONTH)}mo` let months = diffSeconds / MONTH
if (months % 1 >= 0.9) {
months = Math.ceil(months)
} else {
months = Math.floor(months)
}
if (months < 12) {
return `${months}mo`
} else { } else {
return new Date(ts).toLocaleDateString() return new Date(ts).toLocaleDateString()
} }
} }
}
export function niceDate(date: number | string | Date) { export function niceDate(date: number | string | Date) {
const d = new Date(date) const d = new Date(date)