web-dev-qa-db-ja.com

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

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

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

タイムスタンプ値は1280512800です。

Dateは "2010/07/30 - 22:30:00"でなければなりませんが(私はPHPで取得します)、代わりにThu Jan 15 23:11:56 IRST 1970を取得します。

どうすればいいの?

217
RYN

1280512800については、Javaがミリ秒を期待しているので、1000を掛けます:

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

あなたが既にミリ秒を持っているならば、ちょうどnew Java.util.Date((long)timeStamp);

のドキュメントから

Dateオブジェクトを割り当て、 "the Epoch"として知られる標準的な基準時間、つまり1970年1月1日00:00:00 GMTから指定されたミリ秒数を表すようにそれを初期化します。

397

Java.time

Java 8 は日付と時刻を扱うための新しいAPIを導入しました: Java.timeパッケージ

Java.timeでは、次のものを使用できます。

Date date = Date.from( Instant.ofEpochSecond( timeStamp ) );

Instant は、Java 8のタイムスタンプを表します。静的なDate.from()メソッドを使うと、InstantJava.util.Dateインスタンスに変換できます。

49
micha

これは正しい方法です。

Date date = new Date ();
date.setTime((long)unix_time*1000);
43
Marco Fantasia

カレンダが新しい方法です。

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として解析する必要があります。Long.parseLong(timestamp)。

https://docs.Oracle.com/javase/7/docs/api/Java/util/Calendar.html

25
Stefan

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18:00:00Z

Java.time

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

これらの新しいクラスには、Epochの 全体の秒数を変換する便利なファクトリメソッド が含まれています。あなたはInstantを取得します。これはUTCのタイムライン上の瞬間で、最大ナノ秒の分解能です。

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

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

それを参照してください コードはIdeOne.comでライブ配信

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

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

continent/regionAmerica/Montreal 、またはAfrica/Casablancaのように、 正しいタイムゾーン名Pacific/Aucklandの形式で指定します。 ESTISTIRSTなどの3〜4文字の略語は、not trueタイムゾーンであり、標準化されておらず、一意でもない(!)ので、決して使用しないでください。

特定の地域のタイムゾーンのレンズを通して自分の瞬間を見るためにwantを使用する場合は、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-TimeDateTime のコンストラクタは似ています:longintではなく)を生成するには、1000を乗算します。

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 のような、面倒な古い レガシー 日時クラスに代わるものです。

Joda-Time プロジェクトは、現在 メンテナンスモード になっており、 Java.time クラスに移行することをお勧めします。

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

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

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

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

ThreeTen-Extra プロジェクトはJava.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。

21
Basil Bourque

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

11
f1sh

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

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

タイムゾーンを設定します。 UTCとも呼ばれる、あなたは単に書き換えることができます。

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