获得两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?有数学等价物吗?Min (& Math.Max)的日期?

我想做的事情是:

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

显然上面的数学。Min没用,因为它们是日期。


当前回答

没有内置的方法来做这个。你可以使用这样的表达:

(date1 > date2 ? date1 : date2)

求两者的最大值。

您可以编写一个泛型方法来计算任何类型的Min或Max(前提是Comparer<T>。默认设置是适当的):

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()

其他回答

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

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);
}

没有内置的方法来做这个。你可以使用这样的表达:

(date1 > date2 ? date1 : date2)

求两者的最大值。

您可以编写一个泛型方法来计算任何类型的Min或Max(前提是Comparer<T>。默认设置是适当的):

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()

如何:

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();

DateTime扩展方法怎么样?

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

用法:

var maxDate = date1.MaxOf(date2);
// 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/