以String格式比较日期

时间:2013-01-02 15:56:13

标签: java date

我得到两个日期作为字符串值,我想检查开始时间是否早于结束时间。我将它们比较为未使用SimpleDateFormat将它们转换为日期,如下所示:

String startTime = "2013-01-02 14:25:56";
String endTime   = "2013-01-02 14:30:56";

if(endTime.compareTo(startTime) > 0){
    System.out.println("End time is greater than start time");
}

是否真的有必要将它们转换为日期并进行比较?我会错过什么吗?我做对了吗?

10 个答案:

答案 0 :(得分:17)

如果日期格式正确,您将缺少的是验证。

如果日期格式化完全,则每次都显示,那么这将有效。如果它可能有所不同,那么解析和比较生成的Date对象将至少增加一些检查。

例如,如果两个日期中的一个碰巧被格式化为2013.01.02 14:30:56,或者它甚至包含未格式化的日期,例如yesterday,那么您的代码会默默地假设某个订单(这很可能与实际订单没什么关系)并继续。它应该做的是通知用户(或日志文件,......)某些期望未得到满足。

答案 1 :(得分:11)

  

是否真的有必要将它们转换为日期并进行比较?

如果您不必包含时区,并且可以确保您始终拥有此格式,则词法顺序将起作用。

  

我会错过什么吗?

你失去了灵活性

  

我做对了吗?

这取决于观点。我在专门的搜索引擎中使用类似的东西(仅出于性能原因)。通常我会转换为日期并比较这些对象。

答案 2 :(得分:8)

这不是好习惯和代码味道。

您丢失了语义正确且可读的代码。 (以及已经说过的可扩展性,时区和其他正确的事情)

您不想比较两个String,想要比较2 Date s - 所以只需这样做,比较两个Date个对象。

如果您创建单元测试并测试比较方法,则永远不会编写一个方法,在每种情况下都能正确地比较2个“字符串” - 日期,而不会将它们转换为日期。

答案 3 :(得分:7)

当且仅当满足以下3个条件时,您可以比较日期时间而不正确解析它:

  1. 日期时间始终采用相同的格式:

    • 相同数量的字段
    • 字段必须是纯数字。 (字符串比较:Jan> AprilWed> Thu)。
    • 字段的大小是固定的(必要时填0)。例如,没有适当的填充将导致10:01< 1:01:的ASCII码比数字大。)
    • 非数字部分(包括分隔符)必须与间距相同。
  2. 字段按单位大小按降序排列(右侧较大,左侧较小)。例如:YEAR-MONTH-DAY HOUR:MINUTE:SECOND.MILISECOND

  3. 他们必须在同一时区。时区信息(如果存在)应具有相同的显示(SGTUTC+8当前是等效的,但字符串比较不知道这一点。请注意,上述 不明确的 条件"相同的时区" 足以比较相等,但要比较大/小,在比较的两个日期之间,时区一定不会发生变化。

答案 4 :(得分:2)

怎么样

  "999-01-01 00:00:00"

"10000-01-01 00:00:00"

答案 5 :(得分:1)

我建议首先将它们转换为日期更安全一点,但只要您确定格式(或时区等)永远不会改变您,那么日期比较并比较该格式字符串应始终等效。

答案 6 :(得分:1)

你的方法很好,因为yyyy-mm-dd hh:ii:ss可以比较为字符串并得到正确的结果,其他日期格式将失败

另一种选择是阅读此stackoverflow问题

How to compare dates in Java?

你只需解析你的字符串并创建日期或日历对象,取决于你想做什么,下面是我认为有用的东西

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

答案 7 :(得分:1)

是的,最好将String转换为Date并进行比较。

  1. 确保它们实际上是有效日期,所以没有20-20-2012。
  2. 转换完成后,只剩下一个数字比较。
  3. 在比较不同格式的日期时,它具有很大的灵活性。
  4. 另一种方法是编写解析每个数字并将其与另一个数字进行比较的代码,这也是同样的工作。

答案 8 :(得分:1)

是否使用Java,您必须首先问以下问题:

  • 您需要比较时间还是几天?
  • 您需要检查TimeZone,还是所有用户都在同一时区(或者您不在乎)

如果您需要比较天数,那么'YYYY-MM-dd'格式的字符串就完美而有效:

'2018-01-23' < '2018-03-21'。始终以任何语言。

有时间且没有时区,然后将时间存储为“ YYYY-MM-dd HH:mm:ss”也很好。

使用时区,那么您必须学习平台(代码和数据库),并了解utc是什么(祝您好运!)。

(根据http://xkcd.com/1179/的CC BY-NC 2.5许可使用。)

答案 9 :(得分:0)

我的日期来自基于字符串的来源,并且始终格式为YYYY-MM-DD,没有时区信息或其他复杂情况。因此,在比较一长串日期时,将它们作为字符串进行比较更简单,更有效,而不是先将它们转换为日期对象。

在我的代码中犯了这个错误之前,这从来都不是问题:

boolean past = (dateStart.compareTo(now) == -1);

这会产生一些不正确的结果,因为compareTo不会仅将值返回为-1,0或1.这是一个简单的修复:

boolean past = (dateStart.compareTo(now) < 0);

我在这里包含了这个问题,因为这是我在弄清楚我做错了什么时发现的SO问题之一。