[threeten-dev] Instant.with(TemporalField, long) does not throw ArithmeticException for numeric overflow error

Patrick Zhang patrick.zhang at oracle.com
Mon Feb 18 04:27:32 PST 2013


I know each valid zoneId should have one fixed ZoneOffset. So it makes 
sense to me that ZoneOffset keeps "+2:00".
But from description of OffsetDateTime.adjustInto(), there is some conflict.

Regards
Patrick

On 2/18/13 8:20 PM, Patrick Zhang wrote:
> Hi Stephen,
>
> Thanks, I will modify my test code to DateTimeException for such kind 
> of scenarios. I will send out another mail for review.
>
> And Here I have another question for adjustInto() method in 
> java.time.temporal.TemporalAdjuster interface.
>
> Actually, I am a bit confused by OffsetDateTime.adjustInto().
> From description in javadoc,
> ===============
> The adjustment is equivalent to using Temporal.with(TemporalField, 
> long) three times, passing ChronoField.OFFSET_SECONDS, 
> ChronoField.EPOCH_DAY and ChronoField.NANO_OF_DAY as the fields.
> ===============
>
> We can confirm OffsetDateTime.adjustInto(temporal) should work well if 
> "temporal" object supports below 3 fileds:
> OFFSET_SECONDS
> EPOCH_DAY
> NANO_OF_DAY
>
> So I am trying to convert one OffsetDateTime to ZonedDateTime since it 
> supports such 3 fields really:
> ============
>                 ZoneId ZONE_PARIS = ZoneId.of("Europe/Paris");
>                 ZoneId ZONE_GAZA = ZoneId.of("Asia/Gaza");
>                 ZoneOffset OFFSET_PONE = ZoneOffset.ofHours(1);
>
>                 OffsetDateTime t1 = 
> OffsetDateTime.of(LocalDateTime.of(2012, 3, 4, 23, 5), OFFSET_PONE);
>                 ZonedDateTime t2 = 
> ZonedDateTime.of(LocalDateTime.of(2012, 3, 4, 1, 1, 1, 100), ZONE_GAZA) ;
>                 ZonedDateTime t3 = (ZonedDateTime)(t1.adjustInto(t2)) ;
>                 System.out.println(t1) ;
>                 System.out.println(t2) ;
>                 System.out.println(t3) ;
> ===========
>
> The output is below:
> ===========
> 2012-03-04T23:05+01:00
> 2012-03-04T01:01:01.000000100+02:00[Asia/Gaza]
> 2012-03-04T23:05+02:00[Asia/Gaza]
> ===========
>
> The date-time related fields are  "adjustInto" really. But it looks 
> ZoneOffset do not change. It still keeps "+02:00".
>
> Is it a bug? Personally I think the ZoneOffset should be modified to 
> "+01:00" since OFFSET_SECONDS will be adjusted. :)
>
> FYI,
> When I adjust one OffsetDateTime to another OffsetDateTime, the 
> ZoneOffset will be changed as javadoc description.
>
> Regards
> Patrick
>
>
> On 2/18/13 5:46 AM, Stephen Colebourne wrote:
>> On 17 February 2013 15:27, Patrick Zhang<patrick.zhang at oracle.com>  
>> wrote:
>>> I have found such a problem during creating new test code for
>>> java.time.Instant.
>>> It can be reproduced easily by below:
>>>
>>>                  Instant i1 = Instant.ofEpochSecond(1, -10) ;
>>>                  Instant i3 = i1.with(ChronoField.NANO_OF_SECOND,
>>> 1000000000L);
>>>
>>> As javadoc description, it should throw ArithmeticException since 
>>> range of
>>> NANO_OF_SECOND is 0-999999999.
>>>
>>> Actually it throws DateTimeException,
>>> =======
>>> Exception in thread "main" java.time.DateTimeException: Invalid 
>>> value for
>>> NanoOfSecond (valid values 0 - 999999999): 1000000000
>>>      at 
>>> java.time.temporal.ValueRange.checkValidValue(ValueRange.java:309)
>>>      at 
>>> java.time.temporal.ChronoField.checkValidValue(ChronoField.java:583)
>>>      at java.time.Instant.with(Instant.java:632)
>>>      at Test1.f1(Test1.java:14)
>>>      at Test1.main(Test1.java:5)
>>> =======
>> DateTimeException is the correct error here.
>>
>> ArithmeticException is for numeric overflow, such as multiplying two
>> numbers exceeds the capability of an int.
>> DateTimeException includes general argument validity problems, like 
>> that above.
>>
>> Stephen


More information about the threeten-dev mailing list