Skip to content

Commit b0348ba

Browse files
authored
[fix] 간식나눔 시간 포맷 변경
[fix] 간식나눔 시간 포맷 변경
2 parents b73e763 + fe94936 commit b0348ba

3 files changed

Lines changed: 59 additions & 8 deletions

File tree

src/app/(auth-required)/ticketing/[eventId]/page.tsx

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import UserInfoModal from '@/components/modals/ticketing/UserInfoModal';
99
import { fetchClient } from '@/api/clients/fetchClient';
1010
import { FetchSnackDetailResponse, TicketEvent } from '@/interfaces/SnackEvent';
1111
import { formatDateTimeWithDay } from '@/utils/date';
12+
import { convertToKoreanDate } from '@/utils/convertToKoreanDate';
13+
1214

1315
export default function SnackDetail() {
1416
const router = useRouter();
@@ -55,6 +57,34 @@ export default function SnackDetail() {
5557
}
5658
};
5759

60+
// "2025.10.15 (Wed) 12:00" 같은 문자열을 로컬시간으로 파싱 → ms
61+
const parseBackendLocalMs = (raw: string): number | null => {
62+
if (!raw) return null;
63+
64+
// 괄호 속 요일(영/한) 제거: (Mon|Tue|...|Sun|월|화|수|목|금|토|일)
65+
const cleaned = raw.replace(
66+
/\s*\((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun|||||||)\)\s*/i,
67+
' '
68+
).trim();
69+
70+
// 기대 포맷: YYYY.MM.DD HH:mm 또는 YYYY-MM-DD HH:mm
71+
const m = cleaned.match(
72+
/^(\d{4})[.\-](\d{2})[.\-](\d{2})\s+(\d{2}):(\d{2})$/
73+
);
74+
75+
if (m) {
76+
const [, y, mo, d, hh, mm] = m.map(Number);
77+
// 로컬(KST) 기준 Date 생성
78+
const dt = new Date(y, mo - 1, d, hh, mm, 0, 0);
79+
return dt.getTime();
80+
}
81+
82+
// 혹시 다른 변형이 와도 마지막으로 Date.parse 시도
83+
const fallback = Date.parse(cleaned);
84+
return Number.isNaN(fallback) ? null : fallback;
85+
};
86+
87+
5888
// --- SSE 구독: 재고 실시간 업데이트 + 서버 시각 보정 ---------------------------------
5989
useEffect(() => {
6090
if (!idStr) return;
@@ -157,7 +187,13 @@ export default function SnackDetail() {
157187
if (!eventData) return;
158188

159189
const updateTicketStatus = () => {
160-
const ticketMs = new Date(eventData.eventTime).getTime();
190+
const ticketMs = parseBackendLocalMs(eventData.eventTime);
191+
if (ticketMs === null) {
192+
console.warn('[TIME] eventTime 파싱 실패:', eventData.eventTime);
193+
setTicketStatus('closed');
194+
return;
195+
}
196+
161197
const nowMs = Date.now() + serverOffsetRef.current; // 서버 시간 보정
162198
const diffMs = ticketMs - nowMs;
163199

@@ -229,11 +265,17 @@ export default function SnackDetail() {
229265
const handleTicketClick = async () => {
230266
if (!eventData) return;
231267

232-
const ticketMs = new Date(eventData.eventTime).getTime();
233-
const nowAdj = Date.now() + serverOffsetRef.current;
234-
const diff = ticketMs - nowAdj;
268+
const ticketMs = parseBackendLocalMs(eventData.eventTime);
269+
if (ticketMs === null) {
270+
alert('이벤트 시작 시간을 해석할 수 없습니다. 잠시 후 다시 시도해주세요.');
271+
return;
272+
}
273+
274+
const nowAdj = Date.now() + serverOffsetRef.current;
275+
const diff = ticketMs - nowAdj;
235276

236-
const safetyMs = 300; // 경계 보호용 버퍼
277+
const safetyMs = 300; // 경계 보호용 버퍼
278+
237279
if (diff > safetyMs) {
238280
console.log(`[TICKET] too early by ${diff}ms (safety ${safetyMs})`);
239281
alert('오픈까지 잠시만 기다려주세요!');
@@ -350,11 +392,11 @@ export default function SnackDetail() {
350392
{isSelected === 'info' && (
351393
<>
352394
<div className="font-bold text-[14px] mb-2">{eventData.eventTitle}</div>
353-
<div>일시: {formatDateTimeWithDay(eventData.eventEndTime)}</div>
395+
<div>일시: {convertToKoreanDate(eventData.eventEndTime)}</div>
354396
<div>장소: {eventData.locationInfo}</div>
355397
<div>대상: {eventData.target}</div>
356398
<div>수량: {eventData.quantity}</div>
357-
<div>티켓팅 시작 시간: {formatDateTimeWithDay(eventData.eventTime)}</div>
399+
<div>티켓팅 시작 시간: {convertToKoreanDate(eventData.eventTime)}</div>
358400
<div className="text-black/50 self-center mt-[18px]">{eventData.description}</div>
359401
<a href={eventData.promotionLink} className="text-[#0D99FF] mt-[18px]">학생회 간식나눔 홍보글 링크</a>
360402
<div className="self-end text-[#AEAEAE]">문의: {eventData.inquiryNumber}</div>

src/app/(auth-required)/ticketing/result/TicketingResultInner.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import CancelModal from '@/components/modals/ticketing/CancelModal';
1010
import { formatDateTimeWithDay } from '@/utils/date';
1111
import { fetchClient } from '@/api/clients/fetchClient';
1212
import { TicketInfo } from '@/interfaces/SnackEvent';
13+
import { convertToKoreanDate } from '@/utils/convertToKoreanDate';
1314

1415
export default function TicketingResultInner() {
1516
const searchParams = useSearchParams();
@@ -95,7 +96,7 @@ export default function TicketingResultInner() {
9596

9697
<div className="fixed bottom-[50px] left-0 w-full px-4 bg-white pb-[35px] flex flex-col items-center">
9798
<div className="text-[11px] text-center text-[#FF2525] font-normal">
98-
{formatDateTimeWithDay(extendedEndTime.toISOString())}까지 오지 않으면
99+
{convertToKoreanDate("2025.10.15 (Wed) 12:30")}까지 오지 않으면
99100
티켓이 자동 취소돼요.
100101
<br /> 그 전에 꼭 방문해 주세요!
101102
</div>

src/utils/convertToKoreanDate.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// utils/convertToKoreanDate.ts
2+
export function convertToKoreanDate(dateStr: string): string {
3+
if (!dateStr) return '';
4+
const map: Record<string, string> = {
5+
Mon: '월', Tue: '화', Wed: '수', Thu: '목', Fri: '금', Sat: '토', Sun: '일',
6+
};
7+
return dateStr.replace(/\((Mon|Tue|Wed|Thu|Fri|Sat|Sun)\)/, (_, eng) => `(${map[eng]})`);
8+
}

0 commit comments

Comments
 (0)