回答:
DateTime値のオーバーロードはありませんがTicks、値に含まれる長い値を取得し、それらを比較して、結果から新しいDateTime値を作成できます。
new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))
(DateTime構造体にKindは、新しい値で保持されないプロパティも含まれていることに注意してください。通常、これは問題ではありません。異なる種類のDateTime値を比較する場合、比較は意味がありません。)
System.DateTime-instance
それを行うための組み込みメソッドはありません。次の式を使用できます。
(date1 > date2 ? date1 : date2)
2つの最大値を見つけます。
計算MinするMaxため、または任意のタイプ(Comparer<T>.Default適切に設定されている場合)のジェネリックメソッドを記述できます。
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();
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;
}
}
これにより、日付に異なる「種類」を持たせることができ、渡されたインスタンスが返されます(ティックまたはミリ秒から構築された新しい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);
}
このテストはグリニッジの東で失敗することに注意してください...
Math.Maxのようにそれを呼び出したい場合は、次のような非常に短い式の本体のようなことができます。
public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);
どの程度DateTime拡張メソッド?
public static DateTime MaxOf(this DateTime instance, DateTime dateTime)
{
return instance > dateTime ? instance : dateTime;
}
使用法:
var maxDate = date1.MaxOf(date2);
DateTime.MaxOf(dt1, dt2)ですが、その方法がわかりません...
これでLINQができたので、2つの値(DateTimes、TimeSpansなど)で配列を作成し、.Max()拡張メソッドを使用できます。
var values = new[] { Date1, Date2 };
var max = values.Max();
読みやすく、Maxと同じくらい効率的で、2つ以上の比較値で再利用できます。
以下の.Kindについて心配することの全体的な問題は大したことです...しかし、私はこれまでに現地時間で作業しないことでそれを回避しています。時間に関して何か重要なことがあれば、そこにたどり着くためにさらに多くの仕事が必要であっても、私は常にUTCで働いています。
// 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);