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

时间:2017-12-24 11:57:53

标签: java android datetime-format

我是初学者,正在研究java中的android开发。我有一个列表,其日期和时间为String格式dd/MM/yyyy hh:mm X,其中MM可以是一位数字或两位数字,X可以是任何int.I已经尝试了一切来解决这个问题。你可以用代码帮助我吗?

我的字符串的一些示例是:

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

2 个答案:

答案 0 :(得分:0)

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

您可以使用以下方式确保正确的格式:

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

答案 1 :(得分:0)

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

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;
    }

}

通过这门课你可以做例如

    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 JSR-310的Android后端(来自Java 8)。 this question: How to use ThreeTenABP in Android Project中的更多解释。

对于任何阅读的人(以及针对Android以外的其他人进行编程),{8}内置了java.time。您可以在Java 6和7到ThreeTen Backport中使用它。

问题;为何选择外部图书馆? Android内置了SimpleDateFormat吗?

现代API 所以更好用,而SimpleDateFormat尤其令人烦恼。相反,我建议您今天开始使用面向未来的API。