相当于Math.Min& Math.Max日期?

时间:2009-12-31 13:00:15

标签: .net

在两个日期之间获得最小(或最大)值的最快捷最简单的方法是什么?是否有相当于Math.Min(& Math.Max)的日期?

我想做类似的事情:

 if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
      //not allowed to do this
 }

显然上面的Math.Min不起作用,因为它们是日期。

11 个答案:

答案 0 :(得分:395)

没有内置方法可以做到这一点。您可以使用表达式:

(date1 > date2 ? date1 : date2)

找到两者中的最大值。

您可以编写通用方法来计算任何类型的MinMax(前提是Comparer<T>.Default已正确设置):

public static T Max<T>(T first, T second) {
    if (Comparer<T>.Default.Compare(first, second) > 0)
        return first;
    return second;
}

您也可以使用LINQ:

new[]{date1, date2, date3}.Max()

答案 1 :(得分:352)

DateTime值没有重载,但您可以获取值包含的长值Ticks,比较它们,然后从结果中创建一个新的DateTime值:

new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))

(注意,DateTime结构还包含一个Kind属性,它不会保留在新值中。这通常不是问题;如果比较不同类型的DateTime值,则比较没有意义反正。)

答案 2 :(得分:33)

怎么样:

public static T Min<T>(params T[] values)
{
    if (values == null) throw new ArgumentNullException("values");
    var comparer = Comparer<T>.Default;
    switch(values.Length) {
        case 0: throw new ArgumentException();
        case 1: return values[0];
        case 2: return comparer.Compare(values[0],values[1]) < 0
               ? values[0] : values[1];
        default:
            T best = values[0];
            for (int i = 1; i < values.Length; i++)
            {
                if (comparer.Compare(values[i], best) < 0)
                {
                    best = values[i];
                }
            }
            return best;
    }        
}
// overload for the common "2" case...
public static T Min<T>(T x, T y)
{
    return Comparer<T>.Default.Compare(x, y) < 0 ? x : y;
}

适用于支持IComparable<T>IComparable

的任何类型

实际上,使用LINQ,另一种选择是:

var min = new[] {x,y,z}.Min();

答案 3 :(得分:18)

public static class DateTool
{
    public static DateTime Min(DateTime x, DateTime y)
    {
        return (x.ToUniversalTime() < y.ToUniversalTime()) ? x : y;
    }
    public static DateTime Max(DateTime x, DateTime y)
    {
        return (x.ToUniversalTime() > y.ToUniversalTime()) ? x : y;
    }
}

这允许日期具有不同的种类&#39;并返回传入的实例(不返回从Ticks或Milliseconds构造的新DateTime)。

[TestMethod()]
    public void MinTest2()
    {
        DateTime x = new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc);
        DateTime y = new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Local);

        //Presumes Local TimeZone adjustment to UTC > 0
        DateTime actual = DateTool.Min(x, y);
        Assert.AreEqual(x, actual);
    }

请注意,此测试将在格林威治东部失败......

答案 4 :(得分:10)

如果你想更像Math.Max,你可以做这样一个非常短的表达体:

public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);

答案 5 :(得分:5)

Linq.Min() / Linq.Max()方法:

DateTime date1 = new DateTime(2000,1,1);
DateTime date2 = new DateTime(2001,1,1);

DateTime minresult = new[] { date1,date2 }.Min();
DateTime maxresult = new[] { date1,date2 }.Max(); 

答案 6 :(得分:1)

DateTime扩展方法怎么样?

public static DateTime MaxOf(this DateTime instance, DateTime dateTime)
{
    return instance > dateTime ? instance : dateTime;
}

用法:

var maxDate = date1.MaxOf(date2);

答案 7 :(得分:1)

将这两个方法放在一个 Utility 类中,并使用它们来获取任意数量的 DateTimes 的 Min/Max:

    public static DateTime Min(params DateTime[] dates)
    {
        if (dates.Length == 1) return dates[0];

        long minTicks = dates[0].Ticks;

        for (int i = 1; i < dates.Length; i++)
        {
            minTicks = Math.Min(minTicks, dates[i].Ticks);
        }

        return new DateTime(minTicks);
    }

    public static DateTime Max(params DateTime[] dates)
    {
        if (dates.Length == 1) return dates[0];

        long maxTicks = dates[0].Ticks;

        for (int i = 1; i < dates.Length; i++)
        {
            maxTicks = Math.Max(maxTicks, dates[i].Ticks);
        }

        return new DateTime(maxTicks);
    }

答案 8 :(得分:0)

现在我们有LINQ,您可以使用两个值(DateTimes,TimeSpans等)创建一个数组,然后使用.Max()扩展方法。

var values = new[] { Date1, Date2 }; 
var max = values.Max(); 

它读得很好,它和Max一样高效,并且它可以重复使用超过2个比较值。

以下整个问题令人担忧.Kind是一件大事......但我从来没有在当地时间工作,从而避免这种情况。如果我在时间上有重要的事情,我总是在UTC工作,即使这意味着需要做更多工作。

答案 9 :(得分:0)

您可以使用LINQ.Min()执行以下操作:

     if (new DateTime[]{Date1, Date2}.Min() < MINIMUM_ALLOWED_DATE) {
          //not allowed to do this
     }

答案 10 :(得分:-2)

// Two different dates
var date1 = new Date(2013, 05, 13); 
var date2 = new Date(2013, 04, 10) ;
// convert both dates in milliseconds and use Math.min function
var minDate = Math.min(date1.valueOf(), date2.valueOf());
// convert minDate to Date
var date = new Date(minDate); 

http://jsfiddle.net/5CR37/