【问题标题】:How to get start and end range from list of timestamps?如何从时间戳列表中获取开始和结束范围?
【发布时间】:2017-09-28 06:43:06
【问题描述】:

我有一个这样的时间戳字符串:

2016-01-14T22:43:55Z
2016-01-15T00:04:50Z
2016-01-15T00:44:59+08:30
2016-01-15T01:25:35-05:00
2016-01-15T01:44:31+08:30
2016-01-15T02:22:45-05:00
2016-01-15T02:54:18-05:00
2016-01-15T03:53:26-05:00
2016-01-15T04:32:24-08:00
2016-01-15T06:31:32Z
2016-01-15T07:06:07-05:00

我想对它们进行排序,以便我可以从上面的时间戳中获取起始范围和结束范围。我的做法如下:

List<String> timestamp = new ArrayList<>();
// adding above string timestamp into this list
// now sort it
Collections.sort(timestamp);

这将为我提供上述时间戳列表中的开始和结束范围。这是正确的方法还是有更好的方法?

timestamp.get(0); // start range
timestamp.get(timestamp.size() - 1); // end range

更新

所以我应该做如下的事情:

List<OffsetDateTime> timestamp = new ArrayList<>();
timestamp.add(OffsetDateTime.parse( "2016-01-15T00:44:59+08:30" ));
// add other timestamp string like above and then sort it
Collections.sort(timestamp);

timestamp.get(0); // start range
timestamp.get(timestamp.size() - 1); // end range

【问题讨论】:

  • 所有时间戳不在同一个时区。按字母顺序排序不会按时间顺序排序。将它们解析为 Instant,并对 Instant 进行排序(或者只找到最小值和最大值:Collections 类也有方法可以做到这一点)。
  • OffsetDateTime 是用于这些字符串的正确类。无需显式转换为Instant,因为OffsetDateTime 具有可比性,并且主要按时间线上的点排序,即即时(其次是区域偏移)。请参阅 Basil Bourque 的回答。 @JBNizet(我当然同意按字符串排序不会给出正确的顺序)
  • 如果你只需要排序后的第一个和最后一个,你可以使用Collections.min()Collections.max()而不是Collections.sort()。如果有很多时间戳,这也会更有效率。该技巧也适用于迄今为止发布的答案。
  • 如果这些时间戳来自your previous question,为什么不保留那里的ZonedDateTime 对象而不是字符串呢?然后排序,或者只是找到第一个和最后一个,将是一件很容易的事。

标签: java sorting date jodatime


【解决方案1】:

OffsetDateTime

将这些 ISO 8601 字符串解析为 java.time.OffsetDateTime 对象。

OffsetDateTime.parse( "2016-01-15T00:44:59+08:30" )

将这些日期时间对象添加到 Collection 并排序。您可能需要List,例如ArrayListSortedSet

java.time 类实现compareTo 方法,以履行它们作为Comparable 的契约。所以这些对象知道如何排序。

像这样:

List<OffsetDateTime> odts = new ArrayList<>();

OffsetDateTime odt = OffsetDateTime.parse( "2016-01-15T00:44:59+08:30" ) ;
odts.add( odt );
… // Parse remaining ISO 8601 strings, adding each new OffsetDateTime object to collection.

Collections.sort( odts );

【讨论】:

  • 现在知道了.. 用详细信息更新了我的问题.. 我现在应该这样做吗?
  • 我应该说是。如果您遇到任何问题,请恢复,我相信我们中的一些人想再看看。
【解决方案2】:

您必须使用比较器。 首先创建一个类并实现Comparator。然后将 value1 和 value2 与您的选择进行比较。之后使用这个类来Collections.sort

问候,a.ayati

【讨论】:

  • 无需实现自己的Comparator。将 ISO 8601 字符串解析为已经知道如何排序的 java.time 对象。
猜你喜欢
  • 2020-11-19
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多