Javaで現在のタイムスタンプを文字列形式で取得するにはどうすればよいですか?「yyyy.MM.dd.HH.mm.ss」


174

Javaで文字列形式のタイムスタンプを取得するにはどうすればよいですか?「yyyy.MM.dd.HH.mm.ss」

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

これは私が持っているものですが、Timestamp()にはパラメーターが必要です...


prepareStatement.setTimestamp(1、new Timestamp(System.currentTimeMillis()));
Rajat

どのようなエラーが発生していますか?
ロバートコロンビア

FYI、ひどく面倒な古い日付時刻クラスなどSimpleDateFormatjava.sql.Timestampなりましたレガシーに取って代わられ、java.timeの Javaの8に、後に内蔵されたクラス。Oracleによるチュートリアル参照してください。
バジルブルク2018

回答:


202

交換する

new Timestamp();

new java.util.Date()

にはデフォルトのコンストラクタがないためTimestamp、または次のメソッドで実行できます。

new Timestamp(System.currentTimeMillis());

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

160

java.util.Dateタイムスタンプの代わりにクラスを使用します。

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

これにより、指定した形式で現在の日付が取得されます。


5
これは私を助け、インポートする必要がないようにいくつかの変更を加えました new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni

より良いnew SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon

36

tl; dr

最新のjava.timeクラスのみを使用してください。以下のようなひどいレガシークラスを使用しないでくださいSimpleDateFormatDateまたはjava.sql.Timestamp

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

または、JVMの現在のデフォルトのタイムゾーンを使用します。

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.timeおよびJDBC 4.2

上記のように、最新のアプローチではjava.timeクラスを使用します。

JDBCドライバーJDBC 4.2に準拠している場合は、java.timeオブジェクトをデータベースと直接交換できます。とを使用PreparedStatement::setObjectResultSet::getObjectます。

JDBC 4.2より前のドライバーに対してのみjava.sqlを使用してください

JDBCドライバーがjava.time型のサポートについてJDBC 4.2にまだ準拠していない場合は、java.sqlクラスの使用にフォールバックする必要があります。

データの保存。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

データを取得しています。

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

などのjava.sqlタイプjava.sql.Timestampは、データベースとの間の転送にのみ使用する必要があります。Java 8以降では、すぐにjava.time型に変換します。

java.time.Instant

A java.sql.Timestampjava.time.Instant、UTCのタイムライン上の瞬間にマッピングされます。toInstant古いクラスに追加された新しい変換メソッドに注意してください。

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

タイムゾーン

希望する/期待されるタイムゾーン(ZoneId)を適用してを取得しZonedDateTimeます。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

書式設定された文字列

a DateTimeFormatterを使用して文字列を生成します。パターンコードは似ていますがjava.text.SimpleDateFormat正確ではありませんので、ドキュメントをよく読んでください。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

この特定の形式は、UTCからオフセットやタイムゾーンの表示がないため、その正確な意味が曖昧です。

ISO 8601

この件に関して発言がある場合は、独自の形式を採用するのではなく、標準のISO 8601形式を使用することをお勧めします。標準フォーマットはあなたのフォーマットに非常に似ています。例:
2016-02-20T03:26:32+05:30

java.timeクラスはデフォルトでこれらの標準形式を使用するため、パターンを指定する必要はありません。ZonedDateTimeクラスは、タイムゾーン(賢明な改善)の名前を追加することによって、標準的なフォーマットを拡張します。

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

java.sqlに変換

java.timeからに変換できjava.sql.Timestampます。Instantからを抽出しZonedDateTimeます。

古いクラスに新しいメソッドが追加され、java.timeクラスとの変換が容易になりました。

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Java(レガシーとモダンの両方)および標準SQLの日時タイプの表


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、および多くを


では、現在のウォールクロックのタイムスタンプを「yyyy.MM.dd.HH.mm.ss」形式で取得する正しい方法とは何でしょうか。ローカルタイムゾーンのハードコードされた文字列を明示的に指定せずに?それがトピックのスターターが求めていたものであり、私はあなたの答えでそれを見つけることができませんでした...
t7ko

@ t7ko JVMの現在のデフォルトのタイムゾーンを明示的に要求する方法を示すコード例をtl; drセクションに追加しました。引数なしで `now() 'を呼び出すことは同じですが、デフォルトを使用するつもりなのか、タイムゾーンの重要な問題について知らなかったり忘れたりしていたのかは明らかではありません。
バジルブルク

32

Timestampの代わりにjava.util.Dateを使用できます。

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

6

より適切なアプローチは、ロケール領域をコンストラクターのパラメーターとして指定することです。以下の例では、米国のロケール地域を使用しています。日付のフォーマットはロケールに依存し、ロケールを使用して、ユーザーの地域のロケールの慣習や規則に関連する情報を調整します(JavaプラットフォームSE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

1
「ロケールゾーン」などはありません。私はあなたが混乱していてLocale、時間帯が無関係であると思います。Locale書式設定の文化的規範と月/日の名前に使用される人間の言語を制御します。タイムゾーンは、いくつかの地域のに適切であるように、日付・時刻の表現を調整壁時計時間。この質問の場合、文化的基準を適用するための書式設定の問題も、特定の人間の言語にローカライズする月/日の名前もないため、ロケールは無関係です。
バジルブルク

@BasilBourqueご協力ありがとうございます。答えをより明確にするために更新しました
user3144836

4

以下を使用できます

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

これがお役に立てば幸いです。ただの提案であり、報酬ポイントではありません。


要求された文字列形式はありません。また、いくつかの同様の答えに追加される唯一のことは、不必要な複雑化だと思います…
Ole VV

4

java.timeJava 8以降を使用する場合は、最新のクラスを使用してください。

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

バジルブルクの答えはかなり良いです。しかし、それは長すぎます。多くの人はそれを読むのに我慢できないでしょう。トップ3の回答は古すぎて、Javaの新しいハチを誤解させる可能性があります。そのため、私は新しい次の開発者にこの短くて現代的な回答を提供します。この答えがひどいの使用を減らすことを願っていますSimpleDateFormat

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