Skip to content

Commit

Permalink
Fix leap year issue (#2453)
Browse files Browse the repository at this point in the history
* Fix leap year issue

* Show same cake day date independent of timezone (#2455)

* Show same cake day date independent of timezone

* Remove commented out assertions

---------

Co-authored-by: matc-pub <[email protected]>
  • Loading branch information
SleeplessOne1917 and matc-pub authored May 14, 2024
1 parent 0b35d4a commit d705f36
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 7 deletions.
5 changes: 3 additions & 2 deletions src/shared/components/person/profile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -695,7 +696,7 @@ export class Profile extends Component<ProfileRouteProps, ProfileState> {
<Icon icon="cake" />
<span className="ms-2">
{I18NextService.i18n.t("cake_day_title")}{" "}
{format(parseISO(pv.person.published), "PPP")}
{format(cakeDate(pv.person.published), "PPP")}
</span>
</div>
{!UserService.Instance.myUserInfo && (
Expand Down
3 changes: 2 additions & 1 deletion src/shared/utils/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -27,6 +27,7 @@ import dedupByProperty from "./dedup-by-property";
import getApubName from "./apub-name";

export {
cakeDate,
capitalizeFirstLetter,
debounce,
editListImmutable,
Expand Down
15 changes: 11 additions & 4 deletions src/shared/utils/helpers/is-cake-day.ts
Original file line number Diff line number Diff line change
@@ -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)
);
}

0 comments on commit d705f36

Please sign in to comment.