web-dev-qa-db-ja.com

Javaタイムスタンプ-2007年9月23日の日付のタイムスタンプを作成するにはどうすればよいですか?

2007年9月23日の日付のタイムスタンプを作成するにはどうすればよいですか?

93
pigouina

Timestampによって、私はあなたが Java.sql.Timestamp を意味すると推測します。このクラスには、long引数を受け入れるコンストラクターがあります。 DateFormatクラスを使用してこれを解析できます。

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
145
Adam Paynter

これはどうですか?

Java.sql.Timestamp timestamp = Java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
109
pigouina

タイムスタンプとはどういう意味ですか? Unixエポック以降のミリ秒を意味する場合:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

実際のJava.sql.Timestampオブジェクトが必要な場合:

Timestamp ts = new Timestamp(millis);
17

tl; dr

Java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .asStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

Java.time

Java 8以降に組み込まれている Java.time フレームワークを使用してコードを表示して、このページを更新しましょう。

これらの新しいクラスは、 Joda-Time に触発され、 JSR 31 によって定義され、 ThreeTen-Extra プロジェクトによって拡張されます。彼らは、Javaの初期バージョンにバンドルされている、悪名高い厄介な古い日時クラスに取って代わります。

Java.timeでは、InstantはUTCのタイムライン上の瞬間です。 ZonedDateTimeは、タイムゾーン(ZoneId)に調整されたインスタントです。

ここではタイムゾーンが重要です。 September 23, 2007の日付は、タイムゾーンを適用せずにタイムライン上の瞬間に変換することはできません。新しい日は、まだ「昨日」であるモントリオールよりもパリの方が早く夜明けになると考えてください。

また、Java.sql.Timestampは日付と時刻の両方を表します。そのため、日付に合わせて時刻を挿入する必要があります。時刻として1日の最初の瞬間を望んでいると仮定します。夏時間やその他の異常のために、これは常に00:00:00.0の時間ではないことに注意してください。

古いJava.util.Dateクラスとは異なり、Joda-Timeとは異なり、Java.time型の解像度はミリ秒ではなくナノ秒です。これは、Java.sql.Timestampの解像度と一致します。

Java.sql.Timestampには、toStringメソッドを介して文字列表現を生成するときに、JVMの現在のデフォルトのタイムゾーンをその日付時刻値に暗黙的に適用するという厄介な習慣があることに注意してください。ここに、America/Los_Angelesタイムゾーンが適用されています。対照的に、Java.timeクラスは標準 ISO 8601 形式を使用してより健全です。

LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.asStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
Java.sql.Timestamp ts = Java.sql.Timestamp.from ( instant ) ;

コンソールにダンプします。

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );

実行すると。

d:2007-09-23 = zdt:2007-09-23T00:00-04:00 [America/Montreal] = instant:2007-09-23T04:00:00Z = ts:2007-09-22 21:00: 00.0

ところで、JDBC 4.2以降では、Java.time型を直接使用できます。 Java.sql.Timestampは必要ありません。

  • PreparedStatement.setObject
  • ResultSet.getObject

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い legacyJava.util.DateCalendar 、& SimpleDateFormat などの日時クラスに取って代わります。

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列もJava.sql.*クラスも必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。

10
Basil Bourque

API によると、年、月などを受け入れるコンストラクタは非推奨です。代わりに、longを受け入れるConstructorを使用する必要があります。 Calendar 実装を使用して、たとえば getTimeInMillis メソッドを使用して、希望する日付を構築し、時間表現にlongとしてアクセスできます。

4
Philipp

次のこともできます。

// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
4
Alex

完全を期すために、 Joda-Time バージョン2.5およびその DateTime クラスのソリューション:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
1
user152468