### Question:
DateTimeValue extends TemporalValue<ZonedDateTime,DateTimeValue> { public static DateTimeValue datetime( DateValue date, LocalTimeValue time, ZoneId zone ) { return new DateTimeValue( ZonedDateTime.of( date.temporal(), time.temporal(), zone ) ); } private  DateTimeValue( ZonedDateTime value ); static DateTimeValue datetime( DateValue date, LocalTimeValue time, ZoneId zone ); static DateTimeValue datetime( DateValue date, TimeValue time ); static DateTimeValue datetime(
            int year, int month, int day, int hour, int minute, int second, int nanoOfSecond, String zone ); static DateTimeValue datetime(
            int year, int month, int day, int hour, int minute, int second, int nanoOfSecond, ZoneId zone ); static DateTimeValue datetime( long epochSecond, long nano, ZoneOffset zoneOffset ); static ZonedDateTime datetimeRaw( long epochSecond, long nano, ZoneOffset zoneOffset ); static DateTimeValue datetime( ZonedDateTime datetime ); static DateTimeValue datetime( OffsetDateTime datetime ); static DateTimeValue datetime( long epochSecondUTC, long nano, ZoneId zone ); static ZonedDateTime datetimeRaw( long epochSecondUTC, long nano, ZoneId zone ); static DateTimeValue ofEpoch( IntegralValue epochSecondUTC, IntegralValue nano ); static DateTimeValue ofEpochMillis( IntegralValue millisUTC ); static DateTimeValue parse( CharSequence text, Supplier<ZoneId> defaultZone,
            CSVHeaderInformation fieldsFromHeader ); static DateTimeValue parse( CharSequence text, Supplier<ZoneId> defaultZone ); static DateTimeValue parse( TextValue text, Supplier<ZoneId> defaultZone ); static DateTimeValue now( Clock clock ); static DateTimeValue now( Clock clock, String timezone ); static DateTimeValue now( Clock clock, Supplier<ZoneId> defaultZone ); static DateTimeValue build( MapValue map, Supplier<ZoneId> defaultZone ); static DateTimeValue select( AnyValue from, Supplier<ZoneId> defaultZone ); static DateTimeValue truncate(
            TemporalUnit unit,
            TemporalValue input,
            MapValue fields,
            Supplier<ZoneId> defaultZone ); @Override boolean supportsTimeZone(); @Override boolean equals( Value other ); @Override void writeTo( ValueWriter<E> writer ); @Override String prettyPrint(); @Override ValueGroup valueGroup(); @Override String getTypeName(); @Override T map( ValueMapper<T> mapper ); @Override DateTimeValue add( DurationValue duration ); @Override DateTimeValue sub( DurationValue duration ); static ZoneId parseZoneOffsetOrZoneName( String zoneName ); static final DateTimeValue MIN_VALUE; static final DateTimeValue MAX_VALUE; }### Answer:
@Test public void shouldEqualItself() { assertEqual( datetime( 10000, 100, UTC ), datetime( 10000, 100, UTC ) ); }
@Test public void shouldNotEqualSameInstantButDifferentTimezone() { assertNotEqual( datetime( 10000, 100, UTC ), datetime( 10000, 100, ZoneOffset.of( "+01:00" ) ) ); }
@Test public void shouldNotEqualSameInstantInSameLocalTimeButDifferentTimezone() { assertNotEqual( datetime( 2018, 1, 31, 10, 52, 5, 6, UTC ), datetime( 2018, 1, 31, 11, 52, 5, 6, "+01:00" ) ); }
@Test public void shouldNotEqualSameInstantButDifferentTimezoneWithSameOffset() { assertNotEqual( datetime( 1969, 12, 31, 23, 59, 59, 0, UTC ), datetime(1969, 12, 31, 23, 59, 59, 0, "Africa/Freetown" ) ); }