如何正确处理 Android 上的日期
How to correctly work with dates on Android
我正在使用 Kotlin 开发一个 Android 项目,我们需要从设备和后端对日期执行验证。到目前为止,我们一直在使用 Date class 来表示日期,使用 SimpleDateFormat class 来解析字符串和格式化日期,使用 Calendar class 来对日期执行操作,例如获取日期来自 x 天前之类的东西。我发现一些资源指出处理日期的正确方法是使用 java.time 包(classes,例如 LocalDateTime、LocalTime 等)。我有兴趣确切地知道处理日期(从解析到格式化)的正确方法应该是什么,以及我是否需要考虑时区。我见过类似的问题,但其中 none 确实总结了我想知道的内容。
正确的工作方式
要正确处理日期和时间,您需要了解日期和时间是什么以及它们在用户现实生活中的行为方式。正确工作与使用这个或其他库 class 无关。根据您从事的工作,您需要了解闰年、and/or 儒略历、公历和公历 and/or 许多不同的阳历和阴历系统。
要正确处理时间,几乎没有办法避免将时区考虑在内。对于时区的介绍,我推荐我 link 在底部的视频。它很有趣,并且很好地解释了基础知识。
推荐的库class要使用
绝对推荐使用 java.time,现代 Java 日期和时间 API,用于日期和时间工作。与 Java 1.0 和 1.1 中的过时日期和时间 classes 相比,一些差异是:
- 旧的 classes 假装有些事情很简单,但实际上并不简单,一些程序员没有意识到正确处理日期和时间的复杂性,并在他们的代码中留下未被发现的错误。在许多情况下,现代 classes 会迫使程序员决定我们想要什么,从而为无意的错误留下更小的空间。我们必须决定我们是想要一个日期还是一个时间或两者,我们想要哪个时区等等。
- 按照同样的思路,旧的 classes 假装日期和时间相同,可以认为有或没有时区,这是不正确的。相信它会导致极端情况下的各种错误。使用 java.time 你需要在
LocalDate
、Instant
、ZonedDateTime
和许多其他日期时间 class 之间进行选择,一开始可能会觉得很麻烦,但是这将使您的代码更清晰并提高它也是正确的机会。
- 在许多情况下,旧的 classes 接受垃圾 input/arguments,同样允许未检测到明显的错误。现代 classes 在验证方面做得更好。
- 旧的 classes 通常不是线程安全的。现代的是。
链接
- YouTube 视频:The Problem with Time & Timezones - Computerphile
- Oracle Tutorial: Date Time
- Oracle 技术文章Java SE 8 Date and Time
- Still using java.util.Date? Don’t! 关于编程提示
- What's wrong with Java Date & Time API? [closed]
- Jon Skeet’s answer to Why is January month 0 in Java Calendar?;有趣的部分是答案后半部分的编辑
我正在使用 Kotlin 开发一个 Android 项目,我们需要从设备和后端对日期执行验证。到目前为止,我们一直在使用 Date class 来表示日期,使用 SimpleDateFormat class 来解析字符串和格式化日期,使用 Calendar class 来对日期执行操作,例如获取日期来自 x 天前之类的东西。我发现一些资源指出处理日期的正确方法是使用 java.time 包(classes,例如 LocalDateTime、LocalTime 等)。我有兴趣确切地知道处理日期(从解析到格式化)的正确方法应该是什么,以及我是否需要考虑时区。我见过类似的问题,但其中 none 确实总结了我想知道的内容。
正确的工作方式
要正确处理日期和时间,您需要了解日期和时间是什么以及它们在用户现实生活中的行为方式。正确工作与使用这个或其他库 class 无关。根据您从事的工作,您需要了解闰年、and/or 儒略历、公历和公历 and/or 许多不同的阳历和阴历系统。
要正确处理时间,几乎没有办法避免将时区考虑在内。对于时区的介绍,我推荐我 link 在底部的视频。它很有趣,并且很好地解释了基础知识。
推荐的库class要使用
绝对推荐使用 java.time,现代 Java 日期和时间 API,用于日期和时间工作。与 Java 1.0 和 1.1 中的过时日期和时间 classes 相比,一些差异是:
- 旧的 classes 假装有些事情很简单,但实际上并不简单,一些程序员没有意识到正确处理日期和时间的复杂性,并在他们的代码中留下未被发现的错误。在许多情况下,现代 classes 会迫使程序员决定我们想要什么,从而为无意的错误留下更小的空间。我们必须决定我们是想要一个日期还是一个时间或两者,我们想要哪个时区等等。
- 按照同样的思路,旧的 classes 假装日期和时间相同,可以认为有或没有时区,这是不正确的。相信它会导致极端情况下的各种错误。使用 java.time 你需要在
LocalDate
、Instant
、ZonedDateTime
和许多其他日期时间 class 之间进行选择,一开始可能会觉得很麻烦,但是这将使您的代码更清晰并提高它也是正确的机会。 - 在许多情况下,旧的 classes 接受垃圾 input/arguments,同样允许未检测到明显的错误。现代 classes 在验证方面做得更好。
- 旧的 classes 通常不是线程安全的。现代的是。
链接
- YouTube 视频:The Problem with Time & Timezones - Computerphile
- Oracle Tutorial: Date Time
- Oracle 技术文章Java SE 8 Date and Time
- Still using java.util.Date? Don’t! 关于编程提示
- What's wrong with Java Date & Time API? [closed]
- Jon Skeet’s answer to Why is January month 0 in Java Calendar?;有趣的部分是答案后半部分的编辑