.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年後の日付を求めるには?[C#、VB]
月初/月末の日付を求めるには?[C#、VB]
指定した日の曜日を取得するには?[C#/VB]
列挙体の値を列挙するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間