web-dev-qa-db-ja.com

Javaでエポック秒を日付と時刻の形式に変換する

1970年1月1日UTC(エポック時間)からの秒数があります。

 1320105600 

その秒を以下の形式で日付と時刻に変換する必要があります。

 2011年11月4日金曜日午前5:00 

どうすればこれを達成できますか?

21
androiduser

従来の_Java.util.Date_および_Java.util.Calendar_ APIに制限されている場合は、タイムスタンプが秒ではなくミリ秒で解釈されることを考慮する必要があります。したがって、タイムスタンプをミリ秒単位で取得するには、最初に1000を掛ける必要があります。

_long seconds = 1320105600;
long millis = seconds * 1000;
_

この方法で、a.oにフィードできます。 _Java.util.Date_ のコンストラクターで、最後に SimpleDateFormat を使用して、希望する日付形式で_Java.util.Date_を_Java.lang.String_に変換します必要に応じて、事前に定義されたタイムゾーンを使用したパターン(そうでない場合は、システム デフォルトのタイムゾーン を使用します。

_Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
_

すでにJava8を使用している場合は、 LocalDateTime#ofEpochSecond() があり、ミリ秒フレーバーに乗算する必要なく、エポック秒を直接フィードできます。

_LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
_
32
BalusC
long yourSeconds = 1320105600L;
Date d = new Date(yourSeconds * 1000);

詳細は javadoc をご覧ください。コンストラクタにはミリ秒が必要です。

この日付を適切な形式で表示するには、 DateFormat を確認する必要があります

次に例を示します。

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
12
lukastymo

Java.time

BalusCによる回答 は、Java.timeの使用を示す点で優れています。しかし、そのAnswerは LocalDateTime を使用します。ここで Instant がより適切です。 LocalDateTime は、notであり、意図的に offset-from-UTC または タイムゾーン

Java.time

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、_Java.util.Date_、_.Calendar_、&_Java.text.SimpleDateFormat_。 Joda-Time チームは、Java.timeへの移行も推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。

Java.time機能の多くは、Java 6&7 in ThreeTen-Backport にバックポートされ、さらにAndroid in ThreeTenABP

Instant

[〜#〜] utc [〜#〜] のタイムライン上の瞬間が nanoseconds までの解像度で Instant クラス。

_Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );
_

コンソールにダンプします。入力値は、2011年11月1日 [〜#〜] utc [〜#〜] の最初の瞬間です。末尾のZは、 'Zulu'の略で、UTCを意味します。

_System.out.println ( "instant: " + instant );
_

インスタント:2011-11-01T00:00:00Z

ZonedDateTime

あなたのコメントの中で、あなたは _America/Chicago_ タイムゾーンのレンズを通してこの日時を見たいと述べています。 適切なタイムゾーン名 を使用します。タイムゾーンZoneIdを適用して、ZonedDateTimeオブジェクトを取得します。シカゴはその日付のUTCから5時間遅れていることがわかります。

_ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );
_

zdt:2011-10-31T19:00-05:00 [アメリカ/シカゴ]

ひも

上記の文字列は、標準の ISO 8601 形式です。他の形式の文字列を生成するには、 DateTimeFormatter クラスを使用します。独自のカスタムパターンを指定できます。しかし、一般的には、Java.timeが Locale オブジェクトでエンコードされた人間の言語と文化的規範に自動的にローカライズできるようにすることが最善です。

_DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatter = formatter.withLocale ( Locale.US );
String output = zdt.format ( formatter );
_

2011年10月31日月曜日7:00:00 PM CDT

独自のカスタム形式を指定するには、Stack Overflowで多くの例と詳細な説明を検索してください。

6
Basil Bourque
int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));
2
Eng.Fouad

トリックは、Java.util.DateJava.text.DateFormatを使用して、必要な形式を取得することです。 Webのチュートリアル でその方法を調べることができます。

0
Malcolm