.net 相当于Math.Min&;数学,约会的Max?

.net 相当于Math.Min&;数学,约会的Max?,.net,.net,获取两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?日期是否与Math.Min(&Math.Max)等效 我想做一些类似的事情: if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) { //not allowed to do this } if(Math.Min(Date1,Date2)

获取两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?日期是否与Math.Min(&Math.Max)等效

我想做一些类似的事情:

 if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
      //not allowed to do this
 }
if(Math.Min(Date1,Date2)<允许的最小日期){
//不允许这样做
}

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

没有内置的方法。您可以使用以下表达式:

(date1 > date2 ? date1 : date2)
找到两者中的最大值

您可以编写一个通用方法来计算任何类型的
Min
Max
(前提是
Comparer.Default
设置正确):

那么:

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

DateTime值没有重载,但您可以获取长值
Ticks
,这是值所包含的内容,比较它们,然后根据结果创建新的DateTime值:

new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))
(请注意,DateTime结构还包含一个
Kind
属性,该属性未保留在新值中。这通常不是问题;如果比较不同类型的DateTime值,则比较毫无意义。)


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

如果您想将其称为更像Math.Max,您可以执行类似以下非常简短的表达式体的操作:

public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);
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(); 

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

var values = new[] { Date1, Date2 }; 
var max = values.Max(); 
它读起来很好,它尽可能的高效,并且它可以重复使用2个以上的比较值


下面所有的问题都在担心。善良是一件大事。。。但我从不在《当地时报》工作来避免这种情况。如果我有一些重要的关于时间的事情,我总是在UTC工作,即使这意味着要做更多的工作。

那么
日期时间扩展方法如何

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

var maxDate = date1.MaxOf(date2);

将这两个方法放在一个实用程序类中,并使用它们获取任意数目的日期时间的最小值/最大值:

    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);
    }
publicstaticdatetime最小值(参数DateTime[]dates)
{
如果(dates.Length==1)返回日期[0];
长minTicks=日期[0]。刻度;
对于(int i=1;i
在我看来,这似乎是最接近Math.Min的一行替换/等效答案,但其他答案也很好,为了完整性,您完全丢失了原始
系统的所有信息(除了刻度)。DateTime
-instance@AndreasNiedermair:如果您正在比较不同类型的日期,无论如何,你不能直接比较它们。我已经在回答中谈到了这一点。@Iain:你总是可以比较它们,但是如果你比较不可比较的值,结果是无用的。这与任何其他不可比较的值一样,比如以公里为单位比较距离和以英里为单位比较距离;你可以很好地比较这些值,但这并不意味着什么。-1表示手工操作。如@user450的回答所示,将这两个时间转换为UTC并安全地比较它们很容易,而不会丢弃信息。投票支持LINQ示例。对于第一个方法,它可以是
return values.Min()很好的建议(真的),但是如果没有描述,很难找到为什么它是好的。请描述技巧在哪里。没有描述,这只是一段代码,不是答案。问题被标记为.NET而不是JavaScript抱歉,没有注意到.NET。无论如何,我们可以在客户端找到最小日期并将其发送到服务器。您假设我们讨论的是asp,这不一定正确。在客户机上计算差异也是相当愚蠢的,因为风险要大得多(禁用JavaScript),它会产生不必要的流量,速度也会慢(取决于网络速度)创建一个运行在node.js中的datecomparison微服务,然后你可以调用它来回答最初的问题哦,真是天才!这样我就不必每次都比较,只需在处理完数据后比较一次。非常感谢你!这是一个非常优雅的解决方案,我更愿意将其用作
DateTime.MaxOf(dt1,dt2)
,但我不知道如何实现…@ZachSmith您不能重载DateTime类,因为它不是部分的。也许我们可以使用DateTimeHelper.Max(dt1,dt2)@shtse8-你说的重载是什么意思?我正在考虑添加一个扩展方法。但从那以后,我明白了没有实例化的实例是无法做到这一点的。听起来你是说添加扩展方法是一种重载?我从来没有考虑过。。对吗?现在我想起来了。。。重载到底意味着什么?@ZachSmith噢,我以为你在添加一个名为“DateTime.MaxOf(dt1,dt2)”的扩展,就像“DateTime.Now”一样,它是基于DateTime静态成员的。为什么不删除ToUniversalTime()部分呢?我的答案的副本这实际上是值得接受的答案。
public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);
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(); 
var values = new[] { Date1, Date2 }; 
var max = values.Max(); 
public static DateTime MaxOf(this DateTime instance, DateTime dateTime)
{
    return instance > dateTime ? instance : dateTime;
}
var maxDate = date1.MaxOf(date2);
    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);
    }