65.9K
CodeProject 正在变化。 阅读更多。
Home

部分 DateTime 对象相等性

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (13投票s)

2011年1月19日

CPOL
viewsIcon

33097

确定指定的日期/时间属性是否相等

在撰写一篇未来文章时,我意识到我需要能够基于我选择的任何属性来比较两个 DateTime 对象。换句话说,如果我想查看两个 DateTime 对象是否具有相同的小时和分钟,但不关心其余值(年、月等),我需要自己编写代码来实现。为了完成这个任务,我编写了一些扩展方法来满足这个需求。

[Flags]
public enum DatePartFlags 
    {Ticks=0, Year=1, Month=2, Day=4, Hour=8, Minute=16, Second=32, Millisecond=64 };
public static class ExtensionMethods
{
    private static bool FlagIsSet(DatePartFlags flags, DatePartFlags flag)
    {
        bool isSet = ((flags & flag) == flag);
        return isSet;
    }

    public static bool Equal(this DateTime now, DateTime then, DatePartFlags flags)
    {
        bool isEqual = false;
        if (flags == DatePartFlags.Ticks)
        {
            isEqual = (now == then);
        }
        else
        {
            DatePartFlags equalFlags = DatePartFlags.Ticks;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Year) && 
                           now.Year == then.Year) ? DatePartFlags.Year : 0;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Month) && 
                           now.Month == then.Month) ? DatePartFlags.Month : 0;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Day) && 
                           now.Day == then.Day) ? DatePartFlags.Day : 0;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Hour) && 
                           now.Hour == then.Hour) ? DatePartFlags.Hour : 0;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Minute) && 
                           now.Minute == then.Minute) ? DatePartFlags.Minute : 0;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Second) && 
                           now.Second == then.Second) ? DatePartFlags.Second : 0;
            equalFlags |= (FlagIsSet(flags, DatePartFlags.Millisecond) && 
                           now.Millisecond == then.Millisecond) ? DatePartFlags.Millisecond : 0;
            isEqual = (flags == equalFlags);
        }
        return isEqual;
    }
}

用法如下

private void LoopUntilItHurts()
{
    DatePartFlags equalityFlags = DatePartFlags.Minute | DatePartFlags.Second;
    DateTime now = DateTime.Now;
    DateTime then = DateTime.Now;
    bool waiting = false;

    while (true)
    {
        now = DateTime.Now;
        if (!waiting)
        {
            int difference = now.Minute % 5;
            then = now.Add(new TimeSpan(0, 0, 1, 0, 0));
            waiting = true;
        }

        if (now.Equal(then, equalityFlags))
        {
            waiting = false;
            // it's time to do something important    
        }
        else
        {
            // sit and spin
            Thread.Sleep(1000);
        }
    }
}
© . All rights reserved.