Treat timestamps without timezone as UTC (elastic/elasticsearch#753)
Original commit: elastic/x-pack-elasticsearch@33ab2fb781
This commit is contained in:
parent
36bdcaff5d
commit
0b084ea0e6
|
@ -19,6 +19,7 @@ import org.elasticsearch.xpack.ml.utils.ExceptionsHelper;
|
|||
import org.elasticsearch.xpack.ml.utils.time.DateTimeFormatterTimestampConverter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.ZoneOffset;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
|
@ -331,7 +332,7 @@ public class DataDescription extends ToXContentToBytes implements Writeable {
|
|||
break;
|
||||
default:
|
||||
try {
|
||||
DateTimeFormatterTimestampConverter.ofPattern(format);
|
||||
DateTimeFormatterTimestampConverter.ofPattern(format, ZoneOffset.UTC);
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IllegalArgumentException(Messages.getMessage(Messages.JOB_CONFIG_INVALID_TIMEFORMAT, format));
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ public class DateFormatTransform extends DateTransform {
|
|||
super(readIndexes, writeIndexes, logger);
|
||||
|
||||
this.timeFormat = timeFormat;
|
||||
dateToEpochConverter = DateTimeFormatterTimestampConverter.ofPattern(timeFormat, ZoneOffset.systemDefault());
|
||||
dateToEpochConverter = DateTimeFormatterTimestampConverter.ofPattern(timeFormat, ZoneOffset.UTC);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -36,19 +36,6 @@ public class DateTimeFormatterTimestampConverter implements TimestampConverter {
|
|||
defaultZoneId = defaultTimezone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a formatter according to the given pattern. The system's default timezone
|
||||
* is used for dates without timezone information.
|
||||
* @param pattern the pattern to be used by the formatter, not null.
|
||||
* See {@link DateTimeFormatter} for the syntax of the accepted patterns
|
||||
* @return a {@code TimestampConverter}
|
||||
* @throws IllegalArgumentException if the pattern is invalid or cannot produce a full timestamp
|
||||
* (e.g. contains a date but not a time)
|
||||
*/
|
||||
public static TimestampConverter ofPattern(String pattern) {
|
||||
return ofPattern(pattern, ZoneOffset.systemDefault());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a formatter according to the given pattern
|
||||
* @param pattern the pattern to be used by the formatter, not null.
|
||||
|
|
|
@ -18,45 +18,45 @@ import java.time.format.DateTimeParseException;
|
|||
public class DateTimeFormatterTimestampConverterTests extends ESTestCase {
|
||||
public void testOfPattern_GivenPatternIsOnlyYear() {
|
||||
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class, () -> DateTimeFormatterTimestampConverter.ofPattern("y"));
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class, () -> DateTimeFormatterTimestampConverter.ofPattern("y", ZoneOffset.UTC));
|
||||
}
|
||||
|
||||
public void testOfPattern_GivenPatternIsOnlyDate() {
|
||||
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class, () -> DateTimeFormatterTimestampConverter.ofPattern("y-M-d"));
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class,
|
||||
() -> DateTimeFormatterTimestampConverter.ofPattern("y-M-d", ZoneOffset.UTC));
|
||||
}
|
||||
|
||||
public void testOfPattern_GivenPatternIsOnlyTime() {
|
||||
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class, () -> DateTimeFormatterTimestampConverter.ofPattern("HH:mm:ss"));
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class,
|
||||
() -> DateTimeFormatterTimestampConverter.ofPattern("HH:mm:ss", ZoneOffset.UTC));
|
||||
}
|
||||
|
||||
public void testOfPattern_GivenPatternIsUsingYearInsteadOfYearOfEra() {
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class, () -> DateTimeFormatterTimestampConverter.ofPattern("uuuu-MM-dd HH:mm:ss"));
|
||||
ESTestCase.expectThrows(IllegalArgumentException.class,
|
||||
() -> DateTimeFormatterTimestampConverter.ofPattern("uuuu-MM-dd HH:mm:ss", ZoneOffset.UTC));
|
||||
}
|
||||
|
||||
public void testToEpochSeconds_GivenValidTimestampDoesNotFollowPattern() {
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern("yyyy-MM-dd HH:mm:ss", ZoneOffset.UTC);
|
||||
ESTestCase.expectThrows(DateTimeParseException.class, () -> formatter.toEpochSeconds("14:00:22"));
|
||||
}
|
||||
|
||||
public void testToEpochMillis_GivenValidTimestampDoesNotFollowPattern() {
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS", ZoneOffset.UTC);
|
||||
ESTestCase.expectThrows(DateTimeParseException.class, () -> formatter.toEpochMillis("2015-01-01 14:00:22"));
|
||||
}
|
||||
|
||||
public void testToEpochSeconds_GivenPatternHasFullDateAndOnlyHours() {
|
||||
long expected = ZonedDateTime.of(2014, 3, 22, 1, 0, 0, 0, ZoneOffset.systemDefault()).toEpochSecond();
|
||||
long expected = ZonedDateTime.of(2014, 3, 22, 1, 0, 0, 0, ZoneOffset.UTC).toEpochSecond();
|
||||
assertEquals(expected, toEpochSeconds("2014-03-22 01", "y-M-d HH"));
|
||||
}
|
||||
|
||||
public void testToEpochSeconds_GivenPatternHasFullDateAndTimeWithoutTimeZone() {
|
||||
long expected = ZonedDateTime.of(1985, 8, 18, 20, 15, 40, 0, ZoneOffset.systemDefault()).toEpochSecond();
|
||||
long expected = ZonedDateTime.of(1985, 8, 18, 20, 15, 40, 0, ZoneOffset.UTC).toEpochSecond();
|
||||
assertEquals(expected, toEpochSeconds("1985-08-18 20:15:40", "yyyy-MM-dd HH:mm:ss"));
|
||||
|
||||
expected = ZonedDateTime.of(1985, 8, 18, 20, 15, 40, 0, ZoneOffset.UTC).toEpochSecond();
|
||||
assertEquals(expected, toEpochSeconds("1985-08-18 20:15:40", "yyyy-MM-dd HH:mm:ss", ZoneOffset.UTC));
|
||||
|
||||
expected = ZonedDateTime.of(1985, 8, 18, 20, 15, 40, 0, ZoneOffset.MIN).toEpochSecond();
|
||||
assertEquals(expected, toEpochSeconds("1985-08-18 20:15:40", "yyyy-MM-dd HH:mm:ss", ZoneOffset.MIN));
|
||||
|
||||
|
@ -74,13 +74,11 @@ public class DateTimeFormatterTimestampConverterTests extends ESTestCase {
|
|||
|
||||
public void testToEpochSeconds_GivenPatternHasDateWithoutYearAndTimeWithoutTimeZone() throws ParseException {
|
||||
// Summertime
|
||||
long expected = ZonedDateTime.of(LocalDate.now(ZoneId.systemDefault()).getYear(), 8, 14, 1, 30, 20, 0,
|
||||
ZoneOffset.systemDefault()).toEpochSecond();
|
||||
long expected = ZonedDateTime.of(LocalDate.now(ZoneOffset.UTC).getYear(), 8, 14, 1, 30, 20, 0, ZoneOffset.UTC).toEpochSecond();
|
||||
assertEquals(expected, toEpochSeconds("08 14 01:30:20", "MM dd HH:mm:ss"));
|
||||
|
||||
// Non-summertime
|
||||
expected = ZonedDateTime.of(LocalDate.now(ZoneId.systemDefault()).getYear(), 12, 14, 1, 30, 20, 0,
|
||||
ZoneOffset.systemDefault()).toEpochSecond();
|
||||
expected = ZonedDateTime.of(LocalDate.now(ZoneOffset.UTC).getYear(), 12, 14, 1, 30, 20, 0, ZoneOffset.UTC).toEpochSecond();
|
||||
assertEquals(expected, toEpochSeconds("12 14 01:30:20", "MM dd HH:mm:ss"));
|
||||
}
|
||||
|
||||
|
@ -90,7 +88,7 @@ public class DateTimeFormatterTimestampConverterTests extends ESTestCase {
|
|||
}
|
||||
|
||||
private static long toEpochSeconds(String timestamp, String pattern) {
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern(pattern);
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern(pattern, ZoneOffset.UTC);
|
||||
return formatter.toEpochSeconds(timestamp);
|
||||
}
|
||||
|
||||
|
@ -100,7 +98,7 @@ public class DateTimeFormatterTimestampConverterTests extends ESTestCase {
|
|||
}
|
||||
|
||||
private static long toEpochMillis(String timestamp, String pattern) {
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern(pattern);
|
||||
TimestampConverter formatter = DateTimeFormatterTimestampConverter.ofPattern(pattern, ZoneOffset.UTC);
|
||||
return formatter.toEpochMillis(timestamp);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue