【问题标题】:Change Joda DateTime timezone but don't change time更改 Joda DateTime 时区但不更改时间
【发布时间】:2015-05-14 13:13:44
【问题描述】:

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

例如:我设置了 5 月 15 日星期五 15:00 的提醒。如果时区在该时间之前更改,我希望能够在当地时间 5 月 15 日星期五 15:00 重新创建提醒。

我已经尝试使用 withZoneRetainFields 但我无法保持时间不变:

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

【问题讨论】:

    标签: android datetime jodatime


    【解决方案1】:

    嗯,这个方法应该基本可以工作:

    @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 班次调整它,如果您使用完整时区(“欧洲/柏林”)计算毫秒而不是比固定的偏移量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多