web-dev-qa-db-ja.com

Javaエポックからの時間

Javaでは、エポックからの時間を秒とナノ秒で次の形式で出力するにはどうすればよいですか。

Java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

私の入力は:

long mnSeconds;
long mnNanoseconds;

ここで、2つの合計はエポックからの経過時間です1970-01-01 00:00:00.0

14
user1585643

あなたはこれを行うことができます

public static String format(long mnSeconds, long mnNanoseconds) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.");
    return sdf.format(new Date(mnSeconds*1000))
           + String.format("%09d", mnNanoseconds);
}

例えば.

2012-08-08 19:52:21.123456789

あなたが本当にミリ秒以上必要としないなら、あなたはすることができます

public static String format(long mnSeconds, long mnNanoseconds) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    return sdf.format(new Date(mnSeconds*1000 + mnNanoseconds/1000000));
}
9
Peter Lawrey

これを使用して1000で割ります

long Epoch = System.currentTimeMillis();

System.out.println("Epoch : " + (Epoch / 1000));
18

tl; dr

    Instant                        // Represent a moment in UTC.
    .ofEpochSecond( mnSeconds )   // Determine a moment from a count of whole seconds since the Unix Epoch of the first moment of 1970 in UTC (1970-01-01T00:00Z). 
    .plusNanos( mnNanoseconds )    // Add on a fractional second as a count of nanoseconds. Returns another `Instant` object, per Immutable Objects pattern.
    .toString()                    // Generate text representing this `Instant` object in standard ISO 8601 format.
    .replace( "T" , " " )          // Replace the `T` in the middle with a SPACE. 
    .replace "Z" , "" )            // Remove the `Z` on the end (indicating UTC).

Java.time

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、Java.util.Date.CalendarJava.text.SimpleDateFormatJava.sql.Dateなどの古い厄介な日時クラスに取って代わります。 。 Joda-Time チームは、Java.timeへの移行も推奨しています。

Instant

Instant クラスは、ナノラインまでの分解能で、タイムライン上の瞬間をUTCで表します。

long mnSeconds = … ;
long mnNanoseconds = … ;

Instant instant = Instant.ofEpochSecond( mnSeconds ).plusNanos( mnNanoseconds );

または、2つの引数として、両方の数値をofに渡します。異なる構文、同じ結果。

Instant instant = Instant.ofEpochSecond( mnSeconds , mnNanoseconds );

この日時値を表す文字列を取得するには、Instant::toStringを呼び出します。

String output = instant.toString();

2011-12-03T10:15:30.987654321Z、標準 ISO 8601 形式などの値を取得します。必要に応じて、TをSPACEに置き換えます。その他の形式については、スタックオーバーフローを検索して DateTimeFormatter をご覧ください。


Java.timeについて

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

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

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

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

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

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

7
Basil Bourque

それはあなたのmnSecondsとmnNanosecondsの値に少し依存しますが、そのような(ミリ秒の精度を持つ)フォーマッターで行う必要があるのは、Java.util.Dateを作成することだけです。 mnNanosecondsがmnSecondsの上にあるナノ秒の数である場合、私はそれが次のようなものであると想定します

Date d = new Date(mnSeconds*1000+mnNanosecods/1000000)

次に、それを印刷する前にフォーマッタでフォーマットすることです。

1
Fredrik

Java.util.Dateクラスには、エポックのミリ秒を受け入れるコンストラクタがあります。

Java doc を確認し、それを利用してみてください。

1
sundar

使用できます

new Java.util.Date(mnSeconds);

次に SimpleDateFormat で出力をフォーマットします。

ナノ秒は日付ではサポートされていません。ナノ秒を手動で追加するか、フレームワークを使用する必要があります(フレームワークはありますか?)。

0
John Smith