2015-05-14 73 views
0

我正在使用(也許不正確)喬達日期時間在提醒應用程序中存儲提醒時間。當設備上的時區更改(由於DST或剛移動到不同的TZ)時,我希望能夠重置提醒以使用當前時區,但保留時間。更改Joda DateTime時區但不更改時間

例如:我在5月15日星期五的15:00設置提醒。如果時區在此時間之前發生變化,我希望能夠在當地時間5月15日星期五15:00重新創建提醒。

我已經嘗試使用withZoneRetainFields,但我一直沒能保持時間保持不變:

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

回答

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班次調整它而不是一個固定的抵消。