从Postgres数据库,我得到了一个6位微秒(实际上是a),例如2014-11-10 04:05:06.999999
现在,当我应用“yyyy HH:mm:ss.SSS”的日期格式时,它会将999999转换为相应的秒/分钟,从而导致不正确的日期。见下面的代码片段
String dt = "2014-11-10 04:05:06.999999";
String timeseriesFormat = "yyyy-MM-dd HH:mm:ss.SSS";
SimpleDateFormat dateFormat = new SimpleDateFormat(timeseriesFormat);
Date date = dateFormat.parse(dt);
System.out.println(dateFormat.format(date));2014-11-10 04:21:45.999
我想要截取最后3位数字,并保留一个日期为2014-11-10 04:05:06.999。如何截断它?我不想使用任何框架,如joda等。
发布于 2014-11-13 09:31:43
java.time
使用java.time类,内置于Java8及更高版本中。永远不要使用可怕的遗留日期-时间类,如Date、Calendar、SimpleDateFormat、GregorianCalendar和Timestamp。
在JDBC4.2及更高版本中,我们可以直接与数据库交换java.time对象。
String input = "2014-11-10 04:05:06.999999".replace( " " , "T" ) ; // Convert from SQL style to ISO 8601 standard format where `T` separates the year-month-day portion from hour-minute-second portion.
LocalDateTime ldt = LocalDateTime.parse( input ) ;一刹那
请注意,LocalDateTime不是一个瞬间,也不是时间线上的一个点。您的输入缺少时区的上下文或与UTC相距的内容。所以我们不知道你的平均上午4点在日本东京,4点在法国图卢兹,4点在俄亥俄州托莱多,三个非常不同的时刻,相隔几个小时。
因此,您需要将LocalDateTime对象的值存储在TIMESTAMP WITHOUT TIME ZONE类型的Postgres数据库列中。
片刻
如果您的意图是表示时间线上的某个时刻,那么您最了解的是特定的时区。
假设你知道凌晨4点应该在东京日本时区。将ZoneId应用于LocalDateTime以获取ZonedDateTime对象。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;不幸的是,JDBC4.2规范不需要支持两种最常用的类型,即Instant和ZonedDateTime。无论如何,我们可以很容易地转换为OffsetDateTime,JDBC需要对其提供支持。
OffsetDateTime odt = zdt.toOffsetDateTime() ;这样的值是时间线上的一个特定点,应该写入类型为TIMESTAMP WITH TIME ZONE的数据库列。
写到数据库。
myPreparedStatement.setObject( … , odt ) ;以及检索。
myResultSet.getObject( … , OffsetDateTime.class ) ;java.sql.Timestamp
如果您不能迁移到Java 8,那么您应该使用您的JDBC驱动程序来获取一个java.sql.Timestamp对象。那门课是个黑客,但很管用。它是一个java.util.Date,但是跟踪小数秒到分辨率的纳秒而不是毫秒。因此它将保留Postgres使用的微秒。
您可以使用它作为一个java.util.Date,但在其他情况下,您将失去额外的分辨率。
但是,您现在真的使用Java 6、7或更早的时候吗?最好是迁移到Java 8或Java 11,这是两个LTS版本。

关于java.time
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。Hibernate 5&JPA2.2支持java.time。
在哪里获得java.time类?
发布于 2014-11-13 01:03:31
复制到这一个不能解析自定义日期格式。
结论是SimpleDateFormat不支持微秒,您需要自己的解析器
试试这个:
System.out.println(
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000)
+String.format("%06d", microseconds%1000000));发布于 2014-11-13 01:03:15
试试dt.substring(0, dt.length() - 3)
https://stackoverflow.com/questions/26899550
复制相似问题