LoginSignup
30
26

More than 5 years have passed since last update.

C#のDateTime型に月初日や月末日を取得するメソッドを追加する

Last updated at Posted at 2014-03-26

業務用のアプリケーションを作成していると、何かと日付の比較をすることが多くて、その中である年月の月初日や月末日が必要になることもままあります。

残念ながらc#のDateTime型には月初日や月末日を求めるメソッドは用意されていないので、サンプルコードのような日時関連の処理をまとめた拡張メソッドを作って利用してます。

サンプルコード

DateTimeUtil.cs
/// <summary>
/// DateTime型拡張メソッド定義
/// </summary>
public static class DateTimeUtil
{
    private static readonly int FiscalYearStartingMonth = 4;

    /// <summary>
    /// 該当年月の日数を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>DateTime</returns>
    public static int DaysInMonth(this DateTime dt)
    {
        return DateTime.DaysInMonth(dt.Year, dt.Month);
    }

    /// <summary>
    /// 月初日を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>Datetime</returns>
    public static DateTime BeginOfMonth(this DateTime dt)
    {
        return dt.AddDays((dt.Day - 1) * -1);
    }

    /// <summary>
    /// 月末日を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>DateTime</returns>
    public static DateTime EndOfMonth(this DateTime dt)
    {
        return new DateTime(dt.Year, dt.Month, DaysInMonth(dt));
    }

    /// <summary>
    /// 時刻を落として日付のみにする
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <returns>DateTime</returns>
    public static DateTime StripTime(this DateTime dt)
    {
        return new DateTime(dt.Year, dt.Month, dt.Day);
    }

    /// <summary>
    /// 日付を落として時刻のみにする
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <param name="base_date">DateTime* : 基準日</param>
    /// <returns>DateTime</returns>
    public static DateTime StripDate(this DateTime dt, DateTime? base_date = null)
    {
        base_date = base_date ?? DateTime.MinValue;
        return new DateTime(base_date.Value.Year, base_date.Value.Month, base_date.Value.Day, dt.Hour, dt.Minute, dt.Second);
    }

    /// <summary>
    /// 該当日付の年度を返す
    /// </summary>
    /// <param name="dt">DateTime</param>
    /// <param name="startingMonth">int? : 年度の開始月</param>
    /// <returns>int</returns>
    public static int FiscalYear(this DateTime dt, int? startingMonth = null)
    {
        return (dt.Month >= (startingMonth ?? FiscalYearStartingMonth)) ? dt.Year : dt.Year - 1;
    }
}
program.cs
class Program
{
    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;

        Console.WriteLine("現在時刻は{0:yyyy年MM月dd日HH時mm分ss秒}です。", now);
        Console.WriteLine("月初日:{0:yyyy年MM月dd日}", now.BeginOfMonth());
        Console.WriteLine("月末日:{0:yyyy年MM月dd日}", now.EndOfMonth());
        Console.WriteLine("今月は{0}日あります。", now.DaysInMonth());
        Console.WriteLine("{0}年度", now.FiscalYear());
        Console.WriteLine("日付のみにする:{0:yyyy年MM月dd日HH時mm分ss秒}です。", now.StripTime());
        Console.WriteLine("時刻のみにする:{0:yyyy年MM月dd日HH時mm分ss秒}です。", now.StripDate());

    }
}

実行結果の例

DateTimeTest.exe
現在時刻は2014年03月19日11時19分08秒です。
月初日:2014年03月01日
月末日:2014年03月31日
今月は31日あります。
2013年度
日付のみにする:2014年03月19日00時00分00秒です。
時刻のみにする:0001年01月01日11時19分08秒です。

30
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
26