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

时间:2014-11-13 00:55:30

标签: java date format

从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等任何框架。

3 个答案:

答案 0 :(得分:1)

复制到此Custom date format cannot be parsed.

conculsion is SimpelDateFormat不支持微秒,你需要自己的解析器

试试这个

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

答案 1 :(得分:1)

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 - parsing seconds fraction with variable length进行讨论。解决方案是使用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来去除与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

答案 2 :(得分:0)

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