2010-01-21 2 views
-1

시간과 2 개의 날짜 값을 비교할 수없는 것 같습니다.날짜 시간 비교

날짜를 일년, 월, 일로 비교하면 모든 것이 정상적으로 작동합니다. 그러나 비교 시간을 더하면 모든 것이 무너지고 월이 맞지 않게됩니다.

그래서 2 개의 날짜를 비교하기위한 몇 가지 기본적인 알고리즘은 무엇입니까? 내 말은 일반적으로, 나는 dateTime1.CompareTo(dateTime2)을 사용하지 않을 수 없다. 가급적 pseudocoude에서. 감사.

편집 : 이제 마지막 비교와 비교했을뿐입니다. 따라서 마지막 날을 비교하는 경우 일별로 비교하고 연도 또는 월을 고려하지 않습니다.

2 개의 날짜를 비교하는 데 필요한 기본 알고리즘 만 있으면됩니다. 나는 그것이 단순해야한다고 생각합니다 ...

+0

지역 및 날짜/시간 형식이 너무 광범위하다고 생각합니다. 어떤 문제를 해결하려고합니까? –

+1

나는 여러 언어로 된 datetimes를 성공적으로 비교했기 때문에 언어에 무관심하다고 믿지 않습니다. 아마도 귀하의 언어 또는 구현의 지역 문제 일 것입니다. – Sejanus

+0

시간 부분만을 비교하고 싶습니까? –

답변

2

다음 형식은 꽤 잘 작동합니다 :

DateTime a 
DateTime b 
if a.year != b.year 
    return a.year < b.year 
else if a.month != b.month 
    return a.month < b.month 
else if a.day != b.day 
    return a.day < b.day 
else if a.hour != b.hour 
    return a.hour < b.hour 
else if a.minute != b.minute 
    return a.minute < b.minute 
else 
    // Dates are same 
+0

지역 정보는 어떻게됩니까? 이 날짜가 전 세계 로그에서 비 직렬화되었다고 가정 해 봅시다. – Ariel

+0

그래, 나는 시간대를 고려했을 것이다. 그러나 그 날짜가 오는 "위치"가 오직 하나의 시간대를 가진 단지 하나이기 때문이다 :) – mnn

+0

이 알고리즘을 사용하기 전에, 각 DateTime은 변환 될 필요가있다. 시간대가 비교 대상인 경우 동일한 로케일로 이동하십시오. – Aaron

1

년을 비교하십시오. 한 쪽이 다른 쪽보다 크면 그 쪽이 나중에 나옵니다.

개월을 비교하십시오. 한 쪽이 다른 쪽보다 크면 그 쪽이 나중에 나옵니다.

일을 비교해보십시오. 한 쪽이 다른 쪽보다 크면 그 쪽이 나중에 나옵니다.

기타. 나는 그 패턴이 분명하다고 생각한다.

의사 코드 (유효 파이썬, 부수적) :

if a.year > b.year: 
    return 1 
if a.year < b.year: 
    return -1 
if a.month > b.month: 
    return 1 
if a.month < b.month: 
    return -1 
# etcetera 
return 0 
+0

lol @ '와 유효한 Python, 부수적으로' – Fortega

0

내가 문제를 가정을 지자체와 함께입니다. 수동이, 당신은) (ToUniversalTime로 변환 각각 다음 비교해야하고 싶은 경우는 .NET의 가정, 당신의 날짜를 비교

dt1.CompareTo(dt2) 

에 포함 된 지방을 포함하고있다.

1

이것은 언어 중립적 인 질문이 아닙니다. Java와 Javasript 그리고 지금까지 사용 해본 모든 SQL 구현에는 날짜/시간 비교 함수가 있습니다. 사용하는 언어 나 플랫폼이 그렇지 않다면, 누군가가 올바른 함수 호출이 무엇인지 또는 어떤 특이성을 해결하는 방법을 말할 수 있는지 알려 주어야합니다. 예, 많은 언어가 날짜/시간 데이터 유형을 가지고 있지만 질문 언어에 중립적 인 것은 아닙니다. 대부분의 언어는 화면에 텍스트를 출력하는 방법을 가지고 있지만 "언어 중립적 인 방법으로 텍스트 문자열을 화면에 쓰려면 어떻게해야합니까?"라고 묻는 것은 합당하지 않습니다. 그러한 질문에 대한 대답은 없습니다.

나는 "마지막 비교 만 비교"란 무엇을 의미하는지 알지 못합니다. 다시 말하지만, 특정 언어의 특정 비교 함수의 동작을 분명히 나타냅니다. 의미있는 대답을 얻으려면보다 구체적이어야합니다.

댓글에 대한 답장으로 수정 : 다른 언어는 날짜를 저장하는 다양한 방법이 있습니다. Java에서 한 날짜/시간이 다른 날짜/시간 뒤에 있는지 알아 보려면 "date1.after (date2)"또는 "date1.compareTo (date2)> 0"이라고 씁니다. Postgres SQL에서는 유형 정의에 따라 "date1> date2"또는 "date1 :: timestamp> date2 :: timestamp"라고 씁니다. C에는 "difftime (date1, date2)"을 포함하여 다양한 "올바른"방법이 있습니다. 기타 등등.

위의 대답은 논리적으로 정확하지만 사용하는 언어의 날짜를 실제로 비교하는 방법과는 관련이 없습니다.이러한 구성 요소 (연, 월, 일 등) 각각에 대해 정수 집합으로 저장된 날짜가있는 경우 제대로 작동하는지 확인하십시오. 그러나 나는 그런 식으로 날짜를 저장하는 언어를 모른다.

날짜를 저장하는 데 자신의 형식을 사용하고 이러한 구성 요소로 분해하는 데 필요한 이유가 응용 프로그램에 유용하면 Aaron의 기술이 정확하다고 생각합니다. 그러나 이것이 유용한 형식이라고는 생각하지 않습니다. 내부적으로 Java는 1970 년 1 월 1 일 자정부터 밀리 초 수로 날짜/시간을 저장합니다. C는 초 수를 사용합니다. 나는 다른 언어가 다른 계획을 사용한다고 확신한다.

언어 중립 의사 코드를 작성하여 화면에 쓰는 것을 설명 할 수있는 것처럼 언어 중립 의사 코드를 작성하여 두 날짜를 비교할 수 있습니다. 더 큰 문제를 해결하는 동안 언어의 기술 세부 사항을 추상화하려는 것이 목표라면, 좋습니다. 그러나 실제로 두 날짜를 비교하고 나중에 날짜 또는 나중에 날짜를 찾는 것이 목표이면 사용하는 특정 언어를 저장하고 날짜를 조작하는 방법에 대한 기술적 인 세부 사항에 답이 있습니다.

+0

예수님 ... 사과와 오렌지를 비교하고 있습니다. 날짜 비교 _ 중립적 인 언어. 모든 언어에는 비교 연산자, if 문 및 return 문 (또는 이와 유사한 문법)이 있기 때문입니다. 반면, lanugages는 cout <<, Console.WriteLine, writeln, printf()와 같이 화면에 출력 할 수있는 다른 방법을 가지고 있습니다. – mnn

+0

@mnn : 위의 편집을 참조하십시오. – Jay

+0

그래도 나는 화면에 쓸 언어 중립적 (의사) 코드를 쓰는 것이 비교 날짜를 쓰는 것보다 훨씬 어렵다고 생각합니다. 그러나 어쨌든 Aaron의 대답은 잘못된 가치를 반환하는 것처럼 도움이되지 못했습니다. 그래서 나는 당신의 대답을 고집 할 것입니다. 그것은 내 눈을 열었고, 제 언어로 날짜와 시간을위한 유닉스 타임 스탬프 기능을 발견했습니다. – mnn