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 类使用immutable objects,因此我们生成一个新对象而不是更改(变异)原始对象。
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,则上述代码的工作原理是 Date 和 Instant 根据定义使用 UTC。相反,如果您想通过某个地区的wall-clock time 的镜头感知给定的数据,请应用时区。在 Stack Overflow 中搜索 ZoneId 和 ZonedDateTime 类名以获取更多信息。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。