【问题标题】:Comparing date time比较日期时间
【发布时间】:2010-01-21 17:00:42
【问题描述】:

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

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

那么比较两个日期的基本算法是什么?我的意思是,我不能随便使用dateTime1.CompareTo(dateTime2)。最好在伪代码中。谢谢。

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

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

【问题讨论】:

  • 我认为考虑到地区和日期/时间格式,这个问题过于宽泛。你想解决什么问题?
  • 我不相信它与语言无关,因为我曾经成功地比较过许多不同语言的日期时间。可能是您的语言或实现的本地问题。
  • 您只想比较时间部分?
  • 这根本不是语言不可知论者——或者更确切地说,它不是平台不可知论者。答案将完全取决于相关平台。
  • 你能发布你的代码来比较时间吗?

标签: language-agnostic datetime comparison


【解决方案1】:

以下格式应该可以很好地工作:

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

【讨论】:

  • 地方呢?假设这些日期是从世界各地的日志中反序列化的,这行得通吗?
  • 是的,我会考虑时区,但这没有必要,因为这些日期的“位置”只是一个时区:)
  • 在使用此算法之前,如果要在比较中使用时区,则需要将每个 DateTime 转换为相同的语言环境。
【解决方案2】:

比较年份。如果一个比另一个大,那就是较晚的日期。

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

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

等等。我认为模式很明确。

伪代码(顺便说一下,还有有效的 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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 耶稣...您将苹果与橙子进行比较。比较日期语言中立的。因为在每种语言中都有比较运算符、if 语句和 return 语句(或类似的)。另一方面,语言有不同的方式将某些内容输出到屏幕,例如 cout
    • 不过,我认为编写语言中性(伪)代码以写入屏幕比编写比较日期要困难得多。但无论如何,亚伦的回答并没有帮助,因为它返回了无效值。所以我会坚持你的回答,这让我大开眼界,我发现了我的语言中日期和时间的“某种”unix时间戳函数。
    【解决方案4】:

    我认为您的问题与地区有关。假设它是 .NET,您的日期包含地点,它们包含在比较中

    dt1.CompareTo(dt2)
    

    如果要手动执行,则应分别转换为 ToUniversalTime() 然后进行比较。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2015-07-20
      • 2012-12-29
      • 2011-04-28
      • 2021-08-17
      • 2018-05-29
      相关资源
      最近更新 更多