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