LocalTime 未正确解析 00:00
LocalTime does not parse 00:00 correctly
我正在尝试使用 LocalTime
解析“Mon 00:00-23:59”。
LocalTime start = LocalTime.parse("00:00", DateTimeFormatter.ofPattern("HH:mm"));
LocalTime end = LocalTime.parse("23:59", DateTimeFormatter.ofPattern("HH:mm"));
但是,start.isBefore(end)
returns真的,这怎么可能?
我正在尝试比较本地时间以在解析用户输入后检查开始总是在结束之前,否则它应该向用户抛出错误。
已解决: 我意识到这需要 LocalDateTime 或 Date 才能比较日期,因为存在诸如 00:00.[=14 之类的极端情况=]
您的问题与解析无关。
而且,您看到的行为是一项功能,而不是错误。
LocalTime
表示一个假想的通用 24 小时长的一天中的时间。那天从 00:00:00.0 开始。所以所有其他值都是在那个零时间值之后。
所以这应该 return true
:
LocalTime.parse( "00:00" ).isBefore( LocalTime.parse( "23:59" ) ) // true.
请注意,在我们的政治定义的计时系统中,日子不一定是 24 小时,也不一定从 00:00 开始。有些天可能是 23、23.5、25 或其他小时数。并且某些时区的某些日期可能会在 01:00.
等时间开始
顺便说一句,请注意,当输入符合日期时间文本值的 ISO 8601 标准时,无需指定 DateTimeFormatter
。
注意
- 现代日期时间 API 基于 ISO 8601 并且不需要明确使用
DateTimeFormatter
对象,只要日期时间字符串符合 ISO 8601 标准.您的时间字符串采用 ISO 8601 格式。
- 当地时间,
00:00
对应12:00 AM
而23:59
对应11:59 PM
,很明显00:00
早于23:59
.所以,你得到的结果是正确的。
为避免混淆,我建议您附上当地时间的日期,即使用 LocalDateTime
。
演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
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("hh:mm a", Locale.ENGLISH);
LocalTime start = LocalTime.parse("00:00");
LocalTime end = LocalTime.parse("23:59");
System.out.println(start.format(dtf));
System.out.println(end.format(dtf));
LocalDate today = LocalDate.now();
LocalDateTime ldtStart = start.atDate(today);
LocalDateTime ldtEnd = end.atDate(today);
System.out.println(ldtStart);
System.out.println(ldtEnd);
// Notice the result when you add a minute to ldtEnd
System.out.println(ldtEnd.plusMinutes(1));
}
}
输出:
12:00 AM
11:59 PM
2021-10-30T00:00
2021-10-30T23:59
2021-10-31T00:00
详细了解 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
。
我正在尝试使用 LocalTime
解析“Mon 00:00-23:59”。
LocalTime start = LocalTime.parse("00:00", DateTimeFormatter.ofPattern("HH:mm"));
LocalTime end = LocalTime.parse("23:59", DateTimeFormatter.ofPattern("HH:mm"));
但是,start.isBefore(end)
returns真的,这怎么可能?
我正在尝试比较本地时间以在解析用户输入后检查开始总是在结束之前,否则它应该向用户抛出错误。
已解决: 我意识到这需要 LocalDateTime 或 Date 才能比较日期,因为存在诸如 00:00.[=14 之类的极端情况=]
您的问题与解析无关。
而且,您看到的行为是一项功能,而不是错误。
LocalTime
表示一个假想的通用 24 小时长的一天中的时间。那天从 00:00:00.0 开始。所以所有其他值都是在那个零时间值之后。
所以这应该 return true
:
LocalTime.parse( "00:00" ).isBefore( LocalTime.parse( "23:59" ) ) // true.
请注意,在我们的政治定义的计时系统中,日子不一定是 24 小时,也不一定从 00:00 开始。有些天可能是 23、23.5、25 或其他小时数。并且某些时区的某些日期可能会在 01:00.
等时间开始顺便说一句,请注意,当输入符合日期时间文本值的 ISO 8601 标准时,无需指定 DateTimeFormatter
。
注意
- 现代日期时间 API 基于 ISO 8601 并且不需要明确使用
DateTimeFormatter
对象,只要日期时间字符串符合 ISO 8601 标准.您的时间字符串采用 ISO 8601 格式。 - 当地时间,
00:00
对应12:00 AM
而23:59
对应11:59 PM
,很明显00:00
早于23:59
.所以,你得到的结果是正确的。
为避免混淆,我建议您附上当地时间的日期,即使用 LocalDateTime
。
演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
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("hh:mm a", Locale.ENGLISH);
LocalTime start = LocalTime.parse("00:00");
LocalTime end = LocalTime.parse("23:59");
System.out.println(start.format(dtf));
System.out.println(end.format(dtf));
LocalDate today = LocalDate.now();
LocalDateTime ldtStart = start.atDate(today);
LocalDateTime ldtEnd = end.atDate(today);
System.out.println(ldtStart);
System.out.println(ldtEnd);
// Notice the result when you add a minute to ldtEnd
System.out.println(ldtEnd.plusMinutes(1));
}
}
输出:
12:00 AM
11:59 PM
2021-10-30T00:00
2021-10-30T23:59
2021-10-31T00:00
详细了解 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
。