如何使用 LocalTime.parse 解析任何格式的时间?

How to parse time in any format with LocalTime.parse?

我在使用 java 的 LocalTime 解析包含小时、分钟和秒的字符串时遇到问题。

LocalTime t = LocalTime.parse("8:30:17"); // Simplification

这将引发以下异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '8:30:17' could not be parsed at index 0

您需要像这样传入自定义 DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("H:mm:ss");
LocalTime t = LocalTime.parse(times.get(i), formatter);

查看 the docs,因为您需要使用的字母可能不同。

您需要使用 DateTimeFormatter 为解析器提供要解析的格式模式。

DateTimeFormatter formatter =DateTimeFormatter.ofPattern("H:mm:ss");
LocalTime t = LocalTime.parse(times.get(i), formatter);

格式字母格式:

H       hour-of-day (0-23)
m       minute-of-hour
s       second-of-minute            
h       clock-hour-of-am-pm (1-12)

来自 LocalTime.parse 文档:

The string must represent a valid time and is parsed using DateTimeFormatter.ISO_LOCAL_TIME.

根据 ISO_LOCAL_TIME 文档,小时的条件是这样的:

Two digits for the hour-of-day. This is pre-padded by zero to ensure two digits.

您正在解析值 8:30:17,一位而不是两位数,因此您打破了条件,导致错误。

默认格式化程序需要 ISO 格式,其中每个小时、分钟和秒使用 2 位数字。

如果你想解析你显示的时间,它只有一个小时数,你需要提供一个自定义格式化程序(注意单个 H):

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("H:mm:ss");
LocalTime t = LocalTime.parse(times.get(i), formatter);

默认情况下,LocalTime#parse parses the input string using DateTimeFormatter.ISO_LOCAL_TIME其格式包括:

  • Two digits for the hour-of-day. This is pre-padded by zero to ensure two digits.
  • A colon
  • Two digits for the minute-of-hour. This is pre-padded by zero to ensure two digits.
  • If the second-of-minute is not available then the format is complete.
  • A colon
  • Two digits for the second-of-minute. This is pre-padded by zero to ensure two digits.
  • If the nano-of-second is zero or not available then the format is complete.
  • A decimal point
  • One to nine digits for the nano-of-second. As many digits will be output as required.

由于您输入的字符串不是这种格式,所以您遇到了异常。您可以使用允许您指定自定义格式的 DateTimeFormatter 来绕过异常。您可以使用 H:m:s 作为格式。

演示:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:m:s", Locale.ENGLISH);
        LocalTime t = LocalTime.parse("8:30:17", dtf);
        System.out.println(t);
    }
}

输出:

08:30:17

ONLINE DEMO

请注意,对于格式设置,单个字母 H 适用于单个小时和两位数小时。 ms 的情况也类似。

您应该始终牢记的另一件事是日期时间格式类型是 Locale 敏感的,因此您在使用它们时应始终指定适用的 Locale。检查 Never use SimpleDateFormat or DateTimeFormatter without a Locale 以了解更多信息。

详细了解 modern Date-Time API* from Trail: Date Time


* 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time