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等任何框架。
复制到此自定义日期格式无法解析。
SimpelDateFormat
是SimpelDateFormat
不支持微秒,你需要自己的解析器
试试这个
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)