0

アラームマネージャーが繰り返しアラームを設定するためのミリ秒を取得していますが、奇妙な結果が得られます-

午前8時55分にアラームを設定しました

LocalDateTime Earliest Day : 2018-05-22T08:55
Instant : 2018-05-22T08:55:00Z

次に、このメソッドを使用して、エポック(1970)からのミリ秒を取得しました-

LogUtils.LOGD(TAG, instant.toEpochMilli() + " : instant.toEpochMilli()");

アラームがすぐに入ったので、カレンダーとJava時間からミリ秒を取得する古い方法を確認しました-

1526996659862 : System.currentTimeMillis() : 
1526979300000 : instant.toEpochMilli()
1526997319862 : calendar.getTimeInMillis()

これによって構築されたlocaldatetimeを取得しました-

LocalDateTime earliestDay = LocalDateTime.of(
        now.getYear(), now.getMonth().getValue(), now.getDayOfMonth(),
        localTime.getHour(), localTime.getMinute(), localTime.getSecond());

次に、インスタントに変換し、ZoneOffset - UTC - を使用します。

Instant instant = earliestDay.toInstant(ZoneOffset.UTC);

toEpochMilliseconds が意図したとおりに機能しない理由がわかりません。

カレンダー入力 -

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, earliestDay.getHour());
calendar.set(Calendar.MINUTE, earliestDay.getMinute());
4

1 に答える 1

0
    ZoneId zone = ZoneId.of("America/Chicago");
    LocalTime alarmTime = LocalTime.of(8, 55);

    LocalDate today = LocalDate.now(zone);
    LocalDateTime earliestDay = today.atTime(alarmTime);
    Instant instant = earliestDay.atZone(zone).toInstant();

    System.out.println(instant.toEpochMilli() + " : instant.toEpochMilli()");

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, earliestDay.getHour());
    calendar.set(Calendar.MINUTE, earliestDay.getMinute());

    System.out.println(calendar.getTimeInMillis() + " : calendar.getTimeInMillis()");

JVM のタイム ゾーンもアメリカ/シカゴに設定し、このコードを実行しました。次に、次のように印刷しました。

1527083700000 : instant.toEpochMilli()
1527083700796 : calendar.getTimeInMillis()

その差は0.8秒。Calendarミリ秒がクリアされていないため、不正確です。

アメリカ/シカゴのタイム ゾーンで 08:55 にアラームが必要な場合はZoneOffset.UTCInstant.

あなたのタイムゾーンがアメリカ/シカゴである限りZoneId.systemDefault()、ゾーンに使用することを検討できます. デフォルト設定は、プログラムの他の部分または同じ JVM で実行されている他のプログラムからいつでも変更される可能性があり、予期せぬ事態につながる可能性があります。

于 2018-05-23T16:23:28.413 に答える