やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

時刻の比較

時刻の比較って結構使うんですが、よく忘れるのでメモ

いつも迷って調べるんですが、だいたいMSDNのDateTime.CompareToに飛ばされます。

あのメソッドってミリ秒単位で比較するんで結局ある程度整形した形で比較しないといけないんですよね。

比較するにしてもそれが秒単位の比較なのか日単位の比較なのか実装時に簡単に選べるといいんですが、そんな便利メソッドはありません(知りません)。

 

なので時刻同士を比較する拡張メソッドを作ってみました。

/// <summary>
/// 日時種別
/// </summary>
public enum DateTimeKind
{
    /// <summary></summary>
    Year,
    /// <summary></summary>
    Month,
    /// <summary></summary>
    Day,
    /// <summary>時間</summary>
    Hour,
    /// <summary></summary>
    Minute,
    /// <summary></summary>
    Second,
    /// <summary>ミリ秒</summary>
    Milliseconds,
}
 
/// <summary>
/// DateTime型の拡張メソッドを定義する。
/// </summary>
public static class DateTimeExtensions
{
    /// <summary>
    /// 現在のインスタンスと比較します。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <param name="compareKind">比較する時間の種別</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool Compare(this DateTime self, DateTime value, DateTimeKind compareKind)
    {
        var ts = self - value;
        double total = 0D;
        double sub = 1.0D;
 
        switch (compareKind)
        {
            case DateTimeKind.Year:
                total = self.Year - value.Year;
                break;
            case DateTimeKind.Month:
                sub = 30.0D;
                total = ts.TotalDays;
                break;
            case DateTimeKind.Day:
                total = ts.TotalDays;
                break;
            case DateTimeKind.Hour:
                total = ts.TotalHours;
                break;
            case DateTimeKind.Minute:
                total = ts.TotalMinutes;
                break;
            case DateTimeKind.Second:
                total = ts.TotalSeconds;
                break;
            case DateTimeKind.Milliseconds:
                total = ts.TotalMilliseconds;
                break;
        }
 
        return Math.Abs(total) < sub;
    }
 
    /// <summary>
    /// 現在のインスタンスと年を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareYear(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Year);
    }
 
    /// <summary>
    /// 現在のインスタンスと月を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareMonth(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Month);
    }
 
    /// <summary>
    /// 現在のインスタンスと日を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareDay(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Day);
    }
 
    /// <summary>
    /// 現在のインスタンスと時間を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareHour(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Hour);
    }
 
    /// <summary>
    /// 現在のインスタンスと分を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareMinute(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Minute);
    }
 
    /// <summary>
    /// 現在のインスタンスと秒を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareSecond(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Second);
    }
 
    /// <summary>
    /// 現在のインスタンスとミリ秒を比較する。
    /// </summary>
    /// <param name="self">自分自身</param>
    /// <param name="value">比較する値</param>
    /// <returns>比較結果(true:一致, false:不一致)</returns>
    public static bool CompareMillisecond(this DateTime self, DateTime value)
    {
        return self.Compare(value, DateTimeKind.Milliseconds);
    }
}

 

方法は単純

DateTime同士の差分TimeSpanのTotal○○を見て一致しているかどうかを判定しているだけです。(Compareメソッド

あとはそれぞれの比較メソッドを追加すれば、結構使いやすくなるんじゃないでしょうか?

 

使い方はこんな感じ。

private void Button_Click(object sender, RoutedEventArgs e)
{
    var now = DateTime.Now;
    var inputTime = DateTime.Parse(DateTimeTextBox.Text);
 
    if (!inputTime.CompareYear(now))
    {
        ConsoleLog.Write("年が異なる。");
    }
    if (!inputTime.CompareMonth(now))
    {
        ConsoleLog.Write("月が異なる。");
    }
    if (!inputTime.CompareDay(now))
    {
        ConsoleLog.Write("日が異なる。");
    }
    if (!inputTime.CompareHour(now))
    {
        ConsoleLog.Write("時間が異なる。");
    }
    if (!inputTime.CompareMinute(now))
    {
        ConsoleLog.Write("分が異なる。");
    }
    if (!inputTime.CompareSecond(now))
    {
        ConsoleLog.Write("秒が異なる。");
    }
 
}

 

今回のサンプルはこちら↓↓

github.com