回答:
ということで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);
java.util.Date
、java.util.Calendar
とjava.text.SimpleDateFormat
今のレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアルを参照してください。
これはどうですか?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
タイムスタンプとはどういう意味ですか?Unixエポックからのミリ秒を意味する場合:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
実際のjava.sql.Timestampオブジェクトが必要な場合:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
このページを更新して、Java 8以降に組み込まれているjava.timeフレームワークを使用したコードを表示してみましょう。
これらの新しいクラスは、Joda- Timeに触発され、JSR 310で定義され、ThreeTen-Extraによって拡張されています。プロジェクトます。彼らは、Javaの初期バージョンにバンドルされた悪名高い厄介な古い日時クラスに取って代わります。
java.timeでは、an Instant
はUTCのタイムライン上の瞬間です。A ZonedDateTime
は、タイムゾーン(ZoneId
)に調整されたインスタントです。
ここではタイムゾーンが重要です。の日付はSeptember 23, 2007
、タイムゾーンを適用しないと、タイムライン上の瞬間に変換できません。新しい日がまだ「昨日」であるモントリオールよりもパリの夜明けが早いと考えてください。
また、java.sql.Timestampは日付と時刻の両方を表します。したがって、日付に合わせて時刻を挿入する必要があります。私たちはあなたが一日の最初の瞬間を時刻として欲しいと仮定します。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.atStartOfDay( 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] =インスタント: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 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.Date
、Calendar
&を、SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
次のこともできます。
// 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());
APIによると、年、月などを受け入れるコンストラクタは非推奨です。代わりに、longを受け入れるコンストラクタを使用する必要があります。Calendarの実装を使用して、必要な日付を作成し、たとえばgetTimeInMillisメソッドを使用して、時間表現をlongとしてアクセスできます。
完全を期すために、Joda-Timeバージョン2.5とそのDateTime
クラスを使用したソリューション:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
DateTime
DateTimeZone.forID( "America/Montreal" )
DateTimeZone.UTC
DateTime
オブジェクトにそのミリ秒以降のエポックを要求します。交換してください.toDate().getTime()
と.getMillis()
。
DateTimeZone.getDefault()
にそのようにします。(ちなみに、Locale.getDefault()
オプションの引数のあいまいさに関する同じ問題です。)
より一般的な答えは、インポートjava.util.Date
することです。次にtimestamp
、現在の日付と等しいを設定する必要がある場合は、単にそれをに等しく設定しnew Date()
ます。