从字符串中提取时间格式

时间:2017-12-03 10:20:16

标签: java simpledateformat

我有输入时间字符串,表示各种格式的时间,如"1PM"(格式为:hha),"1300"(格式为:kkmm),我想将其转换为单一格式,说"1300"(kkmm)。

我怎么知道输入时间字符串的格式是什么(hha或kkmm等)?

我知道如何将其转换为所需的格式,但我很难知道输入字符串的格式。

    String inputTime = '1PM';
    SimpleDateFormat inputFormat = new SimpleDateFormat('hha');
    SimpleDateFormat outputFormat = new SimpleDateFormat('kkmm');

    Date date = inputFormat.parse(inputTime);

    String output = outputFormat.format(date);

OUTPUT是:1300。

在这里,我将输入格式作为' hha'在第一行代码中。我想避免这种情况,并从inputTime字符串中提取时间格式。

1 个答案:

答案 0 :(得分:1)

java.time

你有什么特别的理由使用麻烦且久已过时的SimpleDateFormat课程吗?你最好的第一步就是抛弃它。而是使用现代Java日期和时间API LocalTime中的DateTimeFormatterjava.time。该API可以更好地使用。

基本上有两种方法可以解决您的问题。我将使用java.time依次呈现它们。

选项1:查看字符串并确定其格式

进行简单测试以确定使用哪种格式;例如,如果字符串以M结尾,请使用ha,否则使用Hmm

private static DateTimeFormatter formatterWithAmPm
        = DateTimeFormatter.ofPattern("ha", Locale.ENGLISH);
private static DateTimeFormatter formatterWithMinutes
        = DateTimeFormatter.ofPattern("Hmm");

public static LocalTime parseTime(String inputTime) {
    if (inputTime.endsWith("M")) {
        return LocalTime.parse(inputTime, formatterWithAmPm);
    } else {
        return LocalTime.parse(inputTime, formatterWithMinutes);
    } 
}

我很惊讶地看到格式模式字符串Hmm123解析为01:23而1234解析为12:34,但它非常方便。

我认为这个选项最适合几种不变的格式。稍后用其他格式进行扩展并不容易。

选项2:尝试所有相关格式,直到其中一个

依次尝试每种可能的格式,捕获任何异常并查看哪一个没有抛出任何异常。

private static final DateTimeFormatter[] parseFormatters
        = Arrays.asList("ha", "Hmm") // add more format pattern strings as required
            .stream()
            .map(fps -> DateTimeFormatter.ofPattern(fps, Locale.ENGLISH))
            .toArray(DateTimeFormatter[]::new);

public static LocalTime parseTime(String inputTime) {
    DateTimeParseException aCaughtException = null;
    for (DateTimeFormatter formatter : parseFormatters) {
        try {
            return LocalTime.parse(inputTime, formatter);
        } catch (DateTimeParseException dtpe) {
            aCaughtException = dtpe;
            // otherwise ignore, try next formatter
        }
    }
    throw aCaughtException; 
}

请注意检查您是否有两种格式可能匹配相同的输入并产生不同的结果。这也意味着您无法以这种方式区分所有可思考的格式。想象1300表示当天1300分钟即21:40的格式并不是太不合理。它甚至可能意味着当天的第二天1300,00:21:40。