2011-09-20 18 views
83

Webサービスからダウンロードした長い値のリスト(例:1220227200、1220832000、1221436800 ...)があります。私は日付に変換する必要があります。残念ながら、このように、たとえば:Javaで長整数型を日付に変換する1970年

Date d = new Date(1220227200); 

返される1970年1月1日。誰かが正しく変換する別の方法を知っていますか?

+0

あなたはどのような価値を期待していますか?秒/ミリ秒の質問は有効なものかもしれませんが、1220227200は1/1/1970ではありません。0をコンストラクタに渡しているようです。いくつかのコードが役に立つかもしれません。 – SJuan76

+1

@ mmmiki - 答えは – Stewart

+0

です。それは1970年1月15日を返します。ここでは、1日目ではありません。 – njzk2

答えて

111

Date constructor(リンクをクリックしてください)は、longの時刻をミリ秒秒で受け付けます。 1000を掛けて、longとしてください。

Date d = new Date(1220227200L * 1000); 

これは、ここに示し

日8月31日夜08時00分00秒GMT-04:00あなたのlong型は、秒、およびミリ秒ではないているように見えます2008

+10

代わりに、よりクリーンで、より少ない* magic-numberesque *ソリューションのために、 'Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));'を使用してください。 –

35

。 Dateコンストラクタはミリ秒のように時間がかかりますので、

Date d = new Date(timeInSeconds * 1000); 
+4

これはなぜダウンボートを取得しましたか?ここでは、反対票をお楽しみください。 – f1sh

+4

@ f1sh:私はダウンボートしなかったが、元の答えは異なっていた。彼は5分の猶予期間内に編集した。 – BalusC

+0

清算をありがとう。それは自分自身の欠点だから... -/ – f1sh

8

人は、おそらくJavaの新しいDate(長い)コンストラクタのために必要とされるミリ秒ないのタイムスタンプです。 1000倍にするだけで大​​丈夫です。

+0

Bah .. 30秒遅すぎる:P –

+19

もっと適切に30000ミリ秒遅い – SJuan76

0

新しい日付(数値)は、1970年1月1日より、numberミリ秒の日付を返します。日付形式は、1970年1月1日よりちょうど少し遅れていることを示す時間、分、秒が表示されません。

正しい解析ルーティングに従って日付を解析する必要があります。私は1220227200が何であるかはわかりませんが、1970年1月1日以降に数秒であれば、それを掛けてミリ秒になります。そうでない場合は、1970年以降に何らかの方法でミリ秒に変換します(java.util.Dateを引き続き使用したい場合)。

0

私のために働きます。あなたはおそらくそれを1000で乗算したいでしょう。なぜなら、1970年からの秒数と1秒からのミリ秒数を渡す必要があるからです。1970年

1

1220227200は1980年1月15日に対応します(そして実際には新しいDate(1220227200).toString )は "Thu Jan 15 03:57:07 CET 1970"を返します。長い値を日付に渡すと、それは01/01/1970の前になり、実際には1970年1月1日の日付が返されます。値がこの状況にないことを確認してください(82800000未満)。

3

これを試してみてください:

Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(1220227200 * 1000); 
System.out.println(cal.getTime()); 
3

をlong値は、最も可能性が高い、Epochタイムスタンプに対応し、値は、次のとおりです。

1220227200 =月、2008年9月1日00:00:00 GMT

1220832000 =月、2008年9月8日00:00:00 GMT

1221436800 =月、2008年9月15日00:00:00 GMT

実際のjava.utilを考慮して、これらのlong値をjava.util.Dateに変換できます。以前に示唆したように、いくつかの欠陥で - - 日付がmillisecsを使用しています。このように:正しく日付を表示するために、今すぐ

// note: enforcing long literals (L), without it the values would just be wrong. 
Date date = new Date(1220227200L * 1000L); 

、1は図示し、以下のようにjava.text.DateFormatのを使用することができます。

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 
df.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println("Wrong date time value: " + date); 
System.out.println("Correct date time value: " + df.format(date)); 

Date wrong (off by 2 hours): Mon Sep 01 02:00:00 CEST 2008 
Correct date : Monday, 1 September 2008 00:00:00 o'clock UTC 
7

のみカレンダー上の工場で時間を設定します。以下は、java.util.Dateに変換long値を表示した結果は、使用したDateFormatを使用して ずにいますオブジェクト

Calendar c = Calendar.getInstance(); 
c.setTimeInMillis(1385355600000l); 
System.out.println(c.get(Calendar.YEAR)); 
System.out.println(c.get(Calendar.MONTH)); 
System.out.println(c.get(Calendar.DAY_OF_MONTH)); 
// get Date 
System.out.println(c.getTime()); 
36

TL; DR

Instant.ofEpochSecond(1_220_227_200L) 

は、データ

人々はepoch以来の数として、追跡時に各種精度を使用して知っています。したがって、エポック時からカウントとして解釈されるいくつかの数値を取得するときは、次のように決定する必要があります:

  • 何時ですか?
    Many epochs datesが様々なシステムで使用されています。一般にはPOSIX/Unix timeが使用されます。エポックは1970年のUTCでの最初の瞬間です。しかし、あなたはこの時代ではないはずです。
  • 精度は?
    時代の到来以来、milliseconds,microseconds、またはnanosecondsとなっていますか?
  • タイムゾーンは何ですか?
    エポック以降のカウントは、通常、UTC/GMTタイムゾーンにあります。つまり、タイムゾーンオフセットはまったくありません。しかし、時には経験の浅い、または日時の無知なプログラマーが関与すると、暗黙のタイムゾーンが存在することがあります。

あなたのケースでは、他の人が指摘したように、あなたはUnixエポックから秒を与えられているようです。しかし、あなたはミリ秒を期待するコンストラクタに秒を渡しています。したがって、解決策は1,000倍にすることです。

教訓:

  • は、受信したデータの意味を負いません、決定します。
  • the docを読んでください。

    Graph showing various granularities of resolution in date-time systems including whole seconds, milliseconds, microseconds, and nanoseconds.

データ

あなたのデータは、全体秒であるように思われます。我々は、1970年の初めのエポックを想定し、我々はUTCタイムゾーンを想定した場合、その後、1,220,227,200は、2008年9月の最初の日の最初の瞬間

ジョダタイム

java.util.Dateである場合Javaにバンドルされた.Calendarクラスは非常に面倒です。それらを避けてください。代わりにJoda-Timeライブラリか、Java 8にバンドルされた新しいjava.time package(またはJoda-Timeに触発されたもの)を使用してください。

juduateとは異なり、Joda-TimeのDateTimeは、自分自身が割り当てられたtime zoneを本当に知っていることに注意してください。したがって、以下に示すJoda-Time 2.4コードの例では、最初にUTCのデフォルト仮定を使用してミリ秒を解析することに注意してください。次に、調整するためにパリのタイムゾーンを割り当てます。宇宙のタイムラインの同じ瞬間、しかし異なるwall-clock time。デモンストレーションのために、我々はUTCに再び調整する。ほとんどの場合、暗黙的なデフォルトに依存するのではなく、明示的に希望の/期待されるタイムゾーンを明示的に指定することをお勧めします(通常、日付時刻の作業ではトラブルの原因になります)。

DateTimeを作成するには、ミリ秒が必要です。だから、秒のあなたの入力を取って、1000を掛ける。 32ビットのintがオーバーフローするので、結果は64ビットのlongでなければならないことに注意してください。

long input = 1_220_227_200L; // Note the "L" appended to long integer literals. 
long milliseconds = (input * 1_000L); // Use a "long", not the usual "int". Note the appended "L". 

コンストラクタへのミリ秒のカウント。その特定のコンストラクタは、1970年のUnix時代からのカウントであると想定しています。したがって、構築後、必要に応じてタイムゾーンを調整します。

proper time zoneの名前、大陸と都市/地域の組み合わせを使用してください。一意ではなく標準化されていないので、ESTのような3文字または4文字のコードは決して使用しないでください。

DateTime dateTimeParis = new DateTime(milliseconds).withZone(DateTimeZone.forID("Europe/Paris")); 

デモンストレーションのために、再度タイムゾーンを調整します。

DateTime dateTimeUtc = dateTimeParis.withZone(DateTimeZone.UTC); 
DateTime dateTimeMontréal = dateTimeParis.withZone(DateTimeZone.forID("America/Montreal")); 

コンソールにダンプします。ヨーロッパでは新しい日が始まったが、アメリカではまだ始まっていないので、モントリオールの日付がどう違うかに注意してください。

System.out.println("dateTimeParis: " + dateTimeParis); 
System.out.println("dateTimeUTC: " + dateTimeUtc); 
System.out.println("dateTimeMontréal: " + dateTimeMontréal); 

実行時。ジョダ時の

dateTimeParis: 2008-09-01T02:00:00.000+02:00 
dateTimeUTC: 2008-09-01T00:00:00.000Z 
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00 

java.time

メーカーは、すぐに便利なように、その交換、java.time枠組みに移行する私たちを求めています。 Joda-Timeは引き続き積極的にサポートされていますが、今後のすべての開発は、ThreeTen-Extraプロジェクトのjava.timeクラスとその拡張で行われます。

java-timeフレームワークはJSR 310で定義され、Java 8以降に組み込まれています。 java.timeクラスは、ThreeTen-BackportプロジェクトではJava 6 & 7に、ThreeTenABPプロジェクトではAndroidにバックポートされています。

Instantは、ナノ秒の解像度でタイムライン上の瞬間をUTCにしています。その時代は1970年の最初の瞬間である。

Instant instant = Instant.ofEpochSecond(1_220_227_200L); 

OffsetDateTimeを取得するためにoffset-from-UTCZoneOffsetを適用します。

既知の場合はZoneIdというタイムゾーンを適用してZonedDateTimeを取得してください。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 
+1

乾杯。素晴らしい説明。私は1970年から新しいDateTime()を取得していました。私はそれを数秒で与えていたことに気がつき、ミリ秒単位で –

関連する問題