Сравнение даты и времени - PullRequest
       32

Сравнение даты и времени

0 голосов
/ 21 января 2010

Кажется, я не могу сравнить 2 значения даты со временем.

Когда я сравниваю только часть даты - год, месяц и день - все работает нормально. Но когда я добавляю время сравнения, все ломается и даже месяц не подходит.

Так какой же базовый алгоритм для сравнения 2 дат? Я имею в виду, в общем, я не могу использовать juse dateTime1.CompareTo(dateTime2). Желательно в псевдокуде. Спасибо.

Edit: теперь я узнал, что он сравнивается только с последним сравнением. Поэтому, если сравнивать последний день, он сравнивается по дням и не учитывает год или месяц.

Мне просто нужен базовый алгоритм для сравнения 2 дат. Я считаю, что это должно быть просто ...

Ответы [ 4 ]

2 голосов
/ 21 января 2010

Следующий формат должен работать очень хорошо:

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
1 голос
/ 21 января 2010

Это решено НЕ нейтральный для языка вопрос. Например, Java, Javasript и каждая реализация SQL, которую я когда-либо использовал, имеют функции сравнения даты / времени, которые работают просто отлично. Если используемый вами язык или платформа этого не делают, вам нужно будет сообщить нам, кто они такие, чтобы кто-то мог сказать вам, какой правильный вызов функции использовать или как обойти какую-то особенность. Да, многие языки имеют тип данных дата / время, но это не делает язык вопроса нейтральным. У большинства языков есть способ вывода текста на экран, но это не дает права спрашивать: «Как записать текстовую строку на экран нейтральным языком?» На такой вопрос ответа нет.

Понятия не имею, что вы имеете в виду под «сравнением только последним сравнением». Опять же, вы, очевидно, имеете в виду поведение определенной функции сравнения на каком-то конкретном языке. Вы должны быть более конкретны, чтобы получить значимый ответ.

Изменить в ответ на ваш комментарий: разные языки имеют разные способы хранения дат. В Java, чтобы увидеть, если одна дата / время идут за другой, вы пишете «date1.after (date2)» или «date1.compareTo (date2)> 0». В Postgres SQL вы пишете «date1> date2» или «date1 :: timestamp> date2 :: timestamp» в зависимости от определения типа. В C существует множество «правильных» способов, включая «difftime (date1, date2)». И т. Д.

Ответ Аарона выше логически правильный, но не имеет отношения к тому, как вы на самом деле сравниваете даты на любом языке, который я использую. Если бы у вас были даты, хранящиеся в виде набора целых чисел для каждого из этих компонентов (год, месяц, день и т. Д.), Убедитесь, что это сработает. Но я не знаю ни одного языка, который бы таким образом сохранял даты.

Если у вас есть причины иметь свой собственный формат для хранения дат и разбивать их на такие компоненты, как это полезно для вашего приложения, тогда я полагаю, что метод Аарона верен. Но вряд ли это полезный формат. Внутренне Java хранит дату / время в виде количества миллисекунд с полуночи, 1 января 1970 года. C использует количество секунд. Я уверен, что другие языки используют другие схемы.

Конечно, вы можете написать независимый от языка псевдокод для сравнения двух дат, точно так же, как вы можете написать независимый от языка псевдокод для описания записи на экран. Если ваша цель состоит в том, чтобы абстрагироваться от технических деталей языка, пока вы работаете над более серьезной проблемой, это прекрасно. Но если ваша цель состоит в том, чтобы на самом деле сравнить две даты и выяснить, какая из них позже или сколько дней между ними, тогда ответ заключается в технических деталях того, как конкретный язык, который вы используете, хранит и манипулирует датами.

1 голос
/ 21 января 2010

Сравните годы. Если один больше другого, это более поздняя дата.

Сравните месяцы. Если один больше другого, это более поздняя дата.

Сравните дни. Если один больше другого, это более поздняя дата.

Etcetera. Я думаю, что картина ясна.

Псевдокод (и, кстати, действительный Python):

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 голосов
/ 21 января 2010

Полагаю, ваша проблема с местностями. Предполагая, что это .NET, ваши даты содержат населенные пункты, которые включены в сравнения

dt1.CompareTo(dt2)

Если вы хотите сделать это вручную, то вам нужно конвертировать в ToUniversalTime () каждый и затем сравнивать.

...