.NET TIPS

週の始まりの日付を求めるには?

デジタルアドバンテージ 遠藤 孝信
2005/10/28

 週単位の処理を行う場合などでは、今週の月曜日の日付といった、特定の日付を含んだ週の始まりの日付(通常はその週の日曜日あるいは月曜日の日付)が必要になることがある。本稿ではこのような週の始まりの日付の求め方について解説する。

DateTime構造体のDayOfWeekプロパティとDayOfWeek列挙体

 .NETでは、特定の日付の日時情報はDateTime構造体(System名前空間)により表され、その日付の曜日をDayOfWeekプロパティにより取得できる。このプロパティの値は、DayOfWeek列挙体(System名前空間)の値となる。

 DayOfWeek列挙体にはすべての曜日が定義されており、そのメンバは次に示すように日曜日を示す0から土曜日を示す6までの値を持っている。

public enum DayOfWeek {
  Sunday = 0,
  Monday = 1,
  Tuesday = 2,
  Wednesday = 3,
  Thursday = 4,
  Friday = 5,
  Saturday = 6
}
DayOfWeek列挙体の定義(C#)

 このように、DayOfWeek列挙体の値は連続した数値として定義されているため、特定の日付の曜日の値をその日付から引き算することで、週の始まりの日付を求めることができる。このような処理を行うメソッドとその使用例を以下に示す。

// firstday.cs

using System;

public class FirstDayOfWeek {

  // 日曜日始まりの場合
  public static DateTime FirstDayOfThisWeek(DateTime d) {
    return d.AddDays(DayOfWeek.Sunday - d.DayOfWeek);
  }

  // 月曜日始まりの場合
  public static DateTime FirstDayOfThisWeek2(DateTime d) {
    int diff = DayOfWeek.Monday - d.DayOfWeek;
    if (diff > 0)
      diff -= 7;
    return d.AddDays(diff);
  }

  static void Main() {
    DateTime today, sunday, monday;

    today = DateTime.Parse("2005/10/28"); // 木曜日

    sunday = FirstDayOfThisWeek(today);
    Console.WriteLine(sunday); // 出力:2005/10/23 0:00:00

    monday = FirstDayOfThisWeek2(today);
    Console.WriteLine(monday); // 出力:2005/10/24 0:00:00

    today = DateTime.Parse("2005/10/30"); // 日曜日

    sunday = FirstDayOfThisWeek(today);
    Console.WriteLine(sunday); // 出力:2005/10/30 0:00:00

    monday = FirstDayOfThisWeek2(today);
    Console.WriteLine(monday); // 出力:2005/10/24 0:00:00
  }
}

// コンパイル方法:csc firstday.cs
週の始まりの日付を求めるC#のサンプル・プログラム(firstday.cs)
 
' firstday.vb

Imports System

Public Class FirstDayOfWeek

  ' 日曜日始まりの場合
  Shared Public Function FirstDayOfThisWeek(d As DateTime) As DateTime
    Return d.AddDays(DayOfWeek.Sunday - d.DayOfWeek)
  End Function

  ' 月曜日始まりの場合
  Public Shared Function FirstDayOfThisWeek2(d As DateTime) As DateTime
    Dim diff As Integer = DayOfWeek.Monday - d.DayOfWeek
    If diff > 0 Then
      diff -= 7
    End If
    Return d.AddDays(diff)
  End Function

  Shared Sub Main()
    Dim today, sunday, monday As DateTime

    today = DateTime.Parse("2005/10/28") ' 木曜日

    sunday = FirstDayOfThisWeek(today)
    Console.WriteLine(sunday) ' 出力:2005/10/23 0:00:00

    monday = FirstDayOfThisWeek2(today)
    Console.WriteLine(monday) ' 出力:2005/10/24 0:00:00

    today = DateTime.Parse("2005/10/30") ' 日曜日

    sunday = FirstDayOfThisWeek(today)
    Console.WriteLine(sunday) ' 出力:2005/10/30 0:00:00

    monday = FirstDayOfThisWeek2(today)
    Console.WriteLine(monday) ' 出力:2005/10/24 0:00:00
  End Sub
End Class

' コンパイル方法:vbc firstday.vb
週の始まりの日付を求めるVB.NETのサンプル・プログラム(firstday.vb)

 特定の日付に対して日数を加減算するには、DateTime構造体のAddDaysメソッドが利用できる。週の終わりの日付を求めたければ、上記のようにして得た日付に対してAddDays(6)を実行すればよい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:DateTime構造体(System名前空間)
使用ライブラリ:DayOfWeek列挙体(System名前空間)

この記事と関連性の高い別の.NET TIPS
指定した月から特定の曜日の日付を取得するには?
n日後、nカ月後、n年後の日付を求めるには?
[ASP.NET]Calendarコントロールのセルに任意のデータを埋め込むには?
列挙体の値を列挙するには?
DateTimePickerコントロールでDBNullを扱うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH