比较日期时间

时间:2010-01-21 17:00:42

标签: language-agnostic datetime comparison

似乎我无法将2个日期值与时间进行比较。

当我比较日期部分 - 年,月和日 - 一切正常。但是当我添加比较时,一切都会崩溃,甚至不适合月份。

那么比较2个日期的基本算法是什么?我的意思是,我不能使用dateTime1.CompareTo(dateTime2)。优选在假捻剂中。感谢。

编辑:现在我发现它只与上一次比较相比。因此,如果最后一天比较,则按天比较,不考虑年份或月份。

我只需要比较2个日期的基本算法。我相信它一定很简单......

4 个答案:

答案 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

答案 1 :(得分:1)

比较岁月。如果一个比另一个大,那就是更晚的日期。

比较几个月。如果一个比另一个大,那就是更晚的日期。

比较天数。如果一个比另一个大,那就是更晚的日期。

等等。我认为模式很清楚。

伪代码(和有效的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

答案 2 :(得分:1)

这不是一个语言中立的问题。例如,Java和Javasript以及我曾经使用的每个SQL实现都有日期/时间比较函数,它们运行得很好。如果您使用的语言或平台没有,您必须告诉我们它们是什么让任何人能够告诉您正确使用的函数是什么或如何解决某些特性。是的,许多语言都有日期/时间数据类型,但这并不会使问题语言保持中立。大多数语言都有一种方法可以将文本输出到屏幕上,但这并不合理地问:“如何以语言中立的方式将文本字符串写入屏幕?”这个问题没有答案。

我不知道你的意思是“它只比较最后的比较”。同样,您显然是指某些特定语言中某些特定比较函数的行为。你必须更具体地得到一个有意义的答案。

编辑回复您的评论:不同的语言有不同的存储日期方式。在Java中,要查看一个日期/时间是否在另一个之后,您可以编写“date1.after(date2)”或“date1.compareTo(date2)&gt; 0”。在Postgres SQL中,您可以根据类型定义编写“date1&gt; date2”或“date1 :: timestamp&gt; date2 :: timestamp”。在C中有各种“正确”的方式,包括“difftime(date1,date2)”。等等。

Aaron上面的回答在逻辑上是正确的,但与你如何实际比较我使用的任何语言的日期无关。如果您将日期存储为每个组件(年,月,日等)的一组整数,那么肯定会有效。但是我不知道有哪种语言存储日期。

如果您有自己的格式来存储日期,并将它们分解为对您的应用程序有用的组件,那么我认为Aaron的技术是正确的。但这不太可能是一种有用的格式。在内部,Java将日期/时间存储为自1970年1月1日午夜以来的毫秒数.C使用秒数。我确定其他语言使用其他方案。

当然,您可以编写与语言无关的伪代码来比较两个日期,就像您可以编写与语言无关的伪代码来描述写入屏幕一样。如果你的目标是在处理更大的问题时抽象出一种语言的技术细节,那就太好了。但是,如果您的目标是实际比较两个日期并找出它们之间的日期或它们之间的天数,则答案取决于您使用的特定语言如何存储和操作日期的技术细节。

答案 3 :(得分:0)

我认为你的问题出在地方。假设它是.NET,您的日期包含地点,这些地点包含在比较中

dt1.CompareTo(dt2)

如果你想手动完成,那么你应该转换为ToUniversalTime(),然后进行比较。