web-dev-qa-db-ja.com

エポック時間を日付に変換する

これを行う方法は数百万通りありますが、効果はありません。どんな助けでも大歓迎です。

long millis = getMillisFromServer();
Date date = new Date(millis);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String formatted = format.format(date);

上記は機能しません。

基本的に、私がやりたいのは、エポック時間を取得してオーストラリア時間に変換することです。私の現地時間は+05.30ですが、もちろんこれがこの変換に寄与する要因になりたくありません。

編集

正確なコードを実行すると出力されます。

エポック1318388699000

2011年10月12日水曜日08:34:59 GMT + 05:30 2011

12/10/2011 03:04:59

12/10/2011 14:04:59

19
Hades

編集:さて、あなたはローカル時間(オーストラリアではない)が結果に貢献したくないが、代わりにオーストラリアのタイムゾーン。 シドニーは現在UTC + 11 であり、UTC + 10ではありませんが、既存のコードはまったく問題ありません。短いが完全なテストアプリ:

_import Java.util.*;
import Java.text.*;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Date date = new Date(1318386508000L);
        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String formatted = format.format(date);
        System.out.println(formatted);
        format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
        formatted = format.format(date);
        System.out.println(formatted);
    }
}
_

出力:

_12/10/2011 02:28:28
12/10/2011 13:28:28
_

Joda Time の使用を開始することもお勧めします。これは、単にはるかに優れた日付/時刻APIです...

編集:システムが_Australia/Sydney_タイムゾーンを知らない場合、wouldはUTCを表示することに注意してください。たとえば、TimeZone.getTimeZone("blah/blah")を使用するコードを変更すると、UTC値が2回表示されます。 TimeZone.getTimeZone("Australia/Sydney").getDisplayName()を印刷して、それが何を言っているのかを確認し、コードのタイプミスもチェックすることをお勧めします:)

29
Jon Skeet

エポック時間が秒単位であり、Dateオブジェクトがミリ秒単位のLong値を受け入れることに注意してください。したがって、エポック値を1000で乗算して、長い値として使用する必要があります。以下のように:-

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Long dateLong=Long.parseLong(sdf.format(Epoch*1000));
11
Anup Mehta

これが最新の回答です(2014年以降有効)。受け入れられた答えは、2011年には非常にすばらしい答えでした。最近では、DateDateFormat、およびSimpleDateFormatクラスを使用することをお勧めしません。最新のJava日付と時刻API。

あなたのミリ秒から日時オブジェクトを取得するには:

    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("Australia/Sydney"));

millis1318388699000Lと等しい場合、これは2011-10-12T14:04:59+11:00[Australia/Sydney]になります。何らかの奇妙な方法でコードがオーストラリア/シドニーのタイムゾーンを知らないJVMで終了した場合、必ず例外を介して通知されます。

文字列形式の日付と時刻を表示する場合:

String formatted = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));

結果:

12/10/2011 14:04:59

PS「上記が機能しない」とはどういう意味かわかりません。私のコンピューターでは、質問のコードも12/10/2011 14:04:59と表示されます。

6
Ole V.V.