- {formatDateString(session.modified)}
+
+ {formatMessageTimestamp(Date.parse(session.modified) / 1000)}
+
diff --git a/ui/desktop/src/components/sessions/SessionViewComponents.tsx b/ui/desktop/src/components/sessions/SessionViewComponents.tsx
index cf19e2a7..978d67d4 100644
--- a/ui/desktop/src/components/sessions/SessionViewComponents.tsx
+++ b/ui/desktop/src/components/sessions/SessionViewComponents.tsx
@@ -8,31 +8,7 @@ import MarkdownContent from '../MarkdownContent';
import ToolCallWithResponse from '../ToolCallWithResponse';
import { ToolRequestMessageContent, ToolResponseMessageContent } from '../../types/message';
import { type Message } from '../../types/message';
-
-/**
- * Format a timestamp into a human-readable date string
- */
-export const formatDate = (timestamp: number) => {
- const date = new Date(timestamp * 1000);
-
- const getOrdinal = (n: number) => {
- const s = ['th', 'st', 'nd', 'rd'];
- const v = n % 100;
- return n + (s[(v - 20) % 10] || s[v] || s[0]);
- };
-
- const hours = date.toLocaleTimeString('en-US', {
- hour: 'numeric',
- minute: '2-digit',
- hour12: true,
- });
-
- const month = date.toLocaleString('en-US', { month: 'short' });
- const day = getOrdinal(date.getDate());
- const year = date.getFullYear();
-
- return `${hours}, ${month} ${day}, ${year}`;
-};
+import { formatMessageTimestamp } from '../../utils/timeUtils';
/**
* Get tool responses map from messages
@@ -166,7 +142,7 @@ export const SessionMessages: React.FC = ({
{message.role === 'user' ? 'You' : 'Goose'}
- {new Date(message.created * 1000).toLocaleTimeString()}
+ {formatMessageTimestamp(message.created)}
diff --git a/ui/desktop/src/components/sessions/SharedSessionView.tsx b/ui/desktop/src/components/sessions/SharedSessionView.tsx
index 16761eca..a9155c20 100644
--- a/ui/desktop/src/components/sessions/SharedSessionView.tsx
+++ b/ui/desktop/src/components/sessions/SharedSessionView.tsx
@@ -1,7 +1,8 @@
import React from 'react';
import { Calendar, MessageSquareText, Folder, Target } from 'lucide-react';
import { type SharedSessionDetails } from '../../sharedSessions';
-import { SessionHeaderCard, SessionMessages, formatDate } from './SessionViewComponents';
+import { SessionHeaderCard, SessionMessages } from './SessionViewComponents';
+import { formatMessageTimestamp } from '../../utils/timeUtils';
interface SharedSessionViewProps {
session: SharedSessionDetails | null;
@@ -32,7 +33,7 @@ const SharedSessionView: React.FC
= ({
- {formatDate(session.messages[0]?.created)}
+ {formatMessageTimestamp(session.messages[0]?.created)}
diff --git a/ui/desktop/src/utils/timeUtils.ts b/ui/desktop/src/utils/timeUtils.ts
new file mode 100644
index 00000000..2625e796
--- /dev/null
+++ b/ui/desktop/src/utils/timeUtils.ts
@@ -0,0 +1,30 @@
+export function formatMessageTimestamp(timestamp: number): string {
+ // Convert from Unix timestamp (seconds) to milliseconds
+ const date = new Date(timestamp * 1000);
+ const now = new Date();
+
+ // Format time as HH:MM AM/PM
+ const timeStr = date.toLocaleTimeString('en-US', {
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: true,
+ });
+
+ // Check if the message is from today
+ if (
+ date.getDate() === now.getDate() &&
+ date.getMonth() === now.getMonth() &&
+ date.getFullYear() === now.getFullYear()
+ ) {
+ return timeStr;
+ }
+
+ // If not today, format as MM/DD/YYYY HH:MM AM/PM
+ const dateStr = date.toLocaleDateString('en-US', {
+ month: '2-digit',
+ day: '2-digit',
+ year: 'numeric',
+ });
+
+ return `${dateStr} ${timeStr}`;
+}