获得两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?有数学等价物吗?Min (& Math.Max)的日期?
我想做的事情是:
if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
//not allowed to do this
}
显然上面的数学。Min没用,因为它们是日期。
获得两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?有数学等价物吗?Min (& Math.Max)的日期?
我想做的事情是:
if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
//not allowed to do this
}
显然上面的数学。Min没用,因为它们是日期。
当前回答
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.Max(),但更像Math。Max,你可以做一些像这样很短的表达式体:
public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);
DateTime值没有重载,但是你可以得到长值Ticks,这是值所包含的,比较它们,然后从结果中创建一个新的DateTime值:
new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))
(请注意,DateTime结构还包含一个Kind属性,它不会保留在新值中。这通常不是问题;如果你比较不同类型的DateTime值,这种比较是没有意义的。)
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/
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;
}
}
这允许日期有不同的“种类”,并返回被传入的实例(不返回一个由tick或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);
}
请注意,该测试在格林威治以东将失败。