我将扩展 JeroenWyseur 的 correct answer。
ISO 8601
ISO 8601 标准格式绝对是序列化日期时间值以进行数据交换的最佳方式。这种格式对不同文化的人们来说是明确的、直观的,并且在世界各地越来越普遍。人类和机器都易于阅读。
2015-01-16T20:15:43+02:00
2015-01-16T18:15:43Z
第一个示例的偏移量比 UTC 早两个小时。第二个例子展示了Z(“Zulu”)的常见用法来表示UTC,是+00:00的缩写。
java.time
与 Java 捆绑在一起的 java.util.Date 和 .Calendar 类是出了名的麻烦、混乱和缺陷。避开他们。而是使用:
- java.time 包,内置于 Java 8,灵感来自 JSR 310 定义的 Joda-Time。
java.time 包取代了它的前身 Joda-Time 库。
默认情况下,这两个库都使用 ISO 8601 来解析和生成日期时间值的字符串表示形式。
请注意,java.time 通过附加 proper name of the time zone 扩展了 ISO 8601 格式,例如 2007-12-03T10:15:30+01:00[Europe/Paris]。
在 StackOverflow.com 上搜索数百个问题和答案,其中包含大量讨论和示例代码。
避免 Count-From-Epoch
其他一些答案建议使用数字,从epoch 开始计数。这种方法不实用。这不是不言而喻的。它不是人类可读的,使调试变得麻烦且令人沮丧。
它是哪个数字,Unix 中常用的整秒,java.util.Date 和 Joda-Time 中使用的毫秒,Postgres 等数据库中常用的微秒,或java.time package 中使用的纳秒?
couple dozen epochs 中的哪一个,1970 年的第一刻在 Unix 中使用,第一年在 .Net 和 Go 中使用,“1900 年 1 月 0 日”在数百万(数十亿?)的 Excel 和 Lotus 电子表格中使用,或 1 月 1 日, 2001 被Cocoa使用?
有关类似问题的更多讨论,请参见 my answer。
LocalDate
我正在通过 Web 服务传递一些对象,其中一些包含 java.sql.Date
可怕的java.sql.Date 类的替代品是java.time.LocalDate。
最好完全避免使用遗留类,但您可以通过调用添加到旧类的新方法来回转换:myJavaSqlDate.toLocalDate()
序列化LocalDate
LocalDate 类实现了Serializable。所以你应该没有问题自动序列化,编组和解组。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。