是否有一个标准机构或特定的规范方式应该如何在实践中实现与时间相关的事情(例如 ICU 用于 Unicode 相关任务),或者这是目前的“尽力而为”,这取决于多少努力、时间和金钱语言和图书馆实现者想花钱吗?
是否有特定且完整的实现可以作为如何处理与时间相关的事情的示例?
你认为哪个现有的图书馆是一个坏的、一个体面的或一个好的例子?
最佳答案
我将尝试使用可能成为 Java 7 一部分的 Java 库来回答第二和第三个问题。
javax.time.* (JSR 310)
这些类是对 JodaTime 的完全重写,试图修复 util.Date
的设计缺陷/util.Time
以及 JodaTime。
JSR 310 试图提供一个全面的日期和时间模型,它是类型安全和自记录的。它可与现有类互操作,但也考虑基于 XML 和 DBMS 的用例。
这些类是最终的、不可变的、线程安全的,并且在构造后不能修改。实例是通过一组丰富的工厂方法创建的,这些方法可以在后台缓存事物。
LocalDate dateToday = LocalDate.of(2010, 9, 14);
LocalDate oneMonthLater = dateToday.with(OCTOBER);
LocalDate oneYearLater = dateToday.withYear(2011);
API 有一些“面向机器”的类和一些“面向人类”的类:
面向机器的
Instant
与 Unix 或 Java 时间戳相当的时间点。其实还有
Instant
, TAIInstant
和 UTCInstant
这使人们能够准确地选择他们需要的时间定义。 e. “基于天”,“线性,无闰秒”等。Duration
不一定与特定日期或日历相关联的时间范围。
以人为本
有丰富的类集合可以处理不同的用例,例如仅日期、仅时间、时间和日期、带和不带时区、带和不带 DST。
DateProvider
OffsetDate
, LocalDate
(, java.sql.Date
兼容性)TimeProvider
OffsetTime
, LocalTime
(, java.sql.Time
兼容性)DateTimeProvider
ZonedDateTime
, OffsetDateTime
, LocalDateTime
(, java.util.GregorianCalendar
兼容性)InstantProvider
Instant
, ZonedDateTime
, OffsetDateTime
(, java.util.Date
兼容性)Period
句点代表一个时间跨度,如“5 天”,可以从日期/时间中添加和减去。
Matcher
匹配器启用诸如“这个日期是 2006 年吗?”这样的查询。或“这一天是今年的最后一天吗”。
Adjuster
如果您想要进行更复杂的更改,例如“给我本月的最后一天!”或“圣诞节后的第二个星期二,拜托!”。
Resolver
解析器允许用户定义如果某个日期无效(例如 2010 年 2 月 31 日)会发生什么:
DateResolver previous = DateResolvers.previousValid();
LocalDate date = date(2010, 2, 30, previous);
// date = 2010-02-28
处理时区和 DST 数据
可以使用当前时区数据或序列化时的时区数据来序列化这些类并反序列化它们。
此外,可以比较来自不同时区的规则:可以查明 DST 规则是否已更改,例如。 G。版本 2010e 和 2010f 之间的日期在伦敦或莫斯科,并决定如果时间处于间隙或重叠时应该做什么。
日历系统
虽然一切都是基于ISO-8601 ,提供希伯来语、Hijrah、日语、ThaiBuddist 等时间系统的简单日历。
格式化和解析
toString()
返回 ISO8601 和类似 SimpleDateFormat
中的模式和更高级的支持。集成
java.util.*
) 引用文献:
关于c# - 不同编程语言的库如何处理日期和时间、时间戳和持续时间、闰秒和 - 年、DST 和时区,...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3709870/