2016-04-12 65 views
2

フォローアップの質問issuePostgresのUTCからJavaへのZonedDateTime

使用している日付時刻は、ユーザーがリクエストを送信している場所ではなく、既知のタイムゾーンと一致することがわかっているため、LocalDateTimeを使用してUTCに変換して保持します。その後、予定が取り出されると、保存された時間が(dbに格納された)会議場所のタイムゾーンに変換されます。しかし、私が保存した値は実際に私のローカルタイムゾーンに保存されているように見えます。

私のような休憩コントローラーの日付時刻値を受け取る:

startLocalDateTime: 2016-04-11T10:00 
endLocalDateTime: 2016-04-11T10:30 

予定が2つのZoneDateTimeのフィールドがあります。

@Column(name = "startDateTime", columnDefinition= "TIMESTAMP WITH TIME ZONE") 
private ZonedDateTime startDateTime; 
@Column(name = "endDateTime", columnDefinition= "TIMESTAMP WITH TIME ZONE") 
private ZonedDateTime endDateTime; 

その後、私が私のエンティティにUTCとストアに値を変更Postgresに保存:

appointment.setStartDateTime(startLocalDateTime.atZone(ZoneId.of("UTC"))) 
appointment.setEndDateTime(endLocalDateTime.atZone(ZoneId.of("UTC"))) 

と私はそれをPostgresに格納します(columnDefinition= "TIMESTAMP WITH TIME ZONE") Wh私はpgadminIIIのレコードを見て途中私が参照してください。

startDateTime "2016-04-11 04:00:00-06" 
endDateTime "2016-04-11 04:30:00-06" 

は、したがって、これらは、(私がこれまでに何も悪いことをやっているなら、私を修正してください)UTC形式で適切に保管されているように見えます。私は、データベースからそれらを取得し、彼らは次のように返されます。これらの値は、JSONとして送り返され

Appointment 
startdatetime: 2016-04-11T04:00-06:00[America/Denver] 
enddatetime: 2016-04-11T04:30-06:00[America/Denver] 

{ 
"appointmentId":50, 
"startDateTime":"2016-04-11T04:00", 
"endDateTime":"2016-04-11T04:30" 
} 

だから私は、私は彼ら彼らを取得UTC、として保存していていてもUTCではなくMST(現地時間)のタイムゾーンにあり、実際の時刻に戻すことはできません。

依然として持続性に苦しんでいます。私は自分のエンティティでjava.sql.timestamp、java.sql.Date、java.util.Date、およびjava.time.ZonedDateTimeを使用しようとしました。私のPostgresはまだ "タイムゾーン付きタイムスタンプ"です。しかし、私はSpring-Data-JPAを使用しており、同じタイプのクエリーを行う必要があるためです。 Dateを使用する場合 - sql.Dateまたはutil.Dateですか?

+0

Java Date **は常に** UTC **(常にローカルタイムゾーンが含まれている場合はフォーマットされているため)のため、これらはUTCに格納されます。 –

+0

私は、データベースがUTC形式でそれらを表示する理由を理解していないと思うし、アポイントメントの一部として返されても、時間はUTCですが、ゾーンは "UTC"ではなく "アメリカ/デンバー"であるように見えます。正しい時間を戻すにはどうすればいいですか? – sonoerin

+0

***あなたは***どのように時間を表示していますか? Javaは1970年1月1日午前0時(UTC、別名EPOCH)から、「Date」をミリ秒数で格納するためです。 –

答えて

1

jdbcドライバには、現在のタイムゾーンについての知識があります。一般的に、これまでデータベースにタイムゾーン変換を行うことで、タイムゾーンなしのタイムスタンプAT "または"タイムゾーン 'UTC'でのタイムゾーンのタイムスタンプ。これは、postgres jdbcドライバの邪魔になって、JVMがどのタイムゾーンにあるのかを把握しており、保存中にそれを使用しています。

+0

したがって、列をタイムゾーン 'UTC'に定義し、エンティティおよびビジネスロジックでLocalDateTimeまたはZonedDateTimeを使用するだけですか?そして、データを返すと、そのUTCから目的のTimeZoneに変換されますか? – sonoerin

+0

多分、タイムゾーン付きのタイムスタンプ型の列を定義しています。次に、mycolumn =?の代わりにmycolumn =のような処理を行います。タイムゾーン 'UTC'では、時間差を二重にするのは簡単なので、やりにくくなります。ボードソリューション全体で良いものを探しているなら、代わりにこれをjdbcレイヤーとして設定することもできます。 -Duser.timezone = UTCなどのjvmパラメータを使用すると、ボード全体でこれを行う必要があります。これは簡単です。すべてのテーブルにUTCが必要な場合、またはこのテーブルのみが必要な場合はわかりません。 –

+0

調査の結果、OS/JVM環境変数のために値がUTCではなくMSTとして保存されています。これは私の/からの変換のアプローチを無効にしています。私はSpring-Data-JPAを使用していますが、PreparedStatementsではなく、Hibernateを使用していますので、このレベルで強制的に使用するかどうか、またはSpringBootアプリケーションを起動するときに使用する必要がありますか? – sonoerin

関連する問題