首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >6位微/毫秒java数据格式

6位微/毫秒java数据格式
EN

Stack Overflow用户
提问于 2014-11-13 00:55:30
回答 3查看 13.2K关注 0票数 3

从Postgres数据库,我得到了一个6位微秒(实际上是a),例如2014-11-10 04:05:06.999999

现在,当我应用“yyyy HH:mm:ss.SSS”的日期格式时,它会将999999转换为相应的秒/分钟,从而导致不正确的日期。见下面的代码片段

代码语言:javascript
复制
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等。

EN

回答 3

Stack Overflow用户

发布于 2014-11-13 09:31:43

java.time

使用java.time类,内置于Java8及更高版本中。永远不要使用可怕的遗留日期-时间类,如DateCalendarSimpleDateFormatGregorianCalendarTimestamp

在JDBC4.2及更高版本中,我们可以直接与数据库交换java.time对象。

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

不幸的是,JDBC4.2规范不需要支持两种最常用的类型,即InstantZonedDateTime。无论如何,我们可以很容易地转换为OffsetDateTime,JDBC需要对其提供支持。

代码语言:javascript
复制
OffsetDateTime odt = zdt.toOffsetDateTime() ;

这样的值是时间线上的一个特定点,应该写入类型为TIMESTAMP WITH TIME ZONE的数据库列。

写到数据库。

代码语言:javascript
复制
myPreparedStatement.setObject( … , odt ) ;

以及检索。

代码语言:javascript
复制
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.DateCalendarSimpleDateFormat

要了解更多信息,请参见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类?

票数 5
EN

Stack Overflow用户

发布于 2014-11-13 01:03:31

复制到这一个不能解析自定义日期格式。

结论是SimpleDateFormat不支持微秒,您需要自己的解析器

试试这个:

代码语言:javascript
复制
System.out.println(
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000)
+String.format("%06d", microseconds%1000000));
票数 1
EN

Stack Overflow用户

发布于 2014-11-13 01:03:15

试试dt.substring(0, dt.length() - 3)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26899550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档