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


回答:


154

ということで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);

1
通常のISO日付形式はyyyy-MM-ddです。それ以外の場合は優れています。
vidstige 2014年

1
新しいTimestamp(time); このような長い値をとるコンストラクタがないことを示すエラー:(
Bhanu Sharma

1
:@Bhanuドキュメントは、これは長い値をとり行い、正常に動作するように見える示しdocs.oracle.com/javase/7/docs/api/java/sql/...
Hazok

以下のようなFYI、ひどく面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルブルク

121

これはどうですか?

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

1
タイムスタンプのタイムスタンプ= Timestamp.valueOf( "2007-09-23 10:10:10.0"); は、valueOfメソッドがjDK 7のタイプTimestampに対して未定義であることを示しています
Ashish Ratan

新しいTimestamp(time); 文字列値をとるこのようなコンストラクタがないことを示すエラー:(
Bhanu Sharma

@Bhanuコンストラクターは、ミリ秒単位のUNIX時間をとります。文字列からタイムスタンプを取得する場合は、静的メソッドvalueOfを使用します。
Hazok 2014

4
これが質問に対する最良の答えのようです。
Hazok 2014

1
最良の答えは、非推奨である日付を使用することです。この答えは良いです。ありがとう
アルベリチ

18

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

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

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

Timestamp ts = new Timestamp(millis);

2
間違ってコンパイルできません!コンパイルエラー:09は8進数ですが、9は8進数の範囲外です。論理エラー:月は0ベースで、2007年10月23日
user85421

コンパイルしないと論理エラーになりません。:)真剣に、良いキャッチ、カルロス。以前にキャッチした8進数ですが、とにかく間違って貼り付けました。:(
Matthew Flaschen 2009年

実際には、Timestampコンストラクターの価格が下がり、Timestamp.valueOf()メソッドを使用できるようになりました
Shiva Komuravelly

@ShivaKomuravellyないすべてのタイムスタンプのコンストラクタは非推奨となり、少なくともではないミリ秒と長くとる、引数は廃止される日付を取るコンストラクタされている
名前のない

そして、そのための定数があります(月= 9の代わりに):Calendar.SEPTEMBER
Guillaume Husta 2014年

11

tl; dr

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

java.time

このページを更新して、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.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.DateCalendar&を、SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

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

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

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


3
OPまたはmodを取得して、あなたの答えを正しいものとしてマークする方法を教えてください。受け入れられた答えはとても古くなっています。
sttaq

タイプミスを除いて、とてもいいです。asStartOfDay()はatStartOfDay()である必要があります。
Tullochgorum

@Tullochgorum修正済み。ありがとう。参考までに、スタックオーバーフローでは、必要に応じてこのような編集を自由に行うことができます。
バジルブルク

5

次のこともできます。

// 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());

2
間違い:結果のSystem.out.printlnを試してください!「2009-10-23 15:26:56.171」のように表示されます。月は0ベースなので、9は10月です。
user85421 2009年

おかげで、これらの定数の1つがゼロベースであることがわかりました。投稿を更新しました。
Alex

1
ああ、私は「テストされていない」を入れました:)
Alex

4

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


1

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

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

1
正解ですが、タイムゾーンという重要な要素を1つ逃しました。時間帯を省略すると、JVMの現在のデフォルトの時間帯がオブジェクトに適用されます。つまり、結果はさまざまなコンピューターやホストOSまたはJVM設定の構成によって異なります。予測可能な結果を​​得るには、タイムゾーンをそのコンストラクターに渡します。目的に合った適切なタイムゾーン名を選択してください。たとえば、または。DateTimeDateTimeDateTimeZone.forID( "America/Montreal" )DateTimeZone.UTC
バジルブルク2014年

そのコードはより簡潔になる可能性があります。ミリ秒以降のエポックを取得して渡すためにjava.util.Dateに変換する必要はありません。DateTimeオブジェクトにそのミリ秒以降のエポックを要求します。交換してください.toDate().getTime().getMillis()
バジルブルク2014年

@BasilBourque状況によっては、予測可能な結果を​​得るためにタイムゾーンを省略したい場合があります。「現在のタイムゾーンで」は、完全に合理的で予測可能な結果になります。なぜタイムゾーンをハードコーディングするのか、またはコンピュータにタイムゾーンがすでに設定されているのに手動でタイムゾーンを設定するようにユーザーに依頼するのか?私のコンピューター上のアプリケーションがアメリカ/モントリオールのタイムゾーンに調整された日付を出力し始めたら、確かに私はかなり驚かれるでしょう。
ダンカーター2016年

@dancarterオプションのタイムゾーンを省略すると混乱が生じます。(a)プログラマーが暗黙のデフォルトに依存するつもりであったか、または(b)プログラマーがタイムゾーンの問題を考慮しなかった(あまりに一般的である)かのあいまいさを引き起こします。実際にJVMの現在のデフォルトのタイムゾーンを使用したい場合は、オプションの引数として結果を呼び出して渡すことにより、明示的DateTimeZone.getDefault()にそのようにします。(ちなみに、Locale.getDefault()オプションの引数のあいまいさに関する同じ問題です。)
Basil Bourque '21 / 06/21

-1

より一般的な答えは、インポートjava.util.Dateすることです。次にtimestamp、現在の日付と等しいを設定する必要がある場合は、単にそれをに等しく設定しnew Date()ます。


** Date( "string"); **は非推奨
Ashish Ratan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.