tl;博士
从小数秒开始。
myJavaUtilDate.toInstant() // Convert from legacy class to modern class. Returns a `Instant` object.
.truncatedTo( ChronoUnit.SECONDS ) // Generate new `Instant` object based on the values of the original, but chopping off the fraction-of-second.
生成 .String
myJavaUtilDate.toInstant() // Convert from legacy class to modern class. Returns a `Instant` object.
.atOffset( ZoneOffset.UTC ) // Return a `OffsetDateTime` object.
.format( DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ). // Ask the `OffsetDateTime` object to generate a `String` with text representing its value, in a format defined in the `DateTimeFormatter` object.
避免使用旧日期时间类
您正在使用麻烦的旧日期时间类,现在是遗留的,已被java.time类所取代。
Instant
通过调用添加到旧类的新方法,将旧对象转换为 。java.util.Date
java.time.Instant
Instant instant = myJavaUtilDate.toInstant() ;
截断
如果要更改数据本身的值以删除几分之一秒,则可以截断。java.time类使用不可变对象,因此我们生成一个新对象,而不是更改(改变)原始对象。
Instant instantTruncated = instant.truncatedTo( ChronoUnit.SECONDS );
生成字符串
如果只想在生成表示日期时间值的字符串时禁止显示小数秒,而不是截断,请定义一个格式化程序以满足您的需求。
例如,“uuuu-MM-dd HH:mm:ss”没有提到小数秒,因此数据中包含的任何毫秒都不会出现在生成的字符串中。
转换为 的格式更灵活。Instant
OffsetDateTime
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC )
String output = odt.format( f );
时区
请注意,您的问题忽略了时区问题。如果您打算使用 UTC,则上述代码的工作原理是两者兼而有之,并且根据定义采用 UTC 格式。相反,如果您想通过某个区域的挂钟时间的镜头来感知给定的数据,请应用时区。在“堆栈溢出”和“类名”中搜索“堆栈溢出”以获取更多信息。Date
Instant
ZoneId
ZonedDateTime
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。