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

use*_*512 4 java format date

从 Postgres 数据库我得到一个 6 位微秒(实际上是一个),例如 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));
Run Code Online (Sandbox Code Playgroud)

结果于 2014-11-10 04:21:45.999

我想截断最后 3 位数字并保留日期2014-11-10 04:05:06.999。如何截断它?我不想使用任何框架,如 joda 等。

Bas*_*que 5

java.time

\n

使用Java 8 及更高版本中内置的java.time类。切勿使用可怕的遗留日期时间类,例如DateCalendarSimpleDateFormatGregorianCalendarTimestamp

\n

从 JDBC 4.2 及更高版本开始,我们可以直接交换java.time与数据库

\n
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.\nLocalDateTime ldt = LocalDateTime.parse( input ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

不是片刻

\n

请注意,a不是LocalDateTime一个时刻,也不是点。您的输入缺少时区或相对于 UTC 的偏移量的上下文。所以我们不知道你的意思是指日本东京 10 日凌晨 4 点,法国图卢兹凌晨 4 点,还是美国俄亥俄州托莱多凌晨 4 点 \xe2\x80\x94 三个截然不同的时刻,在时间轴上相隔几个小时。

\n

因此,您可以将LocalDateTimeobject\xe2\x80\x99s 值存储在 Postgres 数据库类型的列中TIMESTAMP WITHOUT TIME ZONE

\n

片刻

\n

如果您的目的是代表某个时刻,即时间线上的特定点,那么您最确定的是预期的时区。

\n

假设您知道凌晨 4 点应该是日本东京时区。将 a 应用于ZoneId得到LocalDateTimeaZonedDateTime对象。

\n
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;\nZonedDateTime zdt = ldt.atZone( z ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,JDBC 4.2 规范不要求支持两种最常用的类型InstantZonedDateTime。没关系,我们可以轻松转换为OffsetDateTime,这是 JDBC 规范需要支持的。

\n
OffsetDateTime odt = zdt.toOffsetDateTime() ;\n
Run Code Online (Sandbox Code Playgroud)\n

这样的值,时间轴上的特定点,应该写入类型的数据库列TIMESTAMP WITH TIME ZONE

\n

写入数据库。

\n
myPreparedStatement.setObject( \xe2\x80\xa6 , odt ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

和检索。

\n
myResultSet.getObject( \xe2\x80\xa6 , OffsetDateTime.class ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

java.sql.Timestamp

\n

如果您无法迁移到 Java 8,那么您应该使用 JDBC 驱动程序来获取java.sql.Timestamp。该类是一个 hack,但它确实有效。它是一个 java.util.Date,但跟踪小数秒到纳秒而不是毫秒的分辨率。因此它将保留 Postgres 使用的微秒。

\n

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

\n

但您现在真的坚持使用 Java 6、7 或更早的版本吗?最好迁移到 Java 8 或 Java 11,这两个LTS版本。

\n
\n

Java(传统和现代)和标准 SQL 中的日期时间类型表

\n
\n

关于java.time

\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, &SimpleDateFormat

\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n

Joda -Time项目目前处于维护模式,建议迁移到java.time类。

\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 和 JPA 2.2 支持java.timejava.sql.*

\n

从哪里获取 java.time 类?

\n\n