programing

수학과 동등합니다.Min & Math.최대 날짜 수?

telecom 2023. 5. 25. 21:31
반응형

수학과 동등합니다.Min & Math.최대 날짜 수?

최소(또는 최대) 값을 두 날짜 사이에 가져오는 가장 빠르고 쉬운 방법은 무엇입니까?수학과 동등한 것이 있습니까?민 (& 수학).날짜는 최대)?

다음과 같은 작업을 수행하고 싶습니다.

 if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
      //not allowed to do this
 }

분명히 위 수학.민은 둘이 데이트를 해서 일을 하지 않습니다.

그것을 할 수 있는 기본적인 방법은 없습니다.다음 식을 사용할 수 있습니다.

(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()

DateTime 값에 대한 오버로드는 없지만 long 값을 가져올 수 있습니다.Ticks값에 포함된 값을 비교한 다음 결과에서 새 DateTime 값을 생성합니다.

new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))

(DateTime 구조체에도 다음이 포함되어 있습니다.Kind새 값에 유지되지 않는 속성입니다.일반적으로 이것은 문제가 되지 않습니다. 다른 종류의 DateTime 값을 비교하면 그 비교는 어쨌든 의미가 없습니다.)

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(); 

어때요?

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();

사용할 경우Linq.Max()하지만 그것을 좀 더 라고 불러요.Math.Max당신은 이 매우 짧은 표현 본문과 같은 것을 할 수 있습니다.

public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);
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 또는 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);
    }

이 테스트는 그리니치 동쪽에서 실패할 것입니다.

a는 어때요?DateTime확장 방법?

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);
}

이전에 제공된 답변 중 몇 가지의 성능에 대해 궁금해하는 사람들을 위해, 저는 그 중 몇 가지에 대한 벤치마크를 실행했습니다.속도와 메모리에 가장 적합한 솔루션을 결정하기 위해 3차 연산자, LINQ 및 Math.max를 사용했습니다.

삼분의 일

return a > b ? a : b;
  • 평균 속도: 0.0198나노초
  • 추가 메모리 할당: 없음
  • 가비지 수집 시간: 없음

수학.max

return new DateTime(Math.Max(a.Ticks, b.Ticks));
  • 평균 속도: 2.4346 나노초
  • 추가 메모리 할당: 없음
  • 가비지 수집 시간: 없음

LINQ

return new[]{a, b}.Max();
  • 평균 속도: 22.8383 나노초
  • 추가 메모리 할당: 72바이트
  • 가비지 수집 시간: 0.0057나노초
환경

.Net 버전: 6.0

C# 버전: 10.0

구성:풀어주다

레퍼런스

벤치마킹은 BenchmarkDotNet 0.13.5를 사용하여 수행되었습니다.

DateTime 비교 벤치마크


TLDR

3항 연산자는 지금까지 가장 성능이 좋은 방법입니다.2위보다 100배 이상 빠른 성능을 발휘하며 추가 메모리를 할당하지 않습니다.

Date.parse()를 사용하여 날짜를 Number primitive로 변환한 다음 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()]);

// 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/

언급URL : https://stackoverflow.com/questions/1985317/equivalent-of-math-min-math-max-for-dates

반응형