2017-01-18 86 views
-2

喬達時間硬編碼在不同時區不起作用。我通過以下方式對Joda時間進行了硬編碼,以便我可以爲我的Junit測試用例提供靜態日期時間。喬達時間硬編碼在不同時區不起作用

LocalDateTime fixedDateTime = new LocalDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, 0, ISOChronology.getInstance("Canada/Pacific"))); 

DateTimeUtils.setCurrentMillisFixed(fixedDateTime.toDate().getTime()); 

但是當你試圖讓當前日期與時間使用下面的API,它可能不會如上述導致確切的固定日期。

DateTime.now(DateTimeZone.forID("Canada/Pacific")); 

這個日期甚至可以提前一天或第二天就取決於哪個時區正在運行的代碼固定日期。 這可能令人沮喪,因爲您的測試用例將在本地通過,但是在部署到虛擬雲計算機時,它可能會使這些虛擬雲計算機上的測試用例失敗,因爲它們可能位於完全不同的時區。

+0

很難在不知道你在等什麼情況下期望發生的事情的情況下給出答案。 –

+0

你可能可以通過將「不起作用」改爲「我無法讓它工作」 –

回答

2

Javadoc of that constructor of LocalDateTime(重點煤礦):

構造一個實例使用指定的年表設置爲指定的日期和時間,其區被忽略

使用的DateTime代替LocalDateTime

DateTime fixedDateTime = new DateTime(
    year, monthOfYear, dayOfMonth, 
    hourOfDay, minuteOfHour, secondOfMinute, 0, 
    ISOChronology.getInstance("Canada/Pacific"))); 

DateTimeUtils.setCurrentMillisFixed(fixedDateTime.getMillis()); 
0

安迪感謝您的回覆。你說的LocalDateTime沒有使用區域。但我最終使用LocalDateTime,因爲我想將日期代碼硬編碼到第二個。但我確實找到了一個解決方案來處理區域產生的偏移。這裏是我的代碼

private LocalDateTime setJodaTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute) { 
     LocalDateTime fixedDateTime = new LocalDateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, 0, ISOChronology.getInstance(DateTimeZone.forID("Canada/Pacific"))); 
     long millisWithoutTimeZone = fixedDateTime.toDate().getTime(); 
     // fixed Joda millis 
     DateTimeUtils.setCurrentMillisFixed(millisWithoutTimeZone); 
     LocalDateTime localDateTime = DateTime.now(DateTimeZone.forID("Canada/Pacific")).toLocalDateTime(); 
     // get time zone offset 
     long offset = localDateTime.toDate().getTime() - millisWithoutTimeZone; 
     // reverse the offset 
     offset = (-1) * offset; 
     DateTimeUtils.setCurrentMillisFixed(millisWithoutTimeZone + offset); 
     LocalDateTime currentDateTime = DateTime.now(DateTimeZone.forID("Canada/Pacific")).toLocalDateTime(); 
     return currentDateTime; 
    }