Java:将日期比较为字符串是否可以

时间:2012-03-07 11:24:18

标签: java string compareto

在外部服务中,我将Date+Time字段的对象格式为String 2012-03-07 12:12:23.547,我需要比较这些字段以获得对象的正确顺序。我很清楚我可以通过以下方式创建Date个对象SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”)并比较两个Date以实现此目的但我的问题是,如果我将它们作为字符串进行比较,我是否可以依赖正确的排序顺序比如String.compareTo(String)?一些光测试给我的印象是它有效,但我想知道是否有人知道任何情况下它不会给我正确的结果?此外,将String的Vs解析与日期进行比较以进行比较是否存在任何性能因素,优缺点?

6 个答案:

答案 0 :(得分:5)

假设小时是24小时格式,那么是,这是一种可排序的日期/时间格式 - 其众所周知的好处之一是您可以排序而无需实际解析。

一个缺点:如果你得到不好的数据,你就不会发现它 - 你只是整齐地将它排序到“正确”的地方,而忽略了你已经被给予(比如说)2月30日的事实。 p>

如果您稍后需要值作为日期/时间,那么我先解析它然后进行比较。但是如果在排序方面需要这个,那么字符串比较可能比解析所有内容更快。当然值得基准测试......尤其是在同一天比较两个字符串时需要多个字符值得检查,而如果你已经解析过它,那么你可能只需比较long值。

答案 1 :(得分:2)

不,更好的方法是在日期对象中解析字符串,然后与其他日期对象进行比较。

答案 2 :(得分:2)

我不担心性能,除非你有理由认为这段代码会成为瓶颈(在循环中多次调用),即便如此,我还要等到你能做一些具体的性能测试。

将它们作为日期进行比较将使您的代码更清晰,并且意味着您可以在以后更轻松地更改日期格式(对于不作为字符串排序的内容)。

答案 3 :(得分:2)

它提供了

  • 您可以将字段从最重要的字段排序到最不重要的字段。
  • 您使用数字字段(不是Jan / Feb),它们的宽度相同。例如2:15是在12:15之后,但02:15是在预期之前。注意:在9999之后和0001之前的年份,这将无效。
  • 您接受可能无法检测到无效日期。

答案 4 :(得分:1)

使用它所代表的类型 - 在这种情况下,它是一个日期,所以使用日期。通过将日期添加到集合并在日期上执行Collections.sort(日期),可以按时间顺序轻松地对日期进行排序。

请参阅http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

答案 5 :(得分:1)

我认为比较日期或可以通过毫秒(长)进行比较,这更快。这可能是更安全的方式,你不需要考虑字符串比较何时不适合。