diff --git a/src/shared/components/person/profile.tsx b/src/shared/components/person/profile.tsx index 3ca1f605..9b29eafc 100644 --- a/src/shared/components/person/profile.tsx +++ b/src/shared/components/person/profile.tsx @@ -24,7 +24,7 @@ import { canMod } from "@utils/roles"; import type { QueryParams } from "@utils/types"; import { RouteDataResponse } from "@utils/types"; import classNames from "classnames"; -import { format, parseISO } from "date-fns"; +import { format } from "date-fns"; import { NoOptionI18nKeys } from "i18next"; import { Component, linkEvent } from "inferno"; import { Link } from "inferno-router"; @@ -99,6 +99,7 @@ import { PersonListing } from "./person-listing"; import { getHttpBaseInternal } from "../../utils/env"; import { IRoutePropsWithFetch } from "../../routes"; import { MediaUploads } from "../common/media-uploads"; +import { cakeDate } from "@utils/helpers"; type ProfileData = RouteDataResponse<{ personRes: GetPersonDetailsResponse; @@ -695,7 +696,7 @@ export class Profile extends Component { {I18NextService.i18n.t("cake_day_title")}{" "} - {format(parseISO(pv.person.published), "PPP")} + {format(cakeDate(pv.person.published), "PPP")} {!UserService.Instance.myUserInfo && ( diff --git a/src/shared/utils/helpers/index.ts b/src/shared/utils/helpers/index.ts index 58eec8cc..7b7c8940 100644 --- a/src/shared/utils/helpers/index.ts +++ b/src/shared/utils/helpers/index.ts @@ -13,7 +13,7 @@ import getUnixTime from "./get-unix-time"; import { groupBy } from "./group-by"; import hostname from "./hostname"; import hsl from "./hsl"; -import isCakeDay from "./is-cake-day"; +import isCakeDay, { cakeDate } from "./is-cake-day"; import numToSI from "./num-to-si"; import poll from "./poll"; import randomStr from "./random-str"; @@ -27,6 +27,7 @@ import dedupByProperty from "./dedup-by-property"; import getApubName from "./apub-name"; export { + cakeDate, capitalizeFirstLetter, debounce, editListImmutable, diff --git a/src/shared/utils/helpers/is-cake-day.ts b/src/shared/utils/helpers/is-cake-day.ts index 16aa031e..c575726f 100644 --- a/src/shared/utils/helpers/is-cake-day.ts +++ b/src/shared/utils/helpers/is-cake-day.ts @@ -1,11 +1,18 @@ -import { parseISO, getYear, getDayOfYear } from "date-fns"; +import { getYear, isSameDay, isSameYear, parse, setYear } from "date-fns"; + +// Returns a date in local time with the same year, month and day. Ignores the +// source timezone. The goal is to show the same date in all timezones. +export function cakeDate(published: string): Date { + return parse(published.substring(0, 10), "yyyy-MM-dd", new Date(0)); +} export default function isCakeDay(published: string): boolean { - const createDate = parseISO(published); + const createDate = cakeDate(published); const currentDate = new Date(); + // The day-overflow of Date makes leap days become 03-01 in non leap years. return ( - getDayOfYear(createDate) === getDayOfYear(currentDate) && - getYear(createDate) !== getYear(currentDate) + isSameDay(currentDate, setYear(createDate, getYear(currentDate))) && + !isSameYear(currentDate, createDate) ); }