Use Cases

Claude Code के साथ Date और Time को सही तरीके से Handle करें

Claude Code का उपयोग करके handling date and time correctly सीखें। Practical code examples शामिल हैं।

日付・時बीचprocessingको Claude Code से正しくimplement करना

日付と時बीचのprocessingは、タイムゾーン、format、ロケールsupport आदि思わぬ落とし穴がज़्यादा領域 है।Claude Code का उपयोग करके、ベストプラクティスに沿ったrobustな日付processingをefficientlyimplementationでき है।

libraryの選択

> 日付・時बीचのprocessingutilityを作って。
> day.jsका उपयोग करके、タイムゾーン変換、相対時बीचdisplay、
> 日本語format、営業日計算をimplement करो。
  • day.js: 軽量(2KB)で Moment.js 互換のAPI
  • date-fns: functionベース、Tree-shakingに最適
  • Temporal API: 将来の標準API(まだ提案段階)

日付utilityのimplementation

// 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のプリセット
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でformat
 */
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営業日बादの日付 fetch
 */
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なしでも、ブラウザのIntlAPIで多くのformatがpossible है।

// src/lib/intl-date.ts

/**
 * Intl.DateTimeFormatを使った日付format
 */
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);
}

/**
 * दोの日付の差を人बीचが読める形式でdisplay
 */
export function formatDateRange(start: Date, end: Date): string {
  return new Intl.DateTimeFormat('en-US', {
    year: 'numeric',
    month: 'short',
    day: 'numeric',
  }).formatRange(start, end);
}

/**
 * 相対時बीचのformat
 */
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');
}

Reactcomponentでの利用

// 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分ごとにupdate
    return () => clearInterval(interval);
  }, [date]);

  return (
    <time dateTime={date} title={new Date(date).toLocaleString('en-US')}>
      {display}
    </time>
  );
}

よくある落とし穴

  • タイムゾーン未考慮: serverとclientでタイムゾーンが異なる場合、常にUTCで保存しclientで変換する
  • 夏時बीच: 日本にはないが、海बाहरusersupport時は要ध्यान
  • Date.parse()の挙動: ブラウザबीचで差異があるため、dayjs等でparseする

関連記事

国際化support全般はi18nimplementationガイド、通貨のformatは通貨formatのimplementationをreference के लिए देखें。

day.jsのofficial documentation(day.js.org)でpluginlist confirmでき है।

#Claude Code #日付 #タイムゾーン #day.js #Intl