Repository: beam Updated Branches: refs/heads/master 893bf428a -> f75dfe711
Properly convert milliseconds whether there's less than 3/more than 9 digits. TimeUtil did not properly convert (and returned null) when the number of digits for fractions of seconds was less than 3 digits or more than 9 digits. The solution is to pad with zeros when there is less than 3 digits and to truncate when there is more than 3. Project: http://git-wip-us.apache.org/repos/asf/beam/repo Commit: http://git-wip-us.apache.org/repos/asf/beam/commit/7b8cd640 Tree: http://git-wip-us.apache.org/repos/asf/beam/tree/7b8cd640 Diff: http://git-wip-us.apache.org/repos/asf/beam/diff/7b8cd640 Branch: refs/heads/master Commit: 7b8cd6401cb5ed6e184ed36571a89d3ae324dd5f Parents: 893bf42 Author: Jeremie Lenfant-Engelmann <jeremi...@google.com> Authored: Wed Jun 28 18:32:56 2017 -0700 Committer: Luke Cwik <lc...@google.com> Committed: Fri Jun 30 08:59:19 2017 -0700 ---------------------------------------------------------------------- .../beam/runners/dataflow/util/TimeUtil.java | 24 ++++++++------------ .../runners/dataflow/util/TimeUtilTest.java | 6 +++++ 2 files changed, 15 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/beam/blob/7b8cd640/runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/util/TimeUtil.java ---------------------------------------------------------------------- diff --git a/runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/util/TimeUtil.java b/runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/util/TimeUtil.java index bff379f..172dc6e 100644 --- a/runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/util/TimeUtil.java +++ b/runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/util/TimeUtil.java @@ -17,6 +17,7 @@ */ package org.apache.beam.runners.dataflow.util; +import com.google.common.base.Strings; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nullable; @@ -98,26 +99,19 @@ public final class TimeUtil { int hour = Integer.valueOf(matcher.group(4)); int minute = Integer.valueOf(matcher.group(5)); int second = Integer.valueOf(matcher.group(6)); - int millis = 0; - - String frac = matcher.group(7); - if (frac != null) { - int fracs = Integer.valueOf(frac); - if (frac.length() == 3) { // millisecond resolution - millis = fracs; - } else if (frac.length() == 6) { // microsecond resolution - millis = fracs / 1000; - } else if (frac.length() == 9) { // nanosecond resolution - millis = fracs / 1000000; - } else { - return null; - } - } + int millis = computeMillis(matcher.group(7)); return new DateTime(year, month, day, hour, minute, second, millis, ISOChronology.getInstanceUTC()).toInstant(); } + private static int computeMillis(String frac) { + if (frac == null) { + return 0; + } + return Integer.valueOf(frac.length() > 3 ? frac.substring(0, 3) : Strings.padEnd(frac, 3, '0')); + } + /** * Converts a {@link ReadableDuration} into a Dataflow API duration string. */ http://git-wip-us.apache.org/repos/asf/beam/blob/7b8cd640/runners/google-cloud-dataflow-java/src/test/java/org/apache/beam/runners/dataflow/util/TimeUtilTest.java ---------------------------------------------------------------------- diff --git a/runners/google-cloud-dataflow-java/src/test/java/org/apache/beam/runners/dataflow/util/TimeUtilTest.java b/runners/google-cloud-dataflow-java/src/test/java/org/apache/beam/runners/dataflow/util/TimeUtilTest.java index e0785d4..1ac9fab 100644 --- a/runners/google-cloud-dataflow-java/src/test/java/org/apache/beam/runners/dataflow/util/TimeUtilTest.java +++ b/runners/google-cloud-dataflow-java/src/test/java/org/apache/beam/runners/dataflow/util/TimeUtilTest.java @@ -47,8 +47,14 @@ public final class TimeUtilTest { assertEquals(new Instant(1), fromCloudTime("1970-01-01T00:00:00.001001Z")); assertEquals(new Instant(1), fromCloudTime("1970-01-01T00:00:00.001000000Z")); assertEquals(new Instant(1), fromCloudTime("1970-01-01T00:00:00.001000001Z")); + assertEquals(new Instant(0), fromCloudTime("1970-01-01T00:00:00.0Z")); + assertEquals(new Instant(0), fromCloudTime("1970-01-01T00:00:00.00Z")); + assertEquals(new Instant(420), fromCloudTime("1970-01-01T00:00:00.42Z")); + assertEquals(new Instant(300), fromCloudTime("1970-01-01T00:00:00.3Z")); + assertEquals(new Instant(20), fromCloudTime("1970-01-01T00:00:00.02Z")); assertNull(fromCloudTime("")); assertNull(fromCloudTime("1970-01-01T00:00:00")); + assertNull(fromCloudTime("1970-01-01T00:00:00.1e3Z")); } @Test