简述
您的问题:
我正在寻找像这样的一句话:
问就有答。将可怕的遗留类 Date
转换为其现代替代品 Instant
。
myJavaUtilDate.toInstant().toString()
2020-05-05T19:46:12.912Z
java.time
在Java 8及以后的版本中,我们有了新的
java.time package内置(
Tutorial)。它受到Joda-Time的启发,由JSR 310定义,并由
ThreeTen-Extra项目扩展。
最好的解决方案是对日期时间对象进行排序,而不是字符串。但如果你必须使用字符串,请继续阅读。
Instant
表示时间轴上的某一时刻,基本上是在UTC(有关详细信息,请参见类文档)。 toString
实现默认使用DateTimeFormatter.ISO_INSTANT
格式。此格式包括零、三、六或九个数字,以显示精度高达纳秒的秒分数。
String output = Instant.now().toString();
如果您必须与旧的
Date
类交互,可以通过向旧类添加新方法来将其转换为/从java.time。例如:
Date :: toInstant
。
myJavaUtilDate.toInstant().toString()
你可能需要使用其他格式化程序,如果你需要小数部分有一致的数字或者不需要小数部分。
如果你想截断秒的小数部分,另一种方法是使用
ZonedDateTime
代替
Instant
,调用它的
方法将小数部分更改为零。
请注意,我们必须为
ZonedDateTime
指定一个时区(因此是这个名称)。在我们的情况下,这意味着UTC。
ZoneID
的子类
ZoneOffset
提供了一个方便的
常量用于UTC。如果我们省略时区,则JVM的
当前默认时区会隐式应用。
String output = ZonedDateTime.now( ZoneOffset.UTC ).withNano( 0 ).toString()
![Table of date-time types in Java, both modern and legacy](https://istack.dev59.com/DJcDS.webp)
关于 java.time
java.time 框架是内置于 Java 8 及更高版本中的。这些类替代了老旧的 legacy 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
要了解更多,请参见
Oracle教程。在Stack Overflow上搜索许多示例和说明。规范是
JSR 310。
Joda-Time项目现在处于
维护模式,建议迁移到
java.time类。
您可以直接使用与JDBC 4.2或更高版本兼容的JDBC驱动程序,将 java.time 对象与数据库交换。无需字符串,无需java.sql.*
类。Hibernate 5和JPA 2.2支持 java.time 。
在哪里获取 java.time 类?
Joda-Time
更新: Joda-Time 项目现在处于维护模式,团队建议迁移到 java.time 类。
我正在寻找一个一行代码的解决方案
如果使用 Joda-Time 2.3 库,这非常容易。ISO 8601 是默认格式。
时区
在下面的代码示例中,请注意我指定了时区而不是依赖于默认时区。在本例中,我根据您的问题指定了 UTC。末尾的 Z
,发音为“Zulu”,表示没有与 UTC 的时区偏移。
示例代码
String output = new DateTime( DateTimeZone.UTC );
输出...
2013-12-12T18:29:50.588Z
yyyy-MM-ddTHH:mm:ss.SSS
)它是与语言环境无关的、可排序的、固定长度的,而且更容易解析。 - Jon SkeetDate
对象的应用程序中可能很常见。 - Adam MatanSimpleDateFormat
做得更好并不难。 - Jon Skeet