Javaを使用すると、Calendar.getInstance();
を使用すると、現在のタイムゾーンのCalendar
オブジェクトが取得されます。ただし、Java.sql.Timestamp
は通常、現地時間ではなくUTC時間で保存されます。では、カレンダーインスタンスからUTC時刻を取得するにはどうすればよいですか?
DateFormat df = DateFormat.getTimeInstance();
Calendar cal = Calendar.getInstance();
Timestamp time = new Timestamp(cal.getTimeInMillis());
// Prints local time
System.out.println(df.format(new Date(time.getTime())));
// Printe local time, but I want UTT Time
System.out.println("timestamp: " + time);
Calendar.getTime()
を呼び出すと、関連するタイムゾーンを持たない値が得られます-または、インスタントカレンダーが表すこと。したがって、カレンダーのタイムゾーンで(たとえば)午前9時の場合、午後5時(UTC)になる可能性があります。
今Java.util.Date
(およびTimestamp
)は、toString()
を呼び出すと、システムのデフォルトのタイムゾーンでformattedになります(暗黙的にも明示的にも)-ただし、タイムゾーンがオブジェクト自体のデータの一部であると誤解させないでください。
正確に達成しようとしていることについて明確にする必要があります-そして、おそらくそれを見つけるでしょう Joda Time =組み込みライブラリよりも明確にコードでそれを表現できます。
あなたのコードはすでにあなたが望んでいることを正確に実行しています。 Timestamp
(およびDate
)にはタイムゾーン情報がなく、常にGMTタイムスタンプを含める必要があります(これはCalendar.getTimeInMillis()
が返すものではありません)。
現地時間が表示されるのは、DateFormat
ファクトリメソッドとTimestamp.toString()
が暗黙的にシステムのタイムゾーンを使用するためです。
Instant.now()
Java.timeクラスに取って代わった、厄介な古い日時クラスを使用しています。 DateFormat
、Calendar
、またはTimestamp
を使用する必要はありません。
まだJava.timeに更新されていない古いコードの Calendar
を使用する必要がある場合は、古いクラスに追加された新しいメソッドを使用して変換します。廃止されたJava.util.Date
を抽出し、Instant
に変換します。
Instant instant = myCal.getTime().toInstant() ;
現在の瞬間をInstant
として取得します。 Instant
クラスは、タイムライン上の [〜#〜] utc [〜#〜] の瞬間を表し、 ナノ秒 (最大9(9 )小数の桁)。
Instant instant = Instant.now() ;
2017-02-17T03:29:15.725Z
JDBC 4.2以降では、Instant
オブジェクトをデータベースと直接交換できます。そのため、廃止されたJava.sql.Timestamp
は必要ありません。
myPreparedStatement.setObject( … , instant ) ;
そして検索:
Instant instant = myResultSet.getObject( … , Instant.class ) ;
エポック参照日1970-01-01T00:00:00Z
からのミリ秒数が必要なようです。その数はInstant
から抽出できます。ただし、Instant
にはナノ秒の分解能があるため、データ損失に注意してください。これは、ミリ秒に切り捨てられます。
long millis = instant.toEpochMilli() ;
1487302155725
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い レガシーなどの日時クラスに取って代わります。 Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード で、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 310 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがここにあります。
次のスニペットはあなたの要件を満たすはずです:
df.setTimeZone(TimeZone.getTimeZone("UTC"));