JavaScriptにおける日付計算のテクニック

1、前日の日付を取得する

// 現在の日付を取得
      const currentDate = new Date();
      // 日付を1日前に設定
      const prevDate = new Date(currentDate);
      prevDate.setDate(prevDate.getDate() - 1);
      // ISO形式の日付文字列に変換
      const formattedPrevDate = prevDate.toISOString().substring(0, 10);
      console.log(formattedPrevDate); // 例: "2023-04-03" (地域設定により形式が異なります)

2、先週の開始日と終了日を取得する

const now = new Date();
      const currentDay = now.getDay(); // 0(日曜)から6(土曜)
      // 先週の月曜日を計算
      const lastMonday = new Date(now);
      lastMonday.setDate(now.getDate() - currentDay - (currentDay === 0 ? 6 : 0));
      // 先週の日曜日を計算
      const lastSunday = new Date(lastMonday);
      lastSunday.setDate(lastMonday.getDate() + 6);
      
      console.log("先週の開始日:", lastMonday.toISOString().substring(0, 10));
      console.log("先週の終了日:", lastSunday.toISOString().substring(0, 10));

3、先月の開始日と終了日を取得する

      const today = new Date();
      const firstDayOfCurrentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
      const lastDayOfLastMonth = new Date(firstDayOfCurrentMonth);
      lastDayOfLastMonth.setDate(lastDayOfLastMonth.getDate() - 1);
      
      const firstDayOfLastMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1);
      
      // 日付をYYYY-MM-DD形式にフォーマット
      const formatStartDate = firstDayOfLastMonth.toISOString().split("T")[0];
      const formatEndDate = lastDayOfLastMonth.toISOString().split("T")[0];
      
      console.log('先月の開始日:', formatStartDate);
      console.log('先月の終了日:', formatEndDate);
   

4、JavaScriptの日付オブジェクト

// 現在の日時を持つDateオブジェクトを作成

const now = new Date();


// 年、月、日、時、分、秒を指定してDateオブジェクトを作成

// 注意:月は0から始まるため、0は1月、11は12月を表します

const customDate = new Date(2024, 10, 15, 12, 30, 0);


// 日付文字列からDateオブジェクトを作成

const parsedDate = new Date('2024-11-15T12:30:00');

Dateオブジェクトは、日時の各部分を取得および設定するためのメソッドを提供します:


const date = new Date();

const year = date.getFullYear(); // 年を取得

const month = date.getMonth() + 1; // 月を取得(+1が必要)

const day = date.getDate(); // 日を取得

const hours = date.getHours(); // 時間を取得

const minutes = date.getMinutes(); // 分を取得

const seconds = date.getSeconds(); // 秒を取得

5、2つの日付間の日数を計算する

2つの日付間の日数を計算するのは一般的な要件です。基本的なアプローチは、まず2つの日付のタイムスタンプ(1970年1月1日00:00:00 UTCからのミリ秒数)を取得し、その差を計算して、最後にその差を日数に変換することです。


function calculateDaysBetween(fromDate, toDate) {

  const millisecondsPerDay = 24 * 60 * 60 * 1000; // 1日のミリ秒数

  const firstTime = new Date(fromDate).getTime();

  const secondTime = new Date(toDate).getTime();

  const dayDifference = Math.round(Math.abs((firstTime - secondTime) / millisecondsPerDay));

  return dayDifference;

}


const startDay = '2024-11-01';

const endDay = '2024-11-10';

const numberOfDays = calculateDaysBetween(startDay, endDay);

console.log(`2つの日付の間は${numberOfDays}日です。`);

6、2つの日付間の月数と年数を計算する

2つの日付間の月数と年数を計算するのは、少し複雑で、月と年の変化を考慮する必要があります。


function calculateMonthsBetween(fromDate, toDate) {

  const startDate = new Date(fromDate);

  const endDate = new Date(toDate);

  let monthCount;

  monthCount = (endDate.getFullYear() - startDate.getFullYear()) * 12;

  monthCount -= startDate.getMonth();

  monthCount += endDate.getMonth();

  return monthCount <= 0 ? 0 : monthCount;

}


function calculateYearsBetween(fromDate, toDate) {

  const startDate = new Date(fromDate);

  const endDate = new Date(toDate);

  return endDate.getFullYear() - startDate.getFullYear();

}


const months = calculateMonthsBetween(startDay, endDay);

const years = calculateYearsBetween(startDay, endDay);

console.log(`2つの日付の間は${months}ヶ月です。`);

console.log(`2つの日付の間は${years}年です。`);

7、特定の日付が指定範囲内にあるかを判断する

特定の日付が指定された日付範囲内にあるかどうかを判断するには、その日付のタイムスタンプを範囲の両端の日付のタイムスタンプと比較することで実現できます。


function isDateWithinRange(checkDate, rangeStart, rangeEnd) {

  const targetTime = new Date(checkDate).getTime();

  const startTime = new Date(rangeStart).getTime();

  const endTime = new Date(rangeEnd).getTime();

  return targetTime >= startTime && targetTime <= endTime;

}


const testDate = '2024-11-05';

const inRange = isDateWithinRange(testDate, startDay, endDay);

console.log(`${testDate}は${startDay}から${endDay}の範囲内にありますか:${inRange}`);

8、実践的な応用例:イベント予約システム

イベント予約システムでは、ユーザーが選択した日付が予約可能な範囲内にあるかを確認し、予約期間を計算する必要があります。




<html lang="ja">


<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>イベント予約システム</title>

</head>


<body>

<label for="bookingStart">開始日:</label>

<input type="date" id="bookingStart">

<label for="bookingEnd">終了日:</label>

<input type="date" id="bookingEnd">

<button onclick="validateReservation()">予約を確認</button>

<p id="output"></p>


<script>

function calculateDays(from, to) {

const oneDayMs = 24 * 60 * 60 * 1000;

const fromTime = new Date(from).getTime();

const toTime = new Date(to).getTime();

const dayCount = Math.round(Math.abs((fromTime - toTime) / oneDayMs));

return dayCount;

}


function isDateValid(date, start, end) {

const checkTime = new Date(date).getTime();

const startTime = new Date(start).getTime();

const endTime = new Date(end).getTime();

return checkTime >= startTime && checkTime <= endTime;

}


function validateReservation() {

const reservationStart = document.getElementById('bookingStart').value;

const reservationEnd = document.getElementById('bookingEnd').value;

const availableFrom = '2024-11-01';

const availableTo = '2024-11-30';


if (isDateValid(reservationStart, availableFrom, availableTo) && isDateValid(reservationEnd, availableFrom, availableTo)) {

const duration = calculateDays(reservationStart, reservationEnd);

document.getElementById('output').textContent = `予約完了!期間は${duration}日間です。`;

} else {

document.getElementById('output').textContent = '選択された日付は予約可能な範囲外です。';

}

}

</script>

</body>


</html>

9、注意点

  • タイムゾールの問題:JavaScriptのDateオブジェクトは、日時を処理する際にローカルのタイムゾールの影響を受けます。タイムゾームをまたがる日付を処理する必要がある場合は、Intl.DateTimeFormatやサードパーティのライブラリ(moment.jsday.jsなど)を使用することをお勧めします。
  • 日付の形式:日付文字列からDateオブジェクトを作成する際は、日付形式が標準に準拠していることを確認してください。そうしないと、Dateオブジェクトの作成に失敗する可能性があります。

まとめ

JavaScriptのDateオブジェクトは、日時を処理する基本的な機能を提供してくれます。そのメソッドとプロパティを適切に活用することで、様々な日付範囲の計算要件を実現できます。実際の開発では、具体的なビジネスシナリオに基づいて適切な計算方法を選択し、タイムゾーンや日付形式の問題を処理することに注意してください。また、複雑な日付処理の要件については、サードパーティのライブラリを使用して開発プロセスを簡素化することも検討してください。本記事が、JavaScriptにおける日付計算の理解を深める一助となれば幸いです。

タグ: javascript 日付計算 Dateオブジェクト タイムスタンプ 日付フォーマット

7月19日 02:01 投稿