Handling Date and Time Correctly dengan Claude Code
Learn about handling date and time correctly using Claude Code. Includes practical code examples.
日付・時間pemrosesan dengan Claude Code: 正しくimplementasi
日付 dan 時間 pemrosesan 、タイムゾーン、format、ロケールdukungan dll.思わぬ落 dan し穴 多い領域.Claude Code 使えば、best practices 沿ったrobustな日付pemrosesan efisien implementasi bisa dilakukan.
選択 library
> 日付・時間 pemrosesanutilitas buatkan.
> day.js 使って、タイムゾーンkonversi、相対時間tampilan、
> 日本語format、営業日計算 implementasikan.
- day.js: 軽量(2KB) Moment.js 互換 API
- date-fns: fungsiベース、Tree-shaking 最適
- Temporal API: 将来 標準API(まだ提案段階)
implementasi 日付utilitas
// src/lib/date-utils.ts
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import relativeTime from 'dayjs/plugin/relativeTime';
import 'dayjs/locale/ja';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(relativeTime);
dayjs.locale('ja');
// デフォルトタイムゾーン
const DEFAULT_TZ = 'Asia/Tokyo';
// format preset
export const DATE_FORMATS = {
full: 'YYYY年M月D日(ddd) HH:mm',
date: 'YYYY年M月D日',
dateShort: 'M/D',
time: 'HH:mm',
iso: 'YYYY-MM-DDTHH:mm:ssZ',
api: 'YYYY-MM-DD',
} as const;
/**
* UTCの日付文字列をJSTでフォーマット
*/
export function formatDate(
date: string | Date,
format: keyof typeof DATE_FORMATS = 'date'
): string {
return dayjs(date).tz(DEFAULT_TZ).format(DATE_FORMATS[format]);
}
/**
* 相対時間を返す(「3分前」「2時間前」「昨日」など)
*/
export function timeAgo(date: string | Date): string {
const d = dayjs(date);
const now = dayjs();
const diffHours = now.diff(d, 'hour');
if (diffHours < 1) {
const diffMinutes = now.diff(d, 'minute');
if (diffMinutes < 1) return 'たった今';
return `${diffMinutes}分前`;
}
if (diffHours < 24) return `${diffHours}時間前`;
if (diffHours < 48) return '昨日';
if (diffHours < 168) return `${Math.floor(diffHours / 24)}日前`;
return formatDate(date, 'date');
}
/**
* タイムゾーン変換
*/
export function convertTimezone(
date: string | Date,
fromTz: string,
toTz: string
): dayjs.Dayjs {
return dayjs.tz(date, fromTz).tz(toTz);
}
/**
* 営業日かどうかを判定
*/
export function isBusinessDay(date: string | Date): boolean {
const d = dayjs(date);
const dayOfWeek = d.day();
return dayOfWeek !== 0 && dayOfWeek !== 6; // 日曜=0, 土曜=6
}
/**
* N営業日後の日付を取得
*/
export function addBusinessDays(date: string | Date, days: number): dayjs.Dayjs {
let current = dayjs(date);
let remaining = days;
while (remaining > 0) {
current = current.add(1, 'day');
if (isBusinessDay(current.toDate())) {
remaining--;
}
}
return current;
}
Intl APIによるネイティブformat
libraryなし juga 、browser IntlAPI 多く format dimungkinkan.
// src/lib/intl-date.ts
/**
* Intl.DateTimeFormatを使った日付フォーマット
*/
export function formatDateIntl(date: Date, style: 'long' | 'short' = 'long'): string {
return new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: style === 'long' ? 'long' : 'numeric',
day: 'numeric',
weekday: style === 'long' ? 'short' : undefined,
}).format(date);
}
/**
* 2つの日付の差を人間が読める形式で表示
*/
export function formatDateRange(start: Date, end: Date): string {
return new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'short',
day: 'numeric',
}).formatRange(start, end);
}
/**
* 相対時間のフォーマット
*/
export function formatRelative(date: Date): string {
const rtf = new Intl.RelativeTimeFormat('ja', { numeric: 'auto' });
const now = new Date();
const diffMs = date.getTime() - now.getTime();
const diffSec = Math.round(diffMs / 1000);
const diffMin = Math.round(diffSec / 60);
const diffHour = Math.round(diffMin / 60);
const diffDay = Math.round(diffHour / 24);
if (Math.abs(diffSec) < 60) return rtf.format(diffSec, 'second');
if (Math.abs(diffMin) < 60) return rtf.format(diffMin, 'minute');
if (Math.abs(diffHour) < 24) return rtf.format(diffHour, 'hour');
return rtf.format(diffDay, 'day');
}
Penggunaan dalam Komponen React
// src/components/TimeDisplay.tsx
'use client';
import { useState, useEffect } from 'react';
import { timeAgo } from '@/lib/date-utils';
export function TimeDisplay({ date }: { date: string }) {
const [display, setDisplay] = useState(timeAgo(date));
useEffect(() => {
const interval = setInterval(() => {
setDisplay(timeAgo(date));
}, 60000); // 1分ご dan pembaruan
return () => clearInterval(interval);
}, [date]);
return (
<time dateTime={date} title={new Date(date).toLocaleString('en-US')}>
{display}
</time>
);
}
よくある落とし穴
- タイムゾーン未考慮: server dan client タイムゾーン 異なる場合、常 UTC penyimpananしclient konversi
- 夏時間: 日本 tidak 、海外penggunadukungan時 要注意
- Date.parse() 挙動: browser間 差異 ada untuk 、dayjs等 パース
Artikel Terkait
国際化dukungan全般 i18nimplementasipanduan、通貨 format 通貨format implementasi 参考 .
day.js 公式dokumen(day.js.org) plugindaftar konfirmasi bisa dilakukan.
Related Posts
Cara Mempercepat Side Project dengan Claude Code [Dengan Contoh]
Pelajari cara mempercepat project development personal secara drastis menggunakan Claude Code. Dilengkapi contoh nyata dan workflow praktis dari ide hingga deployment.
Cara Mengotomatisasi Refactoring dengan Claude Code
Pelajari cara mengotomatisasi code refactoring secara efisien menggunakan Claude Code. Dilengkapi prompt praktis dan pola refactoring konkret untuk project nyata.
Panduan Lengkap Konfigurasi CORS dengan Claude Code
Pelajari tentang panduan lengkap konfigurasi CORS menggunakan Claude Code. Dilengkapi tips praktis dan contoh kode.