获得两个日期之间的最小值(或最大值)的最快和最简单的方法是什么?有数学等价物吗?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没用,因为它们是日期。
当前回答
将这两个方法放在一个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);
}
其他回答
将这两个方法放在一个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);
}
// 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/
没有内置的方法来做这个。你可以使用这样的表达:
(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()
我们可以使用Date.parse()将日期转换为数字原语,然后可以使用Math.min()和Math.max()进行处理和存储。有了这个原语,我们可以以任何我们想要的格式呈现。 这是一个2-3步的过程,但我们实际上消除了得到奇怪结果的风险。
const unixTimeZero = Date.parse('01 Jan 1970 00:00:00 GMT'); const javaScriptRelease = Date.parse('04 Dec 1995 00:12:00 GMT'); const today = Date.parse(new Date()); const d1 = Date.parse(new Date("2004-02-01")); const d2 = Date.parse(new Date("2017-01")); const d3 = Date.parse(new Date("2018")) const t = [unixTimeZero, d1, d2, d3, today, javaScriptRelease]; const min = Math.min(...t) const max = Math.max(...t) console.log(unixTimeZero); // expected output: 0 console.log(javaScriptRelease); // expected output: 818035920000 console.log(today); console.log(t); console.log(["unixMin: " + min, "earliestDate: " + new Date(min).toUTCString()]); console.log(["unixMax: " + max, "latestDate: " + new Date(max).toDateString()]);
如果你想使用Linq.Max(),但更像Math。Max,你可以做一些像这样很短的表达式体:
public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);