2

从外部服务中,我得到Date+Time字段格式为String' 的对象2012-03-07 12:12:23.547,我需要比较这些字段以获得对象的正确顺序。我很清楚我可以Date通过例如 SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") 创建对象并比较两者Date来实现这一点,但我的问题是我是否可以依靠正确的排序顺序如果我将它们作为字符串进行比较,例如String.compareTo(String)?一些轻度测试给我的印象是它有效,但我想知道是否有人知道它不会给我正确结果的任何情况?此外,比较String's Vs 解析成 Dates 进行比较是否有任何性能考虑、优点或缺点?

4

6 回答 6

5

假设小时是 24 小时格式,那么是的,这是一种可排序的日期/时间格式 - 它的一个众所周知的好处是您可以在不实际解析的情况下进行排序。

一个缺点:如果你得到错误的数据,你不会发现它——你只会把它整齐地分类到“正确”的地方,而忽略了你已经得到(比如说)2 月 30 日的事实。

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

于 2012-03-07T11:26:39.900 回答
2

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

于 2012-03-07T11:26:38.513 回答
2

我不会担心性能,除非你有理由认为这段代码会成为瓶颈(在循环中被多次调用),即使那样我也会等到你可以做一些具体的性能测试。

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

于 2012-03-07T11:27:41.660 回答
2

它提供的工作

  • 您从最重要到最不重要对字段进行排序。
  • 您使用数字字段(不是一月/二月),它们的宽度相同。例如 2:15 在 12:15 之后,但 02:15 在预期之前。注意:对于 9999 之后和 0001 之前的年份,这将不起作用。
  • 您接受可能无法检测到无效日期。
于 2012-03-07T11:28:40.947 回答
1

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

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

于 2012-03-07T11:28:36.467 回答
1

我认为 Date 是比较的,或者可以通过更快的毫秒(长)来比较。这可能是更安全的方式,您无需考虑何时不适合字符串比较。

于 2012-03-07T11:29:14.487 回答