我正在使用(可能不正确)Joda DateTime在提醒应用中存储提醒时间。当设备上的时区发生变化时(由于DST或只是移动到不同的TZ),我希望能够重置提醒以使用当前时区但保留时间。
例如:我在5月15日星期五15:00设置提醒。如果时区在此之前发生变化,我希望能够在当地时间5月15日星期五15:00重新创建提醒。
我已经尝试过使用ZoneRetainFields,但我还没有能够保持时间不变:
new DateTime(reminderTimeMillis, DateTimeZone.forID(previousTimeZone)).withZoneRetainFields(DateTimeZone.getDefault())
答案 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) ;欧洲/柏林")而不是固定的抵消。