Webサービスからダウンロードした長い値のリスト(例:1220227200、1220832000、1221436800 ...)があります。私は日付に変換する必要があります。残念ながら、このように、たとえば:Javaで長整数型を日付に変換する1970年
Date d = new Date(1220227200);
返される1970年1月1日。誰かが正しく変換する別の方法を知っていますか?
Webサービスからダウンロードした長い値のリスト(例:1220227200、1220832000、1221436800 ...)があります。私は日付に変換する必要があります。残念ながら、このように、たとえば:Javaで長整数型を日付に変換する1970年
Date d = new Date(1220227200);
返される1970年1月1日。誰かが正しく変換する別の方法を知っていますか?
Date
constructor(リンクをクリックしてください)は、long
の時刻をミリ秒秒で受け付けます。 1000を掛けて、long
としてください。
Date d = new Date(1220227200L * 1000);
これは、ここに示し
日8月31日夜08時00分00秒GMT-04:00あなたのlong型は、秒、およびミリ秒ではないているように見えます2008
代わりに、よりクリーンで、より少ない* magic-numberesque *ソリューションのために、 'Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));'を使用してください。 –
人は、おそらくJavaの新しいDate(長い)コンストラクタのために必要とされるミリ秒に秒ないのタイムスタンプです。 1000倍にするだけで大丈夫です。
Bah .. 30秒遅すぎる:P –
もっと適切に30000ミリ秒遅い – SJuan76
新しい日付(数値)は、1970年1月1日より、number
ミリ秒の日付を返します。日付形式は、1970年1月1日よりちょうど少し遅れていることを示す時間、分、秒が表示されません。
正しい解析ルーティングに従って日付を解析する必要があります。私は1220227200が何であるかはわかりませんが、1970年1月1日以降に数秒であれば、それを掛けてミリ秒になります。そうでない場合は、1970年以降に何らかの方法でミリ秒に変換します(java.util.Dateを引き続き使用したい場合)。
私のために働きます。あなたはおそらくそれを1000で乗算したいでしょう。なぜなら、1970年からの秒数と1秒からのミリ秒数を渡す必要があるからです。1970年
1220227200は1980年1月15日に対応します(そして実際には新しいDate(1220227200).toString )は "Thu Jan 15 03:57:07 CET 1970"を返します。長い値を日付に渡すと、それは01/01/1970の前になり、実際には1970年1月1日の日付が返されます。値がこの状況にないことを確認してください(82800000未満)。
これを試してみてください:
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(1220227200 * 1000);
System.out.println(cal.getTime());
を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
のみカレンダー上の工場で時間を設定します。以下は、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());
Instant.ofEpochSecond(1_220_227_200L)
人々はepoch以来の数として、追跡時に各種精度を使用して知っています。したがって、エポック時からカウントとして解釈されるいくつかの数値を取得するときは、次のように決定する必要があります:
あなたのケースでは、他の人が指摘したように、あなたはUnixエポックから秒を与えられているようです。しかし、あなたはミリ秒を期待するコンストラクタに秒を渡しています。したがって、解決策は1,000倍にすることです。
教訓:
あなたのデータは、全体秒であるように思われます。我々は、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枠組みに移行する私たちを求めています。 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);
乾杯。素晴らしい説明。私は1970年から新しいDateTime(
あなたはどのような価値を期待していますか?秒/ミリ秒の質問は有効なものかもしれませんが、1220227200は1/1/1970ではありません。0をコンストラクタに渡しているようです。いくつかのコードが役に立つかもしれません。 – SJuan76
@ mmmiki - 答えは – Stewart
です。それは1970年1月15日を返します。ここでは、1日目ではありません。 – njzk2