답변:
DateTime 값에는 과부하가 없지만 Ticks
값에 포함 된 긴 값 을 가져 와서 비교 한 다음 결과에서 새 DateTime 값을 만들 수 있습니다.
new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))
DateTime 구조에는 Kind
새 값으로 유지되지 않는 속성 도 포함되어 있습니다 . 이것은 일반적으로 문제가되지 않습니다. 다른 종류의 DateTime 값을 비교하면 어쨌든 의미가 없습니다.
System.DateTime
-instance
이를 수행 할 수있는 내장 된 방법이 없습니다. 다음 표현식을 사용할 수 있습니다.
(date1 > date2 ? date1 : date2)
둘 중 최대 값을 찾습니다.
계산 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;
}
}
이렇게하면 날짜가 다른 '종류'를 가질 수 있으며 전달 된 인스턴스를 반환합니다 (Ticks 또는 밀리 초로 구성된 새 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가 있으므로 두 값 (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);