我有一个表格,用户可以从键盘上输入日期和时间,当输入的时间部分为24:00时,LocalDateTime接受输入,将其转换为第二天.

我的代码

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

val INPUT_DATETIME_PATTERN = "yyyyMMddHHmm"
val formatter = DateTimeFormatter.ofPattern(INPUT_DATETIME_PATTERN)
    
val datetime = "202308102400"

val localdatetime = LocalDateTime.parse(datetime, formatter)
println(datetime)
println(localdatetime.format(formatter))

Expected result:
LocalDateTime.parse throws an exception.
According to documentation, HH stands for hour-of-day (0-23), so 2400 is invalid. Exception is also thrown for input string 202308102401.

Actual result:
202308110000 is printed. Checked in a scratch in Android Studio and in Kotlin playground (link)

推荐答案

事实证明,这是我的错,因为我没有足够注意地阅读文档...谢谢Marco F.为我指出了我错过的东西.

DateTimeResolver是使用ResolverStyle.SMART创建的,默认情况下执行sensible default for each field,例如将24:00解释为"第二天的第一个时刻",或允许最多31个月的值,静默地转换为实际有效的日值.

更正代码以获得预期行为:

val INPUT_DATETIME_PATTERN = "uuuuMMddHHmm"
val formatter = DateTimeFormatter
    .ofPattern(INPUT_DATETIME_PATTERN)
    .withResolverStyle(ResolverStyle.STRICT)

val datetime = "202308102400"

val localdatetime = LocalDateTime.parse(datetime, formatter)
println(datetime)
println(localdatetime.format(formatter))

还请注意,年份说明符从yyyy(纪元年份)更改为uuu(年份),因为严格解析器需要与YearOfEra(source)一起使用纪元.

Kotlin相关问答推荐

如何在 Big Data 中使用Inc过滤器?

在 Kotlin 中定义基于多态函数的泛型函数

Kotlin 中命名构造函数的惯用方式

从 Kotlin 的父类获取函数注解

Mockk:对同一函数进行两次存根会忽略第一个行为

为什么我的通用Kotlin函数中的这个转换未经判断?

始终抛出的函数 - 具有块主体的函数中需要的返回表达式

Kotlin 如何使用其 get 函数在内部检索映射值

如何在 Spring Boot 3 中为内部类提供运行时提示

Kotlin 可空泛型

jlink:在合并模块和 kotlin.stdlib 中打包 kotlin.*

通用接口继承

如何在 Compose 中创建可重用的修饰符?

Kotlin 中多个 init 块的用例?

为什么我在使用 Jetpack Compose clickable-Modifier 时收到后端内部错误:Exception during IR lowering error?

Kotlin 类的调用方法

从代码块执行和返回(在 Elvis 运算符之后)

无法为 retrofit2.Call 调用无参数构造函数

未解决的参考 dagger 2 + kotlin + android gradle

在 Kotlin 中创建非绑定服务