JavaDateオブジェクトへのUnixエポック時間


84

UNIXエポック時間を含む文字列があり、それをJavaDateオブジェクトに変換する必要があります。

String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
  Date expiry = df.parse(date);
 } catch (ParseException ex) {
  ex.getStackTrace();
}

マークされた線は私が問題を抱えているところです。SimpleDateFormat()の引数がどうあるべきか、あるいはSimpleDateFormat()を使用する必要があるとしても理解できません。


Joda-Timeライブラリを使用したサンプルコードを使用して、ミリ秒から日時への変換に関する同様の質問に対する私の詳細な回答を参照しください。
バジルバーク

private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
JVJplus

回答:


125

どうですか:

Date expiry = new Date(Long.parseLong(date));

編集:rde6173の回答に従って、質問で指定された入力を詳しく見ると、「1081157732」は秒ベースのエポック値であるように見えるため、parseLong()からのlongに1000を掛けて変換する必要がありますミリ秒単位。これは、JavaのDateコンストラクターが使用するものです。

Date expiry = new Date(Long.parseLong(date) * 1000);

4
うるう秒が考慮されていないため、これは技術的に正しくありませんか?
Maciej Piechotka 2011年

1
Maciej、opの「秒ベース」のエポックはすでにうるう秒を占めており、「秒」ベースです。したがって、この答えは正しいです。
thecarpy 2014年

1
1000を掛けると間違った値になりますが、もっと良い方法はありませんか?
Ishaan 2016

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

問題は、日付がGMTからの長いものであると予想しているのに対し、UTCであるエポック以来でしたが、それらは同じですか?
ルーク

37

エポックは、1970年1月1日からの数です。

そう:

String epochString = "1081157732";
long epoch = Long.parseLong( epochString );
Date expiry = new Date( epoch * 1000 );

詳細については、http//www.epochconverter.com/をご覧ください。


1
これは扱います... IDKYこれは回答としてチェックされていません:)
Makky 2012

この答えをありがとう。私はエポックから日付をインスタンス化しようとしてここに座っていたし、結果は1970年に、常にいくつかの日だった、そしてそれは私が知らないうちに:)ない秒、Javaのミリ秒を与えていたためだった
LO-タン

24

java.time

Java8java.time以降に組み込まれているフレームワークを使用します。

import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;

long epoch = Long.parseLong("1081157732");
Instant instant = Instant.ofEpochSecond(epoch);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]

この場合、エポックはJavaで使用されるUnix時間のUTCで定義されているためZonedDateTimeUTCタイムゾーンの日付としてマークするために使用することをお勧めします。

ZoneOffset上記の最後の行に示されているように、UTCタイムゾーンの便利な定数が含まれています。そのスーパークラスは、ZoneId他のタイムゾーンに調整するために使用できます。

ZoneId zoneId = ZoneId.of( "America/Montreal" );

いい答えだ。を削除してLocalDateTime、を表示することをお勧めしZonedDateTimeます。ほとんどのビジネスアプリでZonedDateTimeは、これが最善の方法です。人々はLocalXXXタイプとのトラブル/混乱に陥る傾向があります。
バジルバーク2015

7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)

0

さらに良いことに、JodaTimeを使用してください。文字列を解析して文字列に変換するのがはるかに簡単です。スレッドセーフでもあります。それを実装するのにかかる時間の価値があります。


FYI、ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。Oracleによるチュートリアルを参照してください。
バジルバーク2018

0

秒のタイムスタンプをミリ秒のタイムスタンプに変換します。TimeUnit APIを使用して、このようにすっきりさせることができます。

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


-1

うーん....私が間違っていなければ、UNIXエポック時間は実際にはと同じものです

System.currentTimeMillis()

だから書く

try {
    Date expiry = new Date(Long.parseLong(date));
}
catch(NumberFormatException e) {
    // ...
}

動作するはずです(そしてその日付の解析ははるかに高速です)


4
通常、Unixエポック時間はミリ秒ではなく秒単位で測定されます。
サイモンニッカーソン2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.