From c80101fde9a12bb19d3dc783c36c1b451251544d Mon Sep 17 00:00:00 2001 From: matc-pub <161147791+matc-pub@users.noreply.github.com> Date: Sun, 12 May 2024 17:53:29 +0200 Subject: [PATCH] Show same cake day date independent of timezone (#2455) * Show same cake day date independent of timezone * Remove commented out assertions --- src/shared/components/person/profile.tsx | 5 ++-- src/shared/utils/helpers/index.ts | 3 +- src/shared/utils/helpers/is-cake-day.ts | 36 +++++++----------------- 3 files changed, 15 insertions(+), 29 deletions(-) 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 dfa4cde8..c575726f 100644 --- a/src/shared/utils/helpers/is-cake-day.ts +++ b/src/shared/utils/helpers/is-cake-day.ts @@ -1,34 +1,18 @@ -import { parseISO, getYear, getDayOfYear, isLeapYear } from "date-fns"; +import { getYear, isSameDay, isSameYear, parse, setYear } from "date-fns"; -const leapDay = getDayOfYear(new Date(2024, 1, 29)); +// 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 createDateDayOfYear = getDayOfYear(createDate); - const isCreateDateLeapYear = isLeapYear(createDate); - + const createDate = cakeDate(published); const currentDate = new Date(); - let currentDateDayOfYear = getDayOfYear(currentDate); - const isCurrentDateLeapYear = isLeapYear(currentDate); - - if ( - isCreateDateLeapYear && - !isCurrentDateLeapYear && - currentDateDayOfYear >= leapDay - ) { - ++currentDateDayOfYear; - } - - if ( - !isCreateDateLeapYear && - isCurrentDateLeapYear && - createDateDayOfYear >= leapDay - ) { - --currentDateDayOfYear; - } + // The day-overflow of Date makes leap days become 03-01 in non leap years. return ( - createDateDayOfYear === currentDateDayOfYear && - getYear(createDate) !== getYear(currentDate) + isSameDay(currentDate, setYear(createDate, getYear(currentDate))) && + !isSameYear(currentDate, createDate) ); }