Java:UNIXタイムスタンプからの日付


237

UNIXタイムスタンプを日付オブジェクトに変換する必要があります。
私はこれを試しました:

java.util.Date time = new java.util.Date(timeStamp);

タイムスタンプ値は次のとおりです。 1280512800

日付は "2010/07/30-22:30:00"(PHPで取得した場合)である必要がありますが、代わりにを取得しThu Jan 15 23:11:56 IRST 1970ます。

どのようにすればよいですか?


2
Java 8以降を使用している場合:この回答を
ご覧ください

1
参考までに、java.timeクラスに取って代わった、java.util.Date現在のような古い日付と時刻のクラスはレガシーです。Oracleによるチュートリアルを参照してください。
バジルブルク2017

回答:


429

の場合1280512800、Javaはミリ秒を想定しているため、1000を掛けます。

java.util.Date time=new java.util.Date((long)timeStamp*1000);

すでにミリ秒があった場合は、 new java.util.Date((long)timeStamp);

ドキュメントから:

Dateオブジェクトを割り当て、それを初期化して、「エポック」と呼ばれる標準の基準時間、つまり1970年1月1日00:00:00 GMTからの指定されたミリ秒数を表します。


40
キャスト先(long)は非常に重要です。これがないと、整数がオーバーフローします。
mneri 14年

2
@TomasK java.util.Dateはクラスの完全修飾名です。クラスにパッケージをインポートする場合Date、おそらくまったく同じですjava.util
パブロサンタクルーズ

5
longへのキャストは必要ありません。time = new java.util.Date(timeStamp * 1000L)も同様に機能します(1000Lは長いため、タイムスタンプは乗算の前にかなり長くなります)
Tony BenBrahim

2
私は個人的にはどうなる:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
ライアン・アマラル

3
参考までに、java.timeクラスに取って代わった、java.util.Date現在のような古い日付と時刻のクラスはレガシーです。Oracleによるチュートリアルを参照してください。
バジルブルク2017

59

java.time

Java 8では、日付と時刻を操作するための新しいAPIであるjava.timeパッケージが導入されました。

java.timeを使用すると、UTCの1970年の最初の瞬間(1970-01-01T00:00Z)のエポックリファレンス以降の秒数を解析できます。結果はInstantです。

Instant instant = Instant.ofEpochSecond( timeStamp );

java.timejava.util.Date用にまだ更新されていない古いコードと相互運用する必要がある場合は、変換してください。古いクラスに追加された新しい変換メソッドを呼び出します。

Date date = Date.from( instant );

3
この回答は技術的には正しいですが、java.timeクラスはのような厄介な古い日時クラスに取って代わるものjava.util.Dateです。古いクラスはレガシーであり、回避する必要があります。実際にレガシークラスとjava.timeクラスとの間で変換を行うことはできますが、可能な限りjava.timeを使用することをお勧めします。
バジルブルク2017


27

カレンダーは新しい方法のようです:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

最後の行は、それを使用する方法の例にすぎません。これは、たとえば「14.06.2012」と出力します。

System.currentTimeMillis()を使用してタイムスタンプを保存した場合、「* 1000」の部分は必要ありません。

文字列にタイムスタンプがある場合は、最初にlong.parseLong(timestamp)として解析する必要があります。

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html


8
警告:timestamp整数の場合、(long)最初にキャストする必要があります。そうでない場合、誤った日付になります。mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija 2012年

リンクを修正しました。
Ricbit 2015

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

26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18:00:00Z

java.time

Java 8以降に組み込まれた新しいjava.timeフレームワークは、Joda-Timeの後継です。

これらの新しいクラスには、秒単位のカウントをエポックから変換するための便利なファクトリメソッドが含まれています。あなたが得るInstantナノ秒の分解能を上にして、UTCでタイムライン上の瞬間を。

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString():2010-07-30T18:00:00Z

IdeOne.comコードがライブで実行されていることを確認してください

モダンとレガシーの両方のJavaの日時タイプの表

Asia/KabulまたはAsia/Tehranタイムゾーン?

ここに表示されている18:00ではなく、22:30の時刻値を取得すると報告しました。PHPユーティリティがデフォルトのタイムゾーンを暗黙的に適用してUTCから調整しているのではないかと思います。ここでの私の値はUTCであり、で示されますZ(の略でZulu、UTCを意味します)。あなたのマシンのOSやPHPに設定されているすべての機会Asia/KabulAsia/Tehran時間帯?IRSTあなたが出力で報告しているように、それは明らかにイランの時間を意味していると思います。現在、2017年には、 UTCより4時間半進んでいる夏時間で動作する唯一のゾーンです。

指定適切なタイムゾーン名をの形式でcontinent/region、のようなAmerica/MontrealAfrica/CasablancaまたはPacific/Auckland。など3-4文字の略語は絶対に使用しないでくださいESTか、ISTまたはIRSTそのままではない真の時間帯、標準化されていない、と(!)にも固有のものではありませんが。

特定の地域のタイムゾーンのレンズを通して自分の瞬間を見たい場合は、を適用してZoneIdを取得しZonedDateTimeます。まだ同じ瞬間ですが、壁掛け時計の時間は異なります。

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22:30 + 04:30 [アジア/テヘラン]

java.timeからレガシークラスへの変換

新しいjava.timeクラスを使用する必要があります。ただし、必要に応じて古いものに変換できます。

java.util.Date date = java.util.Date.from( instant );

ジョーダタイム

更新:Joda -Timeプロジェクトがメンテナンスモードになり、チームはjava.timeクラスへの移行をアドバイスします。

参考までに、Joda-Time DateTimeのコンストラクタは似ています。1000を掛けて、longint!ではなく)を生成します。

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

悪名高い厄介なjava.util.Dateクラスと.Calendarクラスを回避するのが最善です。ただし、日付を使用する必要がある場合は、Joda-Timeから変換できます。

java.util.Date date = dateTime.toDate();

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クラスはどこで入手できますか?

  • Java SE 8 Java SE 9以降
    • 内蔵。
    • 実装がバンドルされた標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6および Java SE 7
    • java.time機能の多くはThreeTen-BackportでJava 6&7にバックポートされています。
  • アンドロイド
    • Androidの新しいバージョンには、java.timeクラスの実装がバンドルされています。
    • 以前のAndroid(<26)の場合、ThreeTenABPプロジェクトはThreeTen-Backport(上記)を採用しています。ThreeTenABPの使用方法…を参照してください。

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


11

日付のコンストラクタは、timeStamp値がミリ秒単位であることを期待しています。タイムスタンプの値に1000を掛けてから、コンストラクタに渡します。


7

別のマシンでタイムスタンプ値を変換する場合は、そのマシンのタイムゾーンも確認する必要があります。例えば;

上記の説明は、ESTまたはUTCタイムゾーンで実行した場合、異なる日付値になります。

タイムゾーンを設定するには、別名UTCの場合、単純に書き換えることができます。

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));

6
これは、解析プロセスだけでなく、jvm全体のタイムゾーンを設定するため、これについてはお勧めしません。

1

コトリン用

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}

0

調整を行う必要がある場合があります。

長いキャストを使用しないでください!ナノ調整を使用します。

たとえば、取引にOanda Java APIを使用すると、日時をUNIX形式で取得できます。

例:1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

あなたが得る:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

また、使用:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );

-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

3
これ以上のテキストがなければ、この質問の他の多くの回答よりもなぜこの回答が望ましいのかは不明です。明確にしていただけますか?
ダンカンジョーンズ

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