.net 相当于Math.Min&;数学,约会的Max?
获取两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?日期是否与Math.Min(&Math.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)
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);
}