2016-03-22 17 views
1

Ben Giden web hizmeti için değerleri doldurma parçası olarak bir GregorianCalendar bir OffsetDateTime dönüştürme ediyorum. Sadece gerçek dönüşümü test edeceğimi düşündüm. Karşılaştırma gregorianCutover değerlendirmesinde başarısız equalto içindeNeden GregorianCalendar ve OffsetDateTime arasında dönüşüm başarısız oluyor?

@Test 
public void testOffsetDateTimeToGregorianCalendar() { 
    // given the current gregorian utc time 
    GregorianCalendar expectedGregorianUtcNow = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
    OffsetDateTime expectedUtcOffsetDateTime = OffsetDateTime.from(expectedGregorianUtcNow.toZonedDateTime()); 

    // when converting to a GregorianCalendar 
    GregorianCalendar actualGregorianUtcNow = GregorianCalendar.from(expectedUtcOffsetDateTime.toZonedDateTime()); 

    // then make sure we got the correct value 
    assertThat(actualGregorianUtcNow, equalTo(expectedGregorianUtcNow)); 
} 

: -

Bu işlem, başarısız ve nedenini anlamıyorum burada test yöntemidir. Niye ya? Bu bir hata mı?

gerçek var gibi görünüyor: gregorianCutover = -9223372036854775808 ve beklenen vardır: gregorianCutover = -12219292800000

birim test çıkışı (gregorianCutover orada görünmüyor) 'de görülebileceği gibi diğer her şey doğrudur:

java.lang.AssertionError: 
    Expected:<java.util.GregorianCalendar[time=1458667828375,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=82,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=30,SECOND=28,MILLISECOND=375,ZONE_OFFSET=0,DST_OFFSET=0]> 
    but: was <java.util.GregorianCalendar[time=1458667828375,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=82,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=30,SECOND=28,MILLISECOND=375,ZONE_OFFSET=0,DST_OFFSET=0]> 

Yanlış bir şey mi yaptım?

cevap

1

Temelde, bildiğim kadarıyla farkındayım olarak, java.time bir Gregoryen cutover modellemek için çalışmaz - Bir OffsetDateTime bir GregorianCalendar geri dönüştürülür, bu nedenle zaman o geri cutover ile Gregoryen takvimi sahip olarak modellemeyi tarafından yapılır zamanın başında. Dolayısıyla GregorianCalendar.from(ZoneDateTime) için belgeleri: ZonedDateTime yana

Jülyen-Gregoryen cutover tarihini desteklemek ve ISO takvim sistemini kullanan değil, dönüş GregorianCalendar saf Gregoryen takvimi ve Pazartesi sahiptir hafta tanımları için ISO 8601 standardını kullanır MinimalDaysInFirstWeek değeri olarak FirstDayOfWeek 4 arasında değişir.

İdeal olarak, sana ... tarih/saat API açısından java.util.* kullanmaktan kaçınmak her yerde java.time ile sopa öneririm. Eğer gerçekten gerekiyorsa Ama muhtemelen sadece test eşitlik için GregorianCalendar.equals kullanılmasını önermiyoruz ediyorum -. bu şeyler ise ilgilendiğiniz ayrı ayrı zamanlı olarak anında ve saat dilimini kontrol

+0

sayesinde ... ben Eğer JAXB oluşturulan bir web servisine entegre çalıştığınızda, oluşturulan DateTimeOffset fabrika bir GregorianCalendar ile vermenizi gerektirir çünkü uzak eşittir yönteminden kalmak, ancak API uzak durmak bir olasılık değildir edecek –

İlgili konular