tl; dr
あなたは十分な情報を提供していません。レポート:これの
- 結果:
myJavaUtilDate.toInstant().toString()
- 入力コンポーネント
- へのアプリの現在のデフォルトのタイムゾーン
詳細
あなたは本当に十分に与えていませんあなたの問題に関する情報GUIコンポーネントのjava.util.Date
オブジェクトを使用して、UTCで正しい日時の値を取得していますか?
America/Montreal
のケベックの時間帯での利用者は2016年12月1日に9 AMに入り、java.util.Date
オブジェクトを生成しながら、あなたのコンポーネントが正しくUTCにこれらの値を調整している、あなたは何の問題もない場合。 UTCの値は、午後の午後2時(America/Montreal
)はその特定の日付のUTCより5時間遅れているため、UTCの午後2時です。 java.sql.Timestamp
オブジェクトに変換した後、Date
オブジェクトをデータベースに渡すだけです。
FYIでは、古い日時クラスクラス(Date
& Calendar
など)とJoda-Timeの両方がjava.timeクラスに置き換えられました。次に、コンポーネントがうまく使用している動作の種類を示すjava.timeのコード例をいくつか示します。
LocalDate ld = LocalDate.of (2016 , Month.DECEMBER , 1);
LocalTime lt = LocalTime.of (9 , 0);
ZoneId z = ZoneId.of ("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.of (ld , lt , z);
Instant instant = zdt.toInstant(); // UTC
System.out.println ("zdt.toString(): " + zdt);
System.out.println ("instant.toString(): " + instant);
zdt.toString():2016-12-01T09:00〜05:00 [アメリカ/モントリオール]
インスタント。toString():2016-12-01T14:00:00Z
文字列の最後にZ
はZulu
の略であり、UTCを意味します。文字列を生成しながら、現在のデフォルトのタイムゾーンを適用するjava.util.Date::toString
の不幸な行動を考えると
は、私はあなたがその価値の明確な読書を得ることができるので、あなたのDate
がInstant
に変換示唆しています。
Instant instantConvertedFromDateOfComponent = myJavaUtilDate.toInstant();
このステップの後に、あなたが実際に午後に2 PMを見なければ、すべてが順調ですし、あなたのコンポーネントがうまく行っています。
タイムゾーンの問題を無視して、ユーザーが自分のゾーンとしてUTCを意図しているかのようにユーザーの入力を報告すると、コンポーネントがうまく動作しない場合、2016-12-01T09:00:00Z
が表示されます。それは問題です。回避策は、自分でタイムゾーンを調整することです。 「ローカル」(ゾーンレス)値を抽出し、意図したタイムゾーンを適用します。
"ローカル"の日付と時刻を取得するには、まずOffsetDateTime
オブジェクトに変換します。
OffsetDateTime odt = instantConvertedFromDateOfComponent.atOffset(ZoneOffset.UTC);
LocalDateTime ldt = odt.toLocalDateTime(); // 2016-12-01T09:00:00Z
ZonedDateTime zdt = ldt.atZone(z); // 2016-12-01T09:00-05:00[America/Montreal]
JDBCドライバがJDBC 4.2以降に準拠している場合、これらのjava.time型を直接渡すことができます。そうでない場合は、古いクラスに追加された新しいメソッドを使用してjava.sql型に変換します。スタックオーバーフローで何度も議論されているので、より多くの情報を検索してください。
サーバーの現在の既定のタイムゾーンは、プログラミングとは関係ありません。暗黙的にデフォルトに依存するのではなく、オプションの引数で常に希望の/期待されるタイムゾーンを明示的に指定します。 java.timeについて
java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date
、Calendar
、& SimpleDateFormat
など、面倒な古いlegacy日時クラスに取って代わります。
maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。
詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。
ここで、java.timeクラスを取得するには?
ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、Interval
、YearWeek
、YearQuarter
、moreなどの便利なクラスがあります。
'java.util.Date'にタイムゾーンがないことを理解しているとは思えません。それは瞬間/瞬間のように扱われなければならない。したがって、コード全体は役に立たない。最初のパラメータが 'Date'で、時間操作なしで' Date'を返す(つまりモーメントを変更する)場合、これは同じ操作(単に 'return pDateUtc;')です。インスタントタイムゾーンで同じです! –
私は十分にはっきりしてはいけません。私は、ユーザーがカレンダーで日付を選択し、文字列に時間を書き込むDatePickerを使用しています。 コンポーネント(ユーザーのタイムゾーンを考慮してコードを変更することはできません)は、ユーザーの選択とコントローラに一致するjava.util.Dateを返します。 それから、ユーザーが自分のタイムゾーンの視点から選択したローカル日付と一致する瞬間を計算するためにコントローラが必要です。より良い世界では、コンポーネントはタイムゾーンに注意し、正しいDateオブジェクトを返します。 – TheBakker
あなたの説明によると、ユーザーはローカルカレンダーの日付とローカル時計の時刻を選択します。そして、 'DatePicker'コンポーネントは' Date'オブジェクトを生成します。つまり、このコンポーネントは少なくとも内部的にタイムゾーン変換を適用します。たぶん、代わりに 'DatePicker'コンポーネントのタイムゾーンを設定する必要があります。しかし、 'DatePicker'によって返された' java.util.Date'オブジェクトを操作するのは間違いです。 –