2010-01-21 3 views
-1

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

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

Итак, какой базовый алгоритм сравнения двух дат? Я имею в виду, в общем, я не могу использовать код dateTime1.CompareTo(dateTime2). Предпочтительно в псевдодудии. Благодарю.

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

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

+0

Я думаю, что это слишком широкий вопрос с учетом местностей и форматов даты и времени. Какую проблему ты пытаешься решить? –

+1

Я не верю своему языковому агностику, потому что я успешно сравнивал даты на разных языках. Вероятно, это локальная проблема вашего языка или реализации. – 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

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

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

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

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

lol @ 'и действительный Python, кстати' – Fortega

0

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

dt1.CompareTo(dt2) 

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

1

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

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

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

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

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

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

+0

Иисус ... Ты сравниваешь яблоко с апельсинами. Сравнение дат _is_ нейтрально. Потому что на каждом языке есть операторы сравнения, оператор if и return (или аналогичные). С другой стороны, lanugages имеют другой способ вывода чего-либо на экран, например cout << или Console.WriteLine, или writeln, или printf(). – mnn

+0

@mnn: См. Править выше. – Jay

+0

Тем не менее, я думаю, что написание языка нейтрального (псевдо) кода для записи на экран намного сложнее, чем писать даты сравнения. Но в любом случае ответ Аарона не помог, так как он возвращал недопустимые значения. Поэтому я собираюсь придерживаться вашего ответа, который открыл мне глаза, и я нашел «добрые» функции timestamp unix для даты и времени на моем языке. – mnn

Смежные вопросы