web-dev-qa-db-ja.com

java.util.Date形式SSSSSS:マイクロ秒でない場合、最後の3桁は何ですか?

私のWindows(8)ワークステーションとAIXの両方でこのコードをテストしました。

_    public static void main(String[] args) {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date()));
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date()));
    }
_

結果としてこれに似たものを得ました:

_2013-10-07 12:53:26.000905
2013-10-07 12:53:26.000906
_

誰かがマイクロ秒ではない場合、最後の数字は何ですか?

注:私はDB2データベースと対話します。DB2データベースでは、時系列の列を使用して、秒の後に6桁のTIMESTAMPとして時系列データ、つまりマイクロ秒(IMO)が格納されます。ただし、これらの「タイムスタンプ」はすべて、次のクエリを要求することで作成されます。

_SELECT current timestamp as currenttimestamp FROM Table ( values (1)) temp
_

上記の結果が与えられた場合、データベースから_current timestamp_を選択する代わりに、コードでnew Date()を使用することはできなかったのでしょうか。

ありがとう。

PS:検索しましたが、関連する(回答済みの)質問が見つかりませんでした: Javaのマイクロ秒単位の現在時刻 または 時間、分、秒、ミリ秒、マイクロ秒の時刻を取得

30
maxxyme

SimpleDateFormatのドキュメント から:

Letter     Date or Time Component     Presentation     Examples  
S          Millisecond                Number           978 

つまり、ミリ秒、つまり1/1000秒です。あなたは6桁でフォーマットするだけなので、3つの余分な先行ゼロを追加します...

次の方法で確認できます。

    Date d =new Date();
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(d));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(d));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(d));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS").format(d));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS").format(d));
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(d));

出力:

2013-10-07 12:13:27.132
2013-10-07 12:13:27.132
2013-10-07 12:13:27.132
2013-10-07 12:13:27.0132
2013-10-07 12:13:27.00132
2013-10-07 12:13:27.000132

イデオンフィドル

79
ppeterka

tl; dr

Instant.now()
       .toString() 

2018-02-02T00:28:02.487114Z

Instant.parse(
    "2018-02-02T00:28:02.487114Z"
)

Java.time

Ppeterkaによる 受け入れられた回答 は正しいです。フォーマットパターンを悪用すると、データが誤って表示されますが、内部値は常にミリ秒に制限されます。

使用している面倒なSimpleDateFormatおよびDateクラスはレガシーであり、Java.timeクラスに取って代わりました。Java.timeクラスは ナノ秒 解像度を処理し、従来のクラスの ミリ秒 制限よりもはるかに細かい。

Java.util.Dateと同等のものはJava.time.Instantです。古いクラスに追加された新しいメソッドを使用して、それらの間で変換することもできます。

Instant instant = myJavaUtilDate.toInstant() ;

Instant クラスは、 [〜#〜] utc [〜#〜] の解像度で ナノ秒 (最大9桁のタイムライン上の瞬間を表します小数の)。

UTCで現在の瞬間をキャプチャします。 Java 8は現在の瞬間をミリ秒単位でキャプチャしますが、Java 9の新しいClock実装は瞬間をより細かく、通常はマイクロ秒単位でキャプチャしますが、コンピューターのハードウェアクロックとOSおよびJVMの実装。

Instant instant = Instant.now() ;

標準ISO 8601形式の文字列を生成します。

String output = instant.toString() ;

2018-02-02T00:28:02.487114Z

他の形式の文字列を生成するには、すでに何度も説明されているDateTimeFormatterのStack Overflowを検索します。

UTC以外のタイムゾーンに調整するには、ZonedDateTimeを使用します。

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;

Java.timeについて

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

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

詳細については、 Oracle Tutorial を参照してください。多くの例と説明については、Stack Overflowを検索してください。仕様は JSR 310 です。

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

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter 、および more

8
Basil Bourque

さらに別のトリックを使用して、6桁の精度(マイクロ秒)で日付をフォーマットしました。

System.out.println(
    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000)
    +String.format("%06d", microseconds%1000000));

この手法は、ナノ秒以上までさらに拡張できます。

2
tutejszy

テキスト表現で秒の小数部を取得する場合は、Java.sql.Timestamp.toStringを使用します。 DBからのタイムスタンプとJava Dateとの違いは、DBの精度がナノ秒であるのに対し、Java日付の精度はミリ秒です。

0