@@ -20,6 +20,30 @@ export function formatDate(dateString) {
2020 } ) ;
2121}
2222
23+ /**
24+ * 다음 리뷰 날짜 포맷팅 (월/일/시:분)
25+ * @param {string } dateString - ISO 형식 날짜 문자열
26+ * @returns {string } 포맷된 날짜 문자열 (예: "3월 6일 09:00")
27+ */
28+ export function formatNextReviewDate ( dateString ) {
29+ // 타임존 정보가 없으면 UTC로 가정 (서버 버그 방어)
30+ const hasTimezone = / Z $ | [ + - ] \d { 2 } : \d { 2 } $ / . test ( dateString ) ;
31+ const normalized = hasTimezone ? dateString : dateString + 'Z' ;
32+
33+ const date = new Date ( normalized ) ;
34+ const parts = new Intl . DateTimeFormat ( 'ko-KR' , {
35+ month : 'numeric' ,
36+ day : 'numeric' ,
37+ hour : '2-digit' ,
38+ minute : '2-digit' ,
39+ hour12 : false ,
40+ // timeZone 미지정 → 브라우저 로컬 타임존 자동 사용 (글로벌 대응)
41+ } ) . formatToParts ( date ) ;
42+
43+ const get = ( type ) => parts . find ( p => p . type === type ) . value ;
44+ return `${ get ( 'month' ) } 월 ${ get ( 'day' ) } 일 ${ get ( 'hour' ) } :${ get ( 'minute' ) } ` ;
45+ }
46+
2347/**
2448 * 이메일 형식 검증
2549 * @param {string } email - 검증할 이메일
@@ -28,4 +52,37 @@ export function formatDate(dateString) {
2852export function isValidEmail ( email ) {
2953 const emailRegex = / ^ [ ^ \s @ ] + @ [ ^ \s @ ] + \. [ ^ \s @ ] + $ / ;
3054 return emailRegex . test ( email ) ;
31- }
55+ }
56+
57+ /**
58+ * UTC 시간 문자열 → 로컬 HH:MM 변환
59+ * 예: "00:00:00" (UTC) → "09:00" (서울 UTC+9)
60+ * @param {string } utcTimeString - "HH:MM:SS" 형식의 UTC 시간 문자열
61+ * @returns {string } 로컬 시간 "HH:MM" 문자열
62+ */
63+ export function utcTimeStringToLocal ( utcTimeString ) {
64+ const [ h , m ] = utcTimeString . split ( ':' ) ;
65+ const today = new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ;
66+ const utcDate = new Date ( `${ today } T${ h } :${ m } :00Z` ) ;
67+ return utcDate . toLocaleTimeString ( 'ko-KR' , {
68+ hour : '2-digit' ,
69+ minute : '2-digit' ,
70+ hour12 : false
71+ } ) ;
72+ }
73+
74+ /**
75+ * 로컬 HH:MM → UTC [hour, minute] 배열 변환
76+ * 예: "09:00" (서울 UTC+9) → [0, 0] (UTC)
77+ * @param {string } localTimeString - "HH:MM" 형식의 로컬 시간 문자열
78+ * @returns {number[] } UTC 기준 [hour, minute] 배열
79+ */
80+ export function localTimeStringToUtcArray ( localTimeString ) {
81+ const [ h , m ] = localTimeString . split ( ':' ) . map ( Number ) ;
82+ const today = new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ;
83+ // 타임존 suffix 없는 형식은 로컬 시간으로 파싱됨 (ECMAScript 표준)
84+ const localDate = new Date (
85+ `${ today } T${ String ( h ) . padStart ( 2 , '0' ) } :${ String ( m ) . padStart ( 2 , '0' ) } :00`
86+ ) ;
87+ return [ localDate . getUTCHours ( ) , localDate . getUTCMinutes ( ) ] ;
88+ }
0 commit comments