在 Java 中打印持续时间,以便按字典顺序排序

Printing Duration in Java so that it is Sortable Lexicographically

我有一个 Joda Duration 对象的列表。我想将它们转换为一个字符串列表,以便这些字符串对人类来说是可读的,并且该列表可以按字典顺序排序。数据范围从 5 分钟到一周不等。我想到了以下选项:

  1. 毫秒。这是不可排序的,因此不起作用(11 按字典顺序排在 3 之前)并且也不可读。
  2. ISO 8601(25 小时 2 分钟为 0000-00-01T01:02)。这是可排序的,但很难阅读。
  3. ISO 8601 持续时间(与上面相同的示例是 P1DT1H2M)。这既不可读也不可排序。
  4. 类似于 DD:HH:mm(例如 01:01:02)。这有点难读,但至少可以排序。

是否有用于此目的且不会让用户感到惊讶的标准持续时间文本表示?如果是这样,是否有一个标准函数知道如何生成此文本表示?

考虑到您的时间范围从几分钟到几周,我建议您应用 ISO-8601 的替代持续时间格式。该标准明确开发用于提供按字典顺序排序的表示。 Joda-Time 在这里 some support

Duration d = new Duration(100000000L); // in milliseconds
Period p = d.toPeriodFrom(new DateTime(), PeriodType.yearWeekDayTime());
PeriodFormatter f = ISOPeriodFormat.alternateExtendedWithWeeks();
String s = f.print(p);
System.out.println(s); 
// P0000-W00-01T03:46:40 (one day, 3 hours, 46 minutes and 40 secs)

也许年份部分仍然会打扰您,但这只是 ISO 表示,并且始终具有值 0000 和您的持续时间值。

更新和小更正:

澄清一下,严格来说,形式 "Pyyyy-Www-ddThh:mm:ss" 并不是真正的 ISO。如果您阅读了原始的 ISO-8601 论文(第 4.4.3.3 节),那么日历部分只提到了四种替代形式:

  • PYYYY-MM-DD
  • PYYYYMMDD
  • PYYYY-DDD(扩展序数形式)
  • PYYYYDDD(基本序数形式)

因此,Joda-Time 在这里提供的是一项不基于 ISO 标准的发明,但可能对您的目的很方便。