Fix date format after sync
The date and time format was incorrect after syncing data from the cloud. This commit addresses the issue.
This commit is contained in:
8
package-lock.json
generated
8
package-lock.json
generated
@@ -46,7 +46,7 @@
|
|||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"cmdk": "^1.0.0",
|
"cmdk": "^1.0.0",
|
||||||
"date-fns": "^3.6.0",
|
"date-fns": "^4.1.0",
|
||||||
"embla-carousel-react": "^8.3.0",
|
"embla-carousel-react": "^8.3.0",
|
||||||
"input-otp": "^1.2.4",
|
"input-otp": "^1.2.4",
|
||||||
"lucide-react": "^0.462.0",
|
"lucide-react": "^0.462.0",
|
||||||
@@ -4581,9 +4581,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/date-fns": {
|
"node_modules/date-fns": {
|
||||||
"version": "3.6.0",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
|
||||||
"integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
|
"integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "github",
|
"type": "github",
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"cmdk": "^1.0.0",
|
"cmdk": "^1.0.0",
|
||||||
"date-fns": "^3.6.0",
|
"date-fns": "^4.1.0",
|
||||||
"embla-carousel-react": "^8.3.0",
|
"embla-carousel-react": "^8.3.0",
|
||||||
"input-otp": "^1.2.4",
|
"input-otp": "^1.2.4",
|
||||||
"lucide-react": "^0.462.0",
|
"lucide-react": "^0.462.0",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import { formatISO } from 'date-fns';
|
import { formatISO, parseISO, isValid } from 'date-fns';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 날짜 문자열을 ISO 형식으로 변환하는 함수
|
* 날짜 문자열을 ISO 형식으로 변환하는 함수
|
||||||
@@ -12,7 +12,7 @@ export const normalizeDate = (dateStr: string): string => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// "오늘"라는 표현이 있으면 현재 날짜로 변환
|
// "오늘"이라는 표현이 있으면 현재 날짜로 변환
|
||||||
if (dateStr.includes('오늘')) {
|
if (dateStr.includes('오늘')) {
|
||||||
const today = new Date();
|
const today = new Date();
|
||||||
|
|
||||||
@@ -28,10 +28,47 @@ export const normalizeDate = (dateStr: string): string => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 일반 날짜 문자열은 그대로 Date 객체로 변환 시도
|
// 일반 날짜 문자열은 그대로 Date 객체로 변환 시도
|
||||||
return formatISO(new Date(dateStr));
|
const date = new Date(dateStr);
|
||||||
|
if (isValid(date)) {
|
||||||
|
return formatISO(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 변환 실패 시 현재 시간 반환
|
||||||
|
console.warn(`날짜 변환 오류: "${dateStr}"를 ISO 형식으로 변환할 수 없습니다.`);
|
||||||
|
return formatISO(new Date());
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn(`날짜 변환 오류: "${dateStr}"를 ISO 형식으로 변환할 수 없습니다.`, error);
|
console.error(`날짜 변환 오류: "${dateStr}"를 ISO 형식으로 변환할 수 없습니다.`, error);
|
||||||
// 오류 발생 시 현재 시간 반환 (데이터 손실 방지)
|
// 오류 발생 시 현재 시간 반환 (데이터 손실 방지)
|
||||||
return formatISO(new Date());
|
return formatISO(new Date());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ISO 형식의 날짜 문자열을 사용자 친화적인 형식으로 변환
|
||||||
|
*/
|
||||||
|
export const formatDateForDisplay = (isoDateStr: string): string => {
|
||||||
|
try {
|
||||||
|
// 유효한 ISO 날짜인지 확인
|
||||||
|
const date = parseISO(isoDateStr);
|
||||||
|
if (!isValid(date)) {
|
||||||
|
return isoDateStr; // 유효하지 않으면 원본 반환
|
||||||
|
}
|
||||||
|
|
||||||
|
// 현재 날짜와 비교
|
||||||
|
const today = new Date();
|
||||||
|
const isToday =
|
||||||
|
date.getDate() === today.getDate() &&
|
||||||
|
date.getMonth() === today.getMonth() &&
|
||||||
|
date.getFullYear() === today.getFullYear();
|
||||||
|
|
||||||
|
if (isToday) {
|
||||||
|
return `오늘, ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 그 외의 경우 YYYY년 MM월 DD일 형식으로 반환
|
||||||
|
return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일 ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('날짜 포맷 변환 오류:', error);
|
||||||
|
return isoDateStr; // 오류 발생 시 원본 반환
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { supabase } from '@/lib/supabase';
|
import { supabase } from '@/lib/supabase';
|
||||||
import { Transaction } from '@/components/TransactionCard';
|
import { Transaction } from '@/components/TransactionCard';
|
||||||
import { isSyncEnabled } from '../syncSettings';
|
import { isSyncEnabled } from '../syncSettings';
|
||||||
|
import { formatDateForDisplay } from './dateUtils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Download transaction data from Supabase to local storage
|
* Download transaction data from Supabase to local storage
|
||||||
@@ -34,9 +35,10 @@ export const downloadTransactions = async (userId: string): Promise<void> => {
|
|||||||
id: t.transaction_id || t.id,
|
id: t.transaction_id || t.id,
|
||||||
title: t.title,
|
title: t.title,
|
||||||
amount: t.amount,
|
amount: t.amount,
|
||||||
date: t.date,
|
date: t.date ? formatDateForDisplay(t.date) : '날짜 없음',
|
||||||
category: t.category,
|
category: t.category,
|
||||||
type: t.type
|
type: t.type,
|
||||||
|
notes: t.notes
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// 기존 로컬 데이터 불러오기
|
// 기존 로컬 데이터 불러오기
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ export const uploadTransactions = async (userId: string): Promise<void> => {
|
|||||||
date: normalizedDate, // 정규화된 날짜 사용
|
date: normalizedDate, // 정규화된 날짜 사용
|
||||||
category: t.category,
|
category: t.category,
|
||||||
type: t.type,
|
type: t.type,
|
||||||
transaction_id: t.id
|
transaction_id: t.id,
|
||||||
|
notes: t.notes || null
|
||||||
};
|
};
|
||||||
|
|
||||||
if (existingIds.has(t.id)) {
|
if (existingIds.has(t.id)) {
|
||||||
@@ -76,6 +77,8 @@ export const uploadTransactions = async (userId: string): Promise<void> => {
|
|||||||
// 기존 트랜잭션 업데이트 (있는 경우)
|
// 기존 트랜잭션 업데이트 (있는 경우)
|
||||||
if (updateTransactions.length > 0) {
|
if (updateTransactions.length > 0) {
|
||||||
console.log(`${updateTransactions.length}개의 기존 트랜잭션 업데이트`);
|
console.log(`${updateTransactions.length}개의 기존 트랜잭션 업데이트`);
|
||||||
|
|
||||||
|
// 각 트랜잭션을 개별적으로 업데이트
|
||||||
for (const transaction of updateTransactions) {
|
for (const transaction of updateTransactions) {
|
||||||
const { error: updateError } = await supabase
|
const { error: updateError } = await supabase
|
||||||
.from('transactions')
|
.from('transactions')
|
||||||
@@ -84,7 +87,7 @@ export const uploadTransactions = async (userId: string): Promise<void> => {
|
|||||||
.eq('user_id', userId);
|
.eq('user_id', userId);
|
||||||
|
|
||||||
if (updateError) {
|
if (updateError) {
|
||||||
console.error('트랜잭션 업데이트 실패:', updateError);
|
console.error('트랜잭션 업데이트 실패:', updateError, transaction);
|
||||||
// 실패해도 계속 진행
|
// 실패해도 계속 진행
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user