use iso & utc dates

AuthorKonata <konata@posteo.jp>
Date
Commita0b441f8aaa438242d3b69730681fd4b35d435be
Parent7e2e62e
10 files changed, 55 insertions(+), 37 deletions(-)
Asrc/lib/formatDate.ts
@@ -0,0 +1,32 @@
1+export function formatDate(iso: string): string {
2+ try {
3+ return new Intl.DateTimeFormat("en-CA", {
4+ timeZone: "UTC",
5+ year: "numeric",
6+ month: "2-digit",
7+ day: "2-digit",
8+ }).format(new Date(iso));
9+ } catch {
10+ return iso;
11+ }
12+}
13+
14+export function formatDateTime(iso: string): string {
15+ try {
16+ const parts = new Intl.DateTimeFormat("en-CA", {
17+ timeZone: "UTC",
18+ year: "numeric",
19+ month: "2-digit",
20+ day: "2-digit",
21+ hour: "2-digit",
22+ minute: "2-digit",
23+ second: "2-digit",
24+ hour12: false,
25+ }).formatToParts(new Date(iso));
26+ const get = (type: string) =>
27+ parts.find((p) => p.type === type)?.value ?? "";
28+ return `${get("year")}-${get("month")}-${get("day")} ${get("hour")}:${get("minute")}:${get("second")} UTC`;
29+ } catch {
30+ return iso;
31+ }
32+}
Msrc/views/DateWithEdited.tsx
@@ -1,3 +1,5 @@
1+import { formatDate, formatDateTime } from "../lib/formatDate.ts";
2+
13 export function DateWithEdited({
24 date,
35 editedAt,
@@ -5,13 +7,13 @@ export function DateWithEdited({
57 date: string;
68 editedAt: string | null;
79 }) {
8- const label = new Date(date).toLocaleDateString();
10+ const label = formatDate(date);
911 if (!editedAt) return <time datetime={date}>{label}</time>;
1012 return (
1113 <time
1214 datetime={date}
1315 class="edited-indicator"
14- title={`Edited ${new Date(editedAt).toLocaleString()}`}
16+ title={`Edited ${formatDateTime(editedAt)}`}
1517 >
1618 *{label}
1719 </time>
Msrc/views/Settings.tsx
@@ -1,3 +1,4 @@
1+import { formatDate } from "../lib/formatDate.ts";
12 import type { SessionUser } from "../middleware/session.ts";
23 import { Avatar } from "./Avatar.tsx";
34 import { Layout } from "./layout.tsx";
@@ -283,9 +284,7 @@ export function Settings({
283284 <div class="passkey-item">
284285 <span class="passkey-date">
285286 Added{" "}
286- {new Date(
287- pk.created_at,
288- ).toLocaleDateString()}
287+ {formatDate(pk.created_at)}
289288 </span>
290289 <form
291290 method="POST"
@@ -352,9 +351,7 @@ export function Settings({
352351 </span>
353352 <span class="passkey-date">
354353 Added{" "}
355- {new Date(
356- key.created_at,
357- ).toLocaleDateString()}
354+ {formatDate(key.created_at)}
358355 </span>
359356 </div>
360357 <form
Msrc/views/issues/IssueList.tsx
@@ -1,4 +1,5 @@
11 import type { IssueRow, RepositoryRow } from "../../db/index.ts";
2+import { formatDate } from "../../lib/formatDate.ts";
23 import { displayName } from "../../lib/users.ts";
34 import type { SessionUser } from "../../middleware/session.ts";
45 import { Avatar } from "../Avatar.tsx";
@@ -106,9 +107,7 @@ export function IssueList({
106107 {displayName(issue.author_username)}
107108 </span>
108109 <time datetime={issue.created_at}>
109- {new Date(
110- issue.created_at,
111- ).toLocaleDateString()}
110+ {formatDate(issue.created_at)}
112111 </time>
113112 </div>
114113 </li>
Msrc/views/patches/PatchList.tsx
@@ -1,4 +1,5 @@
11 import type { PatchRow, RepositoryRow } from "../../db/index.ts";
2+import { formatDate } from "../../lib/formatDate.ts";
23 import { displayName } from "../../lib/users.ts";
34 import type { SessionUser } from "../../middleware/session.ts";
45 import { Avatar } from "../Avatar.tsx";
@@ -103,9 +104,7 @@ export function PatchList({
103104 by {displayName(patch.author_username)}
104105 </span>
105106 <time datetime={patch.created_at}>
106- {new Date(
107- patch.created_at,
108- ).toLocaleDateString()}
107+ {formatDate(patch.created_at)}
109108 </time>
110109 </div>
111110 </li>
Msrc/views/releases/ReleaseDetail.tsx
@@ -3,6 +3,7 @@ import type {
33 ReleaseRow,
44 RepositoryRow,
55 } from "../../db/index.ts";
6+import { formatDate } from "../../lib/formatDate.ts";
67 import type { SessionUser } from "../../middleware/session.ts";
78 import { Layout } from "../layout.tsx";
89 import { RepoHeader } from "../repos/RepoHeader.tsx";
@@ -72,9 +73,7 @@ export function ReleaseDetail({
7273 <div class="release-item-date">
7374 <span class="badge">{release.tag_name}</span>
7475 <time datetime={release.created_at}>
75- {new Date(
76- release.created_at,
77- ).toLocaleDateString()}
76+ {formatDate(release.created_at)}
7877 </time>
7978 </div>
8079 </div>
Msrc/views/releases/ReleaseList.tsx
@@ -1,4 +1,5 @@
11 import type { ReleaseRow, RepositoryRow } from "../../db/index.ts";
2+import { formatDate } from "../../lib/formatDate.ts";
23 import type { SessionUser } from "../../middleware/session.ts";
34 import {
45 markdownToPlaintext,
@@ -97,9 +98,7 @@ export function ReleaseList({
9798 {release.tag_name}
9899 </span>
99100 <time datetime={release.created_at}>
100- {new Date(
101- release.created_at,
102- ).toLocaleDateString()}
101+ {formatDate(release.created_at)}
103102 </time>
104103 </div>
105104 </div>
Msrc/views/repos/CommitDetail.tsx
@@ -1,5 +1,6 @@
11 import { escapeHtml } from "@kitajs/html";
22 import type { RepositoryRow } from "../../db/index.ts";
3+import { formatDateTime } from "../../lib/formatDate.ts";
34 import type { SessionUser } from "../../middleware/session.ts";
45 import type { RenderedDiffFile } from "../../services/diffHighlight.ts";
56 import type { CommitMeta } from "../../services/git.ts";
@@ -16,17 +17,6 @@ interface CommitDetailProps {
1617 files: RenderedDiffFile[];
1718 }
1819
19-function formatDate(iso: string): string {
20- try {
21- return new Date(iso).toLocaleString(undefined, {
22- dateStyle: "medium",
23- timeStyle: "short",
24- });
25- } catch {
26- return iso;
27- }
28-}
29-
3020 export function CommitDetail({
3121 user,
3222 repo,
@@ -76,7 +66,7 @@ export function CommitDetail({
7666 class="commit-meta-value"
7767 datetime={meta.date}
7868 >
79- {formatDate(meta.date)}
69+ {formatDateTime(meta.date)}
8070 </time>
8171 </div>
8272 {(meta.committer !== meta.author ||
@@ -100,7 +90,7 @@ export function CommitDetail({
10090 class="commit-meta-value"
10191 datetime={meta.committerDate}
10292 >
103- {formatDate(meta.committerDate)}
93+ {formatDateTime(meta.committerDate)}
10494 </time>
10595 </div>
10696 </>
Msrc/views/repos/CommitLog.tsx
@@ -1,4 +1,6 @@
11 import type { RepositoryRow } from "../../db/index.ts";
2+import { formatDateTime } from "../../lib/formatDate.ts";
3+
24 import type { SessionUser } from "../../middleware/session.ts";
35 import type { CommitEntry } from "../../services/git.ts";
46 import { Layout } from "../layout.tsx";
@@ -66,7 +68,7 @@ export function CommitLog({
6668 {c.hash.slice(0, 7)}
6769 </a>
6870 <time class="commit-date" datetime={c.date}>
69- {new Date(c.date).toLocaleString()}
71+ {formatDateTime(c.date)}
7072 </time>
7173 </div>
7274 </li>
Msrc/views/repos/RepoList.tsx
@@ -1,4 +1,5 @@
11 import type { RepositoryRow } from "../../db/index.ts";
2+import { formatDate } from "../../lib/formatDate.ts";
23 import type { SessionUser } from "../../middleware/session.ts";
34 import { Layout } from "../layout.tsx";
45 import { Pagination, type PaginationInfo } from "../Pagination.tsx";
@@ -76,9 +77,7 @@ export function RepoList({ user, repos, search, pagination }: RepoListProps) {
7677 class="repo-date"
7778 datetime={repo.created_at}
7879 >
79- {new Date(
80- repo.created_at,
81- ).toLocaleDateString()}
80+ {formatDate(repo.created_at)}
8281 </time>
8382 </div>
8483 </li>