如何使用 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
请注意,对于格式设置,单个字母 H
适用于单个小时和两位数小时。 m
和 s
的情况也类似。
您应该始终牢记的另一件事是日期时间格式类型是 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
。
我在使用 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
请注意,对于格式设置,单个字母 H
适用于单个小时和两位数小时。 m
和 s
的情况也类似。
您应该始终牢记的另一件事是日期时间格式类型是 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
。