同じパラメータを持つ別の呼び出しによってLocalDateTimeを持つ異なる結果

Amannti:

問題は、私はLocalDateTimeを対象にCalendarオブジェクトから自分のコードを変更する必要があること、です。しかし、私は最後に同じタイムスタンプを得ることはありません。最初の呼び出しでは、私は他のタイムスタンプを取得し、私はタイムスタンプを計算するために同じパラメータを使用して、次の呼び出しで、のLocalDateTimeと同じです。私は別の結果を得るなぜ私は知りません。それは私のためのロジックではありません。私は何をしたいです:私はUTCタイムスタンプを取得します。私は(夏と冬のシーズンについての重要な)ドイツ(ヨーロッパ/ベルリン)の時間でそれを設定したいです。それから私は、日(夜12時)の開始と一日の終わり(23:59)を計算します。それから私は、この回のタイムスタンプを取得したいです。

私は、スプリングブーツとのAPIを構築します。上記機能は、ばねブートからコントローラクラスによって呼び出されます。APIの開始後の最初の呼び出しは、期待される結果を計算します。しかし、すべての次の呼び出しは、他の結果を与えます。7200差常に。私はLocalDateTimeを持つ他の方法を試してみましたが、それは、カレンダーと同じタイムスタンプをgavesことはありません。

localdatetimeway:

LocalDateTime localDateTime = 
LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
LocalDateTime dayStartLocal = localDateTime.withHour(0)
    .withMinute(0)
    .withSecond(0)
    .withNano(0);

ZonedDateTime startZonedDateTime = dayStartLocal.atZone(ZoneId.systemDefault());
long dayStartTimeStamp = startZonedDateTime.toInstant().getEpochSecond();

LocalDateTime dayEndLocal = localDateTime.withHour(23)
    .withMinute(59)
    .withSecond(59)
    .withNano(999);

ZonedDateTime endZonedDateTime = dayEndLocal.atZone(ZoneId.systemDefault());
long dayEndTimeStamp = endZonedDateTime.toInstant().getEpochSecond();

CalendarWay:

Calendar cal=Calendar.getInstance();
cal.setTimeInMillis(timestamp*1000);
cal.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
long dayStartTimeStamp = calendar.getTimeInMillis()/1000L;

cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,999);

long dayEndTimeStamp = calendar.getTimeInMillis()/1000L;

私はのparamタイムスタンプ1536933600.結果1536876000と1536962399.で欲しいしかし、私はのLocalDateTime方法1536883200と1536969599により、最初の要求の後に取得します。

チャールズDowbecki:

あなたは、あなたのために、システムのデフォルトのゾーンを使用しているjava.timeため、コードとヨーロッパ/ベルリンゾーンCalendarコード。7200最も可能性の高いシステムのタイムゾーンとヨーロッパ/ベルリン(2時間)の間の差です。

すべてを交換しZoneId.systemDefault()ZoneId.of("Europe/Berlin")、あなたは両方のバージョンで同じ値を取得します。

timestamp = 1536933600
dayStartTimeStamp = 1536876000
dayEndTimeStamp = 1536962399

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236079&siteId=1