Skip to content

Commit

Permalink
Memorize computed nanosOfDayUTC in TimeValue
Browse files Browse the repository at this point in the history
Such value will be adjusted with offset and will not wrap over midnight.
So it will always be in [-18, +42] hour range.

Previously `TimeValue` memorized the `nanosOfDayUTC` it was constructed with.
  • Loading branch information
lutovich committed Mar 27, 2018
1 parent a2f5d74 commit ddc0a68
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 7 deletions.
Expand Up @@ -74,7 +74,7 @@ public static TimeValue time( int hour, int minute, int second, int nanosOfSecon

public static TimeValue time( long nanosOfDayUTC, ZoneOffset offset )
{
return new TimeValue( OffsetTime.ofInstant( Instant.ofEpochSecond( 0, nanosOfDayUTC ), offset ), nanosOfDayUTC );
return new TimeValue( OffsetTime.ofInstant( Instant.ofEpochSecond( 0, nanosOfDayUTC ), offset ) );
}

public static TimeValue parse( CharSequence text, Supplier<ZoneId> defaultZone, CSVHeaderInformation fieldsFromHeader )
Expand Down Expand Up @@ -271,12 +271,6 @@ private static long getNanosOfDayUTC( OffsetTime value )
return ( secondsOfDayLocal - secondsOffset ) * NANOS_PER_SECOND + value.getNano();
}

private TimeValue( OffsetTime value, long nanosOfDayUTC )
{
this.value = TimeUtil.truncateOffsetToMinutes( value );
this.nanosOfDayUTC = nanosOfDayUTC;
}

@Override
int unsafeCompareTo( Value otherValue )
{
Expand Down
Expand Up @@ -210,6 +210,28 @@ public void shouldBeAbleToParseTimeWithoutTimeZoneWithHeaderInformation()
assertNotEquals( unexpected, actual );
}

@Test
public void shouldWriteDerivedValueThatIsEqual()
{
TimeValue value1 = time( 42, ZoneOffset.of( "-18:00" ) );
TimeValue value2 = time( value1.temporal() );

NanoOfDayAndOffset nanoAndOffset1 = write( value1 );
NanoOfDayAndOffset nanoAndOffset2 = write( value2 );

assertEquals( nanoAndOffset1.nanosOfDay, nanoAndOffset2.nanosOfDay );
assertEquals( nanoAndOffset1.offsetSeconds, nanoAndOffset2.offsetSeconds );
}

@Test
public void shouldCompareDerivedValue()
{
TimeValue value1 = time( 4242, ZoneOffset.of( "-12:00" ) );
TimeValue value2 = time( value1.temporal() );

assertEquals( 0, value1.unsafeCompareTo( value2 ) );
}

@SuppressWarnings( "UnusedReturnValue" )
private DateTimeException assertCannotParse( String text )
{
Expand All @@ -223,4 +245,25 @@ private DateTimeException assertCannotParse( String text )
}
throw new AssertionError( text );
}

private static NanoOfDayAndOffset write( TimeValue value )
{
NanoOfDayAndOffset result = new NanoOfDayAndOffset();
value.writeTo( new ThrowingValueWriter.AssertOnly()
{
@Override
public void writeTime( long nanosOfDayUTC, int offsetSeconds )
{
result.nanosOfDay = nanosOfDayUTC;
result.offsetSeconds = offsetSeconds;
}
} );
return result;
}

private static class NanoOfDayAndOffset
{
long nanosOfDay;
long offsetSeconds;
}
}

0 comments on commit ddc0a68

Please sign in to comment.