以String格式比较日期

Sur*_*nga 18 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");
}
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 17

您将缺少的是验证日期是否格式正确.

如果日期格式与您每次显示的格式完全相同,那么这将起作用.如果它可能有所不同,那么解析和比较结果Date对象将至少增加一些检查.

例如,如果一个两个日期碰巧被格式化为2013.01.02 14:30:56或者甚至包括一个未格式化的日期,例如yesterday你的代码会默默地承担了部分的顺序(即最有可能有一点与实际为了做到),并继续进行.它应该做的是通知用户(或日志文件,......)某些期望未得到满足.

  • 好点子.字符串比较的另一个更微妙的区别可能是你比较`2013-01-01 08:42:42`和`2013-01-01 8:42:42`并期望它们是平等的. (3认同)

sta*_*ker 11

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

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

我会错过什么吗?

你失去了灵活性

我做对了吗?

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


bur*_*rna 8

这不是一个好习惯和代码味道.

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

你不想比较两个Strings,你想要比较2 Date秒 - 所以这样做,比较两个Date对象.

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


nha*_*tdh 7

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

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

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

  3. 他们必须在同一时区.时区信息(如果存在)应该具有相同的表示(SGT并且UTC+8当前是等效的,但字符串比较不会知道这一点).注意,上述模糊条件"相同时区"足以比较相等,但为了比较大/小,在比较的两个日期之间必须没有时区发生变化.