// we already retrieve the unit here once as it is a very costly operation
String itemName = item.getName();
Unit<? extends Quantity<?>> unit = item instanceof NumberItem ? ((NumberItem) item).getUnit() : null;
- return m.stream().map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsDate(o[0])))
+ return m.stream()
+ .map(o -> new JdbcHistoricItem(itemName, objectAsState(item, unit, o[1]), objectAsZonedDateTime(o[0])))
.collect(Collectors.<HistoricItem> toList());
}
}
return unit == null ? DecimalType.valueOf(objectAsString(v)) : QuantityType.valueOf(objectAsString(v));
} else if (item instanceof DateTimeItem) {
- return new DateTimeType(
- ZonedDateTime.ofInstant(Instant.ofEpochMilli(objectAsLong(v)), ZoneId.systemDefault()));
+ return new DateTimeType(objectAsZonedDateTime(v));
} else if (item instanceof ColorItem) {
return HSBType.valueOf(objectAsString(v));
} else if (item instanceof DimmerItem || item instanceof RollershutterItem) {
}
}
- protected ZonedDateTime objectAsDate(Object v) {
- if (v instanceof LocalDateTime) {
- return ZonedDateTime.of((LocalDateTime) v, ZoneId.systemDefault());
- } else if (v instanceof java.sql.Timestamp) {
- return ZonedDateTime.ofInstant(((java.sql.Timestamp) v).toInstant(), ZoneId.systemDefault());
- } else if (v instanceof Instant) {
- return ZonedDateTime.ofInstant((Instant) v, ZoneId.systemDefault());
- } else if (v instanceof java.lang.String) {
- return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(v.toString()).toInstant(),
- ZoneId.systemDefault());
- }
- throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
- }
-
- protected Long objectAsLong(Object v) {
+ protected ZonedDateTime objectAsZonedDateTime(Object v) {
if (v instanceof Long) {
- return ((Number) v).longValue();
+ return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((Number) v).longValue()), ZoneId.systemDefault());
} else if (v instanceof java.sql.Date) {
- return ((java.sql.Date) v).getTime();
+ return ZonedDateTime.ofInstant(Instant.ofEpochMilli(((java.sql.Date) v).getTime()), ZoneId.systemDefault());
} else if (v instanceof LocalDateTime) {
- return ((LocalDateTime) v).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+ return ((LocalDateTime) v).atZone(ZoneId.systemDefault());
} else if (v instanceof Instant) {
- return ((Instant) v).toEpochMilli();
+ return ((Instant) v).atZone(ZoneId.systemDefault());
} else if (v instanceof java.sql.Timestamp) {
- return ((java.sql.Timestamp) v).getTime();
+ return ((java.sql.Timestamp) v).toInstant().atZone(ZoneId.systemDefault());
+ } else if (v instanceof java.lang.String) {
+ return ZonedDateTime.ofInstant(java.sql.Timestamp.valueOf(v.toString()).toInstant(),
+ ZoneId.systemDefault());
}
throw new UnsupportedOperationException("Date of type " + v.getClass().getName() + " is not supported");
}
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
assertInstanceOf(QuantityType.class, quantityType);
assertEquals(QuantityType.valueOf("7.3 °C"), quantityType);
- State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
- java.sql.Timestamp.valueOf("2021-02-01 23:30:02.049"));
- assertInstanceOf(DateTimeType.class, dateTimeType);
- assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
-
- dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
- LocalDateTime.parse("2021-02-01T23:30:02.049"));
- assertInstanceOf(DateTimeType.class, dateTimeType);
- assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
-
State hsbType = jdbcBaseDAO.objectAsState(new ColorItem("testColorItem"), null, "184,100,52");
assertInstanceOf(HSBType.class, hsbType);
assertEquals(HSBType.valueOf("184,100,52"), hsbType);
assertEquals(StringType.valueOf("String"), stringType);
}
+ @Test
+ public void objectAsStateReturnsValiDateTimeTypeForTimestamp() {
+ State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+ java.sql.Timestamp.valueOf("2021-02-01 23:30:02.049"));
+ assertInstanceOf(DateTimeType.class, dateTimeType);
+ assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
+ }
+
+ @Test
+ public void objectAsStateReturnsValidDateTimeTypeForLocalDateTime() {
+ State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+ LocalDateTime.parse("2021-02-01T23:30:02.049"));
+ assertInstanceOf(DateTimeType.class, dateTimeType);
+ assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
+ }
+
+ @Test
+ public void objectAsStateReturnsValidDateTimeTypeForLong() {
+ State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+ Long.valueOf("1612222202049"));
+ assertInstanceOf(DateTimeType.class, dateTimeType);
+ assertEquals(
+ new DateTimeType(
+ ZonedDateTime.ofInstant(Instant.parse("2021-02-01T23:30:02.049Z"), ZoneId.systemDefault())),
+ dateTimeType);
+ }
+
+ @Test
+ public void objectAsStateReturnsValidDateTimeTypeForSqlDate() {
+ State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+ java.sql.Date.valueOf("2021-02-01"));
+ assertInstanceOf(DateTimeType.class, dateTimeType);
+ assertEquals(DateTimeType.valueOf("2021-02-01T00:00:00.000"), dateTimeType);
+ }
+
+ @Test
+ public void objectAsStateReturnsValidDateTimeTypeForInstant() {
+ State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+ Instant.parse("2021-02-01T23:30:02.049Z"));
+ assertInstanceOf(DateTimeType.class, dateTimeType);
+ assertEquals(
+ new DateTimeType(
+ ZonedDateTime.ofInstant(Instant.parse("2021-02-01T23:30:02.049Z"), ZoneId.systemDefault())),
+ dateTimeType);
+ }
+
+ @Test
+ public void objectAsStateReturnsValidDateTimeTypeForString() {
+ State dateTimeType = jdbcBaseDAO.objectAsState(new DateTimeItem("testDateTimeItem"), null,
+ "2021-02-01 23:30:02.049");
+ assertInstanceOf(DateTimeType.class, dateTimeType);
+ assertEquals(DateTimeType.valueOf("2021-02-01T23:30:02.049"), dateTimeType);
+ }
+
@Test
public void testHistItemFilterQueryProviderReturnsSelectQueryWithoutWhereClauseDescendingOrder() {
String sql = jdbcBaseDAO.histItemFilterQueryProvider(filter, 0, DB_TABLE_NAME, "TEST", UTC_ZONE_ID);