問題描述
從 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);日期日期 = 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 等.
java.time
使用 Java 8 及更高版本中內置的 java.time 類.永遠不要使用糟糕的遺留日期時間類,例如 Date
、Calendar
、SimpleDateFormat
、GregorianCalendar
和 時間戳
.
從 JDBC 4.2 起,我們可以直接與數據庫交換 java.time 對象.
String input = "2014-11-10 04:05:06.999999".replace( " " , "T") ;//從 SQL 樣式轉換為 ISO 8601 標準格式,其中 `T` 將年-月-日部分與時-分-秒部分分開.LocalDateTime ldt = LocalDateTime.parse( 輸入 ) ;
沒有一刻
請注意,
關于java.time
java.time 框架內置于 Java 8 及更高版本中.這些類取代了麻煩的舊 legacy 日期時間類,例如 java.util.Date
, 日歷
, &SimpleDateFormat
.
要了解更多信息,請參閱 Oracle 教程.并在 Stack Overflow 上搜索許多示例和解釋.規范是 JSR 310.
Joda-Time 項目,現在在 維護模式,建議遷移到 java.time 類.
您可以直接與您的數據庫交換 java.time 對象.使用符合 JDBC 驅動程序/jeps/170" rel="nofollow noreferrer">JDBC 4.2 或更高版本.不需要字符串,不需要 java.sql.*
類.休眠 5 和JPA 2.2 支持 java.time.
從哪里獲取 java.time 類?
- Java SE 8,Java SE 9, Java SE 10, Java SE 11 及更高版本 - 具有捆綁實現的標準 Java API 的一部分.
- Java 9 帶來了一些小功能和修復.
- Java SE 6 和 Java SE 7
- 大部分 java.time 功能都向后移植到 Java 6 &7 在 ThreeTen-Backport.
- Android
- java.time 類的更高版本的 Android (26+) 捆綁實現.
- 對于早期的 Android (<26),稱為 的進程API 脫糖 帶來了 的子集java.time 功能最初并未內置于 Android 中.
- 如果脫糖不能提供您所需要的,ThreeTenABP 項目適應 ThreeTen-Backport(如上所述)到 Android.請參閱如何使用 ThreeTenABP….
From the Postgres Database I am getting a 6 digit microsecond (its actually a ) e.g. 2014-11-10 04:05:06.999999
now when i apply a date format of "yyyy-MM-dd HH:mm:ss.SSS" it converts the 999999 to corresponding seconds/minutes resulting in incorrect date. See code snippet below
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));
results in 2014-11-10 04:21:45.999
I want to rather truncate the last 3 digits and keep a date of 2014-11-10 04:05:06.999. How to truncate it? I do not want to use any framework like joda etc.
java.time
Use java.time classes, built into Java 8 and later. Never use the terrible legacy date-time classes such as Date
, Calendar
, SimpleDateFormat
, GregorianCalendar
, and Timestamp
.
As of JDBC 4.2 and later, we can directly exchange java.time objects with the database.
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.
LocalDateTime ldt = LocalDateTime.parse( input ) ;
Not a moment
Be aware that a LocalDateTime
is not a moment, is not a point on the timeline. Your input lacks the context of a time zone or offset-from-UTC. So we do not know if your mean 4 AM on the 10th in Tokyo Japan, 4 AM in Toulouse France, or 4 AM in Toledo Ohio US — three very different moments, several hours apart on the timeline.
So you would be storing the LocalDateTime
object’s value in a Postgres database column of type TIMESTAMP WITHOUT TIME ZONE
.
A moment
If your intent was to represent a moment, a specific point on the timeline, you most know for certain the intended time zone.
Let's say you know the 4 AM was meant to be in Tokyo Japan time zone. Apply a ZoneId
to the LocalDateTime
to get a ZonedDateTime
object.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
Unfortunately, the JDBC 4.2 spec does not require support for the two most commonly used types, Instant
and ZonedDateTime
. No matter, we can easily convert to OffsetDateTime
, for which support is required by JDBC spec.
OffsetDateTime odt = zdt.toOffsetDateTime() ;
Such a value, a specific point on the timeline, should be written to a database column of type TIMESTAMP WITH TIME ZONE
.
Write to the database.
myPreparedStatement.setObject( … , odt ) ;
And retrieval.
myResultSet.getObject( … , OffsetDateTime.class ) ;
java.sql.Timestamp
If you cannot move to Java 8, then you should be using your JDBC driver to get a java.sql.Timestamp
object. That class is a hack, but it works. It is a java.util.Date but tracks the fractional seconds to resolution of nanoseconds instead of milliseconds. So it will preserve the microseconds used by Postgres.
You can use it as a java.util.Date but in other contexts you'll lose your extra resolution.
But are you really stuck with Java 6, 7, or earlier in the year 2020 now? Best to move to either Java 8 or Java 11, the two LTS versions.
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date
, Calendar
, & SimpleDateFormat
.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.*
classes. Hibernate 5 & JPA 2.2 support java.time.
Where to obtain the java.time classes?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation.
- Java 9 brought some minor features and fixes.
- Java SE 6 and Java SE 7
- Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Android
- Later versions of Android (26+) bundle implementations of the java.time classes.
- For earlier Android (<26), a process known as API desugaring brings a subset of the java.time functionality not originally built into Android.
- If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….
這篇關于6位微/毫秒的java日期格式的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!