如何整理具有两种格式的字符串日期和时间的列表?

How to sort out a list having string date and time in two formats?

我是初学者,在 java.I 从事 android 开发,有一个日期和时间列表,格式为 String dd/MM/yyyy hh:mm X,其中 MM 可以是单个数字数字或两位数,X 可以是任何数字 int.I 已经尝试了所有方法来排序 out.Can 你能帮我写代码吗?

我有一些字符串示例:

 "02/08/2017 13:00 198"
 "02/7/2018 08:00 75"
 "04/12/2014 19:00 5"

我认为最简单的解决方案之一是通过确保当 MM 是单个数字时我们在 MM 前面加上 0 来统一格式。然后你可以用常规排序对它们进行排序。

您可以通过以下方式确保格式正确:

String unify(String s) {
  if (s.charAt(4) != '/') {
    return s;
  }
  return s.substring(0, 3) + "0" + s.substring(3);
}

可以使用自定义比较器对字符串进行排序,如 中提到的 haaawk(可能很快就会在答案中)。这意味着每次比较两个字符串时都要解析字符串,如果字符串很多,这可能是一种明显的浪费。相反,我建议使用包含字符串和已解析日期时间的自定义 class。

public class StringWithDateTime implements Comparable<StringWithDateTime> {

    private static final DateTimeFormatter FORMATTER
            = DateTimeFormatter.ofPattern("dd/M/uuuu HH:mm");

    private String dateTimeAndInt;
    /**
     * (Premature?) optimization: the dateTime from the string
     * to avoid parsing over and over
     */
    private LocalDateTime dateTime;

    public StringWithDateTime(String dateTimeAndInt) {
        this.dateTimeAndInt = dateTimeAndInt;
        // parse the date-time from the beginning of the string
        dateTime = LocalDateTime.from(
                FORMATTER.parse(dateTimeAndInt, new ParsePosition(0)));
    }

    @Override
    public int compareTo(StringWithDateTime other) {
        return dateTime.compareTo(other.dateTime);
    }

    @Override
    public String toString() {
        return dateTimeAndInt;
    }

}

有了这个class你可以做例如

    List<StringWithDateTime> listWithDateTimes = Arrays.asList(
                new StringWithDateTime("02/08/2017 13:00 198"),
                new StringWithDateTime("02/7/2018 08:00 75"),
                new StringWithDateTime("04/12/2014 19:00 5")
            );
    Collections.sort(listWithDateTimes);
    listWithDateTimes.forEach(System.out::println);

代码段的输出是按时间顺序排列的原始字符串:

04/12/2014 19:00 5
02/08/2017 13:00 198
02/7/2018 08:00 75

继续以这种方式对更多字符串进行排序。

使用 DateTimeFormatter,而格式模式字符串中的 MM 将需要 2 位数的月份,而 M 将同时匹配 1 位数和 2 位数的月份,因为在您的格式的不同变体中。

java.time

问题:您使用的是 java.time,现代 Java 日期和时间 API — 这在我的 Android 设备上有效吗?

会的。新的 API 被称为 JSR-310。要在 Android 上使用它,请获取 ThreeTenABP the Android backport of JSR-310 (from Java 8). More explanation in .

对于阅读的任何人(以及为 Android 以外的东西编程),java.time 内置于 Java 8 及更高版本中。您可以在 Java 6 和 7 到 ThreeTen Backport.

中使用它

问题;为什么是外部图书馆? Android 不是内置了 SimpleDateFormat 吗?

现代 API 所以 更好用,尤其是 SimpleDateFormat 是出了名的麻烦。相反,我建议您今天开始使用面向未来的 API。