从 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 等。
使用Java 8 及更高版本中内置的java.time类。切勿使用可怕的遗留日期时间类,例如Date、Calendar、SimpleDateFormat、GregorianCalendar和Timestamp。
从 JDBC 4.2 及更高版本开始,我们可以直接交换java.time与数据库
\nString 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 ) ;\nRun Code Online (Sandbox Code Playgroud)\n请注意,a不是LocalDateTime一个时刻,也不是点。您的输入缺少时区或相对于 UTC 的偏移量的上下文。所以我们不知道你的意思是指日本东京 10 日凌晨 4 点,法国图卢兹凌晨 4 点,还是美国俄亥俄州托莱多凌晨 4 点 \xe2\x80\x94 三个截然不同的时刻,在时间轴上相隔几个小时。
因此,您可以将LocalDateTimeobject\xe2\x80\x99s 值存储在 Postgres 数据库类型的列中TIMESTAMP WITHOUT TIME ZONE。
如果您的目的是代表某个时刻,即时间线上的特定点,那么您最确定的是预期的时区。
\n假设您知道凌晨 4 点应该是日本东京时区。将 a 应用于ZoneId得到LocalDateTimeaZonedDateTime对象。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;\nZonedDateTime zdt = ldt.atZone( z ) ;\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,JDBC 4.2 规范不要求支持两种最常用的类型Instant和ZonedDateTime。没关系,我们可以轻松转换为OffsetDateTime,这是 JDBC 规范需要支持的。
OffsetDateTime odt = zdt.toOffsetDateTime() ;\nRun Code Online (Sandbox Code Playgroud)\n这样的值,时间轴上的特定点,应该写入类型的数据库列TIMESTAMP WITH TIME ZONE。
写入数据库。
\nmyPreparedStatement.setObject( \xe2\x80\xa6 , odt ) ;\nRun Code Online (Sandbox Code Playgroud)\n和检索。
\nmyResultSet.getObject( \xe2\x80\xa6 , OffsetDateTime.class ) ;\nRun Code Online (Sandbox Code Playgroud)\njava.sql.Timestamp如果您无法迁移到 Java 8,那么您应该使用 JDBC 驱动程序来获取java.sql.Timestamp。该类是一个 hack,但它确实有效。它是一个 java.util.Date,但跟踪小数秒到纳秒而不是毫秒的分辨率。因此它将保留 Postgres 使用的微秒。
您可以将其用作 java.util.Date 但在其他情况下您将失去额外的分辨率。
\n但您现在真的坚持使用 Java 6、7 或更早的版本吗?最好迁移到 Java 8 或 Java 11,这两个LTS版本。
\njava.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, &SimpleDateFormat。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\nJoda -Time项目目前处于维护模式,建议迁移到java.time类。
\n您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 和 JPA 2.2 支持java.timejava.sql.*。
从哪里获取 java.time 类?
\n