更改Joda DateTime时区但不要更改时间

时间:2015-05-14 13:13:44

标签: android datetime jodatime

我正在使用(可能不正确)Joda DateTime在提醒应用中存储提醒时间。当设备上的时区发生变化时(由于DST或只是移动到不同的TZ),我希望能够重置提醒以使用当前时区但保留时间。

例如:我在5月15日星期五15:00设置提醒。如果时区在此之前发生变化,我希望能够在当地时间5月15日星期五15:00重新创建提醒。

我已经尝试过使用ZoneRetainFields,但我还没有能够保持时间不变:

new DateTime(reminderTimeMillis, DateTimeZone.forID(previousTimeZone)).withZoneRetainFields(DateTimeZone.getDefault())

1 个答案:

答案 0 :(得分:0)

那么,该方法应该基本起作用:

@Test
public void change_timezone_of_reminder() {
    DateTime originalReminderDateTime = LocalDateTime.parse("2015-05-15T15:00").toDateTime(
            DateTimeZone.forID("Europe/Berlin"));
    assertThat(originalReminderDateTime.toString(), equalTo("2015-05-15T15:00:00.000+02:00"));
    long reminderMillis = originalReminderDateTime.getMillis();
    DateTime updatedTime = new DateTime(reminderMillis, DateTimeZone.forID("Europe/Berlin"))
            .withZoneRetainFields(DateTimeZone.forID("America/New_York"));
    assertThat(updatedTime.toLocalDateTime(), equalTo(LocalDateTime.parse("2015-05-15T15:00")));
    assertThat(updatedTime.toString(), equalTo("2015-05-15T15:00:00.000-04:00"));
}

那么,您如何评估时间字段没有变化?

此外,如果您将提醒时间存储为时间之后的毫秒,如果您使用全时区计算毫秒,则不需要为DST班次调整提醒时间(&#34) ;欧洲/柏林")而不是固定的抵消。