これを行う方法は数百万通りありますが、効果はありません。どんな助けでも大歓迎です。
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
編集:さて、あなたはローカル時間(オーストラリアではない)が結果に貢献したくないが、代わりにオーストラリアのタイムゾーン。 シドニーは現在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()
を印刷して、それが何を言っているのかを確認し、コードのタイプミスもチェックすることをお勧めします:)
エポック時間が秒単位であり、Dateオブジェクトがミリ秒単位のLong値を受け入れることに注意してください。したがって、エポック値を1000で乗算して、長い値として使用する必要があります。以下のように:-
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Long dateLong=Long.parseLong(sdf.format(Epoch*1000));
これが最新の回答です(2014年以降有効)。受け入れられた答えは、2011年には非常にすばらしい答えでした。最近では、Date
、DateFormat
、およびSimpleDateFormat
クラスを使用することをお勧めしません。最新のJava日付と時刻API。
あなたのミリ秒から日時オブジェクトを取得するには:
ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
.atZone(ZoneId.of("Australia/Sydney"));
millis
が1318388699000L
と等しい場合、これは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
と表示されます。