java日期格式,6位微/毫秒

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

现在当我应用日期格式“yyyy-MM-dd 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等任何框架。

复制到此自定义日期格式无法解析。

SimpelDateFormatSimpelDateFormat不支持微秒,你需要自己的解析器

试试这个

 System.out.println( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000) +String.format("%06d", microseconds%1000000)); 

java.sql.Timestamp

您应该使用JDBC驱动程序来获取java.sql.Timestamp对象。 那个类是一个黑客,但它的工作原理。 它是一个java.util.Date,但跟踪分数秒到分辨率为纳秒而不是毫秒。 因此它将保留Postgres使用的微秒。

您可以将它用作java.util.Date,但在其他情况下,您将失去额外的分辨率。

java.time

提示:查看Java 8中内置的java.time包。它提供了一个完整的日期时间库,其对象具有纳秒分辨率。 java.sql.Timestamp类具有来回转换的方法。

请注意,在java.time中,格式化程序编码的解析模式字符串不适用于可变数量的小数位数。 请参阅此问题, JSR-310 – 解析具有可变长度的秒分数以供讨论。 解决方案是使用DateTimeFormatterBuilder对象来表示我们期望任意数量的零个,一个或多个数字(最多九个)为小数秒。

 String input = "2014-11-10 04:05:06.999999"; DateTimeFormatter formatter = new DateTimeFormatterBuilder () .appendPattern ( "yyyy-MM-dd HH:mm:ss" ) .appendFraction ( ChronoField.NANO_OF_SECOND , 0 , 9 , true ) // Nanoseconds = 0-9 digits of fractional second. .toFormatter (); 

我们的输入字符串没有时区也没有从UTC偏移。 因此,我们必须首先处理“本地”日期时间,而不是与时间轴上的时刻相关联。

 LocalDateTime localDateTime = LocalDateTime.parse ( input , formatter ); 

让我们通过应用UTC的偏移量将它与时间线联系起来。 我将假设在本课题的情况下,预期的偏移量是UTC本身。

 OffsetDateTime odt = localDateTime.atOffset ( ZoneOffset.UTC ); 

最后,我们想要转换为java.sql类型,以实际与数据库进行通信。 为此我们必须在时间轴上得到一个Instant ,一个时刻,总是按照定义的UTC。 您可以将OffsetDateTime视为Instant 加上与UTC的偏移量。 要转换为java.sql,我们需要通过提取一个简单的Instant来剥离offset-from-UTC组件。

 Instant instant = odt.toInstant (); java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ); 

转储到控制台。

 System.out.println ( "input: " + input + " | localDateTime: " + localDateTime + " | odt: " + odt + " | instant: " + instant + " | ts: " + ts ); 

输入:2014-11-10 04:05:06.999999 | localDateTime:2014-11-10T04:05:06.999999 | odt:2014-11-10T04:05:06.999999Z | 时间:2014-11-10T04:05:06.999999Z | ts:2014-11-09 20:05:06.999999

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