Hi here.
I have a question about fromLogical method in
connect/api/src/main/java/org/apache/kafka/connect/data/Date.java
below code does these step.
1. calendar with UTC timezone
2. set value
3. check hour, minute, second, millisecond are 0. if not throw DataException.
```
public static int fromLogical(Schema schema, java.util.Date value) {
if (schema.name() == null || !(schema.name().equals(LOGICAL_NAME)))
throw new DataException("Requested conversion of Date object
but the schema does not match.");
Calendar calendar = Calendar.getInstance(UTC);
calendar.setTime(value);
if (calendar.get(Calendar.HOUR_OF_DAY) != 0 ||
calendar.get(Calendar.MINUTE) != 0 ||
calendar.get(Calendar.SECOND) != 0 ||
calendar.get(Calendar.MILLISECOND) != 0) {
throw new DataException("Kafka Connect Date type should not
have any time fields set to non-zero values.");
}
long unixMillis = calendar.getTimeInMillis();
return (int) (unixMillis / MILLIS_PER_DAY);
}
```
but, if value is not made by UTC, for if we read value from other
Timezone, the Date can be represented other value, because timezone
will make difference.
so I think this code cause failure when different timezone.
I think revising with timezone info is a way to solve this.
```
public static int fromLogical(Schema schema, java.util.Date value) {
if (schema.name() == null || !(schema.name().equals(LOGICAL_NAME)))
throw new DataException("Requested conversion of Date object
but the schema does not match.");
//Using DefaultTimeZone
Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
calendar.setTime(value);
if (calendar.get(Calendar.HOUR_OF_DAY) != 0 ||
calendar.get(Calendar.MINUTE) != 0 ||
calendar.get(Calendar.SECOND) != 0 ||
calendar.get(Calendar.MILLISECOND) != 0) {
throw new DataException("Kafka Connect Date type should not
have any time fields set to non-zero values.");
}
//Calculate timezone difference as reviseMillis
long reviseMillis = calendar.get(Calendar.ZONE_OFFSET) +
calendar.get(Calendar.DST_OFFSET) / 60;
//revising with reviseMillis
long unixMillis = calendar.getTimeInMillis() + reviseMillis;
return (int) (unixMillis / MILLIS_PER_DAY);
}
public static java.util.Date toLogical(Schema schema, int value) {
if (schema.name() == null || !(schema.name().equals(LOGICAL_NAME)))
throw new DataException("Requested conversion of Date object
but the schema does not match.");
//Calculate timezone difference as reviseMillis
Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
long reviseMillis = calendar.get(Calendar.ZONE_OFFSET) +
calendar.get(Calendar.DST_OFFSET) / 60;
//revising with reviseMillis
return new java.util.Date(value * MILLIS_PER_DAY - reviseMillis);
}
```
But I wonder, is there some reason to force this work?
to check not to have any time fields set to non-zero values?
What do you think guys?