TL; DR
OffsetDateTime odt = OffsetDateTime.parse ("2016-08-18 14:27:15.103+02" , DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss.SSSX")) ;
詳細
Answer by greg-449は、溶液(日時値の日付のみのオブジェクトを使用して)問題について正しいがありません。
その答えは、不必要に離れoffset-from-UTCに関する貴重な情報をスローLocalDateTime
を使用しています。 A LocalDateTime
はではありません。は、タイムライン上の特定の瞬間を表していますが、特定の時間帯に合わせることによって可能なモーメントについての漠然とした考えだけです。
は、「2時間前にUTC」を意味するoffset-from-UTCです。したがって、UTCでは、この同時瞬間の時刻は12時間で、あなたの14時間より2時間少なくなります。このは、タイムライン上の特定の瞬間を表しありません。このオフセットは、あなたがLocalDateTime
はなくOffsetDateTime
で捨てている貴重な情報です。
文字列の形式は、標準のISO 8601形式に近いSQL形式です。単にT
と真ん中にSPACEを交換してください。 java.timeクラスはデフォルトでISO 8601フォーマットを使用しているため、フォーマットパターンを指定する必要はありません。
String input = "2016-08-18 14:27:15.103+02";
String inputModified = input.replace (" " , "T");
残念ながら、Java 8にはオフセット値を1時間に短縮するか、またはコロンを省略したオフセット値を解析するバグがあります。 Java 9では修正されました。しかしJava 8では、入力を調整する必要があります。
// Workaround for Java 8 where 2-digit offset fails parsing. Fixed in Java 9.
int lengthOfAbbreviatedOffset = 3;
if (inputModified.indexOf ("+") == (inputModified.length() - lengthOfAbbreviatedOffset)) {
// If third character from end is a PLUS SIGN, append ':00'.
inputModified = inputModified + ":00";
}
if (inputModified.indexOf ("-") == (inputModified.length() - lengthOfAbbreviatedOffset)) {
// If third character from end is a PLUS SIGN, append ':00'.
inputModified = inputModified + ":00";
}
今すぐ解析してください。
OffsetDateTime odt = OffsetDateTime.parse (inputModified);
コンソールにダンプします。+02
を+02:00
に変換した方法に注意してください。あるいは
System.out.println ("input: " + input + " | inputModified: " + inputModified + " | odt: " + odt);
input: 2016-08-18 14:27:15.103+02 | inputModified: 2016-08-18T14:27:15.103+02:00 | odt: 2016-08-18T14:27:15.103+02:00
、フォーマットパターンを指定。オフセット解析のバグは、この書式設定パターンを使用するときには噛みません。 Postgresから
DateTimeFormatter f = DateTimeFormatter.ofPattern ("yyyy-MM-dd HH:mm:ss.SSSX");
OffsetDateTime odt = OffsetDateTime.parse (input , f);
データベース
来て、あなたは、日付時刻オブジェクトではなく文字列として値を取得する必要があります。
JDBCドライバがJDBC 4.2に準拠している場合は、ResultSet::getObject
と呼び出してInstant
またはOffsetDateTime
を取得できます。そうでない場合は、ResultSet::getTimestamp
に電話してjava.sql.Timestamp
を取得し、すぐにTimestampオブジェクトのtoInstant
を呼び出してjava.timeに変換します。
ビジネスロジックにはjava.timeを使用してください。 java.sql型は、データベースとの交換のためにのみ短時間使用してください。
日時の隙間と思います。それはスペースチャー、またはノンブロッキングスペースですか?あなたの文字列がある種のフォームから来た場合、それはスペースとは異なる文字かもしれません –
それはPostgreデータベースから来ます –