You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ma...@apache.org on 2021/08/31 14:42:12 UTC

[nifi] branch main updated: NIFI-8749 Removed implicit time zone conversion to GMT

This is an automated email from the ASF dual-hosted git repository.

mattyb149 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 758e185  NIFI-8749 Removed implicit time zone conversion to GMT
758e185 is described below

commit 758e1850ed0e4af5063877c7e3a56628e5e7ed78
Author: exceptionfactory <ex...@apache.org>
AuthorDate: Wed Aug 11 13:48:13 2021 -0500

    NIFI-8749 Removed implicit time zone conversion to GMT
    
    - Updated DataTypeUtils.getDateFormat() to use system default time zone
    - Updated Record Path Guide to match Expression Language Guide regarding default time zone
    - Updated impacted unit tests to expect localized dates instead of dates converted to GMT
    
    Signed-off-by: Matthew Burgess <ma...@apache.org>
    
    This closes #5305
---
 .../apache/nifi/record/path/TestRecordPath.java    |  76 +++++++-----
 .../serialization/record/util/DataTypeUtils.java   |   8 +-
 nifi-docs/src/main/asciidoc/record-path-guide.adoc |   3 +-
 .../apache/nifi/processors/aws/s3/TestListS3.java  |   9 +-
 .../TestPutElasticsearchHttpRecord.java            | 138 +++++++++------------
 .../nifi/processors/standard/TestQueryRecord.java  |  61 +++++----
 .../avro/TestAvroReaderWithEmbeddedSchema.java     |   4 +-
 .../org/apache/nifi/csv/TestCSVRecordReader.java   |   3 -
 .../org/apache/nifi/csv/TestWriteCSVResult.java    |   2 -
 .../org/apache/nifi/json/TestWriteJsonResult.java  |   2 -
 .../org/apache/nifi/xml/TestWriteXMLResult.java    |   2 -
 11 files changed, 149 insertions(+), 159 deletions(-)

diff --git a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
index 0c89b2e..c893177 100644
--- a/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
+++ b/nifi-commons/nifi-record-path/src/test/java/org/apache/nifi/record/path/TestRecordPath.java
@@ -35,6 +35,10 @@ import java.nio.charset.StandardCharsets;
 import java.sql.Date;
 import java.text.DateFormat;
 import java.text.ParseException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
@@ -1417,7 +1421,7 @@ public class TestRecordPath {
     }
 
     @Test
-    public void testFormatDateFromString() throws ParseException {
+    public void testFormatDateFromString() {
         final List<RecordField> fields = new ArrayList<>();
         fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
         fields.add(new RecordField("date", RecordFieldType.DATE.getDataType()));
@@ -1426,70 +1430,84 @@ public class TestRecordPath {
 
         final Map<String, Object> values = new HashMap<>();
         values.put("id", 48);
-        values.put("date", "2017-10-20T11:00:00Z");
+
+        final String localDateFormatted = "2017-10-20";
+        final String localDateTimeFormatted = String.format("%sT12:45:30", localDateFormatted);
+        final LocalDateTime localDateTime = LocalDateTime.parse(localDateTimeFormatted);
+        final int offsetHours = 6;
+        final String timeZone = String.format("GMT+%d:00", offsetHours);
+
+        values.put("date", localDateTimeFormatted);
         final Record record = new MapRecord(schema, values);
 
-        final FieldValue fieldValue = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"), 'yyyy-MM-dd' )").evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals("2017-10-20", fieldValue.getValue());
-        final FieldValue fieldValue2 = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"), 'yyyy-MM-dd' , 'GMT+8:00')")
+        final FieldValue fieldValue = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss\"), 'yyyy-MM-dd' )").evaluate(record).getSelectedFields().findFirst().get();
+        assertEquals(localDateFormatted, fieldValue.getValue());
+        final FieldValue fieldValue2 = RecordPath.compile(String.format("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss\"), 'yyyy-MM-dd' , '%s')", timeZone))
             .evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals("2017-10-20", fieldValue2.getValue());
+        assertEquals(localDateFormatted, fieldValue2.getValue());
 
-        final FieldValue fieldValue3 = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"), 'yyyy-MM-dd HH:mm', 'GMT+8:00')")
+        final FieldValue fieldValue3 = RecordPath.compile(String.format("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss\"), \"yyyy-MM-dd'T'HH:mm:ss\", '%s')", timeZone))
             .evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals("2017-10-20 19:00", fieldValue3.getValue());
 
-        final FieldValue fieldValueUnchanged = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"), 'INVALID' )").evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals(DataTypeUtils.getDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse("2017-10-20T11:00:00Z"), fieldValueUnchanged.getValue());
-        final FieldValue fieldValueUnchanged2 = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\"), 'INVALID' , 'INVALID')")
+        final ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneOffset.systemDefault());
+        final ZonedDateTime adjustedZoneDateTime = zonedDateTime.withZoneSameInstant(ZoneOffset.ofHours(offsetHours));
+        final LocalDateTime adjustedLocalDateTime = adjustedZoneDateTime.toLocalDateTime();
+        final String adjustedDateTime = adjustedLocalDateTime.toString();
+        assertEquals(adjustedDateTime, fieldValue3.getValue());
+
+        final FieldValue fieldValueUnchanged = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss\"), 'INVALID' )").evaluate(record).getSelectedFields().findFirst().get();
+        assertEquals(localDateFormatted, fieldValueUnchanged.getValue().toString());
+        final FieldValue fieldValueUnchanged2 = RecordPath.compile("format( toDate(/date, \"yyyy-MM-dd'T'HH:mm:ss\"), 'INVALID' , 'INVALID')")
             .evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals(DataTypeUtils.getDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse("2017-10-20T11:00:00Z"), fieldValueUnchanged2.getValue());
+        assertEquals(localDateFormatted, fieldValueUnchanged2.getValue().toString());
     }
 
     @Test
-    public void testFormatDateFromLong() throws ParseException {
+    public void testFormatDateFromLong() {
         final List<RecordField> fields = new ArrayList<>();
         fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
         fields.add(new RecordField("date", RecordFieldType.LONG.getDataType()));
 
         final RecordSchema schema = new SimpleRecordSchema(fields);
 
-        final DateFormat dateFormat = DataTypeUtils.getDateFormat("yyyy-MM-dd");
-        final long dateValue = dateFormat.parse("2017-10-20").getTime();
+        final String localDate = "2017-10-20";
+        final String instantFormatted = String.format("%sT12:30:45Z", localDate);
+        final long epochMillis = Instant.parse(instantFormatted).toEpochMilli();
 
         final Map<String, Object> values = new HashMap<>();
         values.put("id", 48);
-        values.put("date", dateValue);
+        values.put("date", epochMillis);
         final Record record = new MapRecord(schema, values);
 
-        assertEquals("2017-10-20", RecordPath.compile("format(/date, 'yyyy-MM-dd' )").evaluate(record).getSelectedFields().findFirst().get().getValue());
-        assertEquals("2017-10-20 08:00:00", RecordPath.compile("format(/date, 'yyyy-MM-dd HH:mm:ss', 'GMT+8:00' )").evaluate(record).getSelectedFields().findFirst().get().getValue());
+        assertEquals(localDate, RecordPath.compile("format(/date, 'yyyy-MM-dd' )").evaluate(record).getSelectedFields().findFirst().get().getValue());
+        assertEquals(instantFormatted, RecordPath.compile("format(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\", 'GMT')").evaluate(record).getSelectedFields().findFirst().get().getValue());
 
         final FieldValue fieldValueUnchanged = RecordPath.compile("format(/date, 'INVALID' )").evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals(dateValue, fieldValueUnchanged.getValue());
+        assertEquals(epochMillis, fieldValueUnchanged.getValue());
         final FieldValue fieldValueUnchanged2 = RecordPath.compile("format(/date, 'INVALID', 'INVALID' )").evaluate(record).getSelectedFields().findFirst().get();
-        assertEquals(dateValue, fieldValueUnchanged2.getValue());
+        assertEquals(epochMillis, fieldValueUnchanged2.getValue());
     }
 
     @Test
-    public void testFormatDateFromDate() throws ParseException {
+    public void testFormatDateFromDate() {
         final List<RecordField> fields = new ArrayList<>();
         fields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
         fields.add(new RecordField("date", RecordFieldType.DATE.getDataType()));
 
         final RecordSchema schema = new SimpleRecordSchema(fields);
 
-        final DateFormat dateFormat = DataTypeUtils.getDateFormat("yyyy-MM-dd");
-        final java.util.Date utilDate = dateFormat.parse("2017-10-20");
-        final Date dateValue = new Date(utilDate.getTime());
+        final String localDate = "2017-10-20";
+        final String instantFormatted = String.format("%sT12:30:45Z", localDate);
+        final Instant instant = Instant.parse(instantFormatted);
+        final Date dateValue = new Date(instant.toEpochMilli());
 
         final Map<String, Object> values = new HashMap<>();
         values.put("id", 48);
         values.put("date", dateValue);
         final Record record = new MapRecord(schema, values);
 
-        assertEquals("2017-10-20", RecordPath.compile("format(/date, 'yyyy-MM-dd')").evaluate(record).getSelectedFields().findFirst().get().getValue());
-        assertEquals("2017-10-20 08:00:00", RecordPath.compile("format(/date, 'yyyy-MM-dd HH:mm:ss', 'GMT+8:00')").evaluate(record).getSelectedFields().findFirst().get().getValue());
+        assertEquals(localDate, RecordPath.compile("format(/date, 'yyyy-MM-dd')").evaluate(record).getSelectedFields().findFirst().get().getValue());
+        assertEquals(instantFormatted, RecordPath.compile("format(/date, \"yyyy-MM-dd'T'HH:mm:ss'Z'\", 'GMT')").evaluate(record).getSelectedFields().findFirst().get().getValue());
 
         final FieldValue fieldValueUnchanged = RecordPath.compile("format(/date, 'INVALID')").evaluate(record).getSelectedFields().findFirst().get();
         assertEquals(dateValue, fieldValueUnchanged.getValue());
@@ -1922,8 +1940,7 @@ public class TestRecordPath {
         accountFields.add(new RecordField("id", RecordFieldType.INT.getDataType()));
         accountFields.add(new RecordField("balance", RecordFieldType.DOUBLE.getDataType()));
 
-        final RecordSchema accountSchema = new SimpleRecordSchema(accountFields);
-        return accountSchema;
+        return new SimpleRecordSchema(accountFields);
     }
 
     private Record createSimpleRecord() {
@@ -1937,8 +1954,7 @@ public class TestRecordPath {
         final Map<String, Object> values = new HashMap<>();
         values.put("id", 48);
         values.put("name", "John Doe");
-        final Record record = new MapRecord(schema, values);
-        return record;
+        return new MapRecord(schema, values);
     }
 
 }
diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
index 3331d81..5a8649e 100644
--- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
+++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java
@@ -112,8 +112,6 @@ public class DataTypeUtils {
     private static final Pattern FLOATING_POINT_PATTERN = Pattern.compile(doubleRegex);
     private static final Pattern DECIMAL_PATTERN = Pattern.compile(decimalRegex);
 
-    private static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone("GMT");
-
     private static final Supplier<DateFormat> DEFAULT_DATE_FORMAT = () -> getDateFormat(RecordFieldType.DATE.getDefaultFormat());
     private static final Supplier<DateFormat> DEFAULT_TIME_FORMAT = () -> getDateFormat(RecordFieldType.TIME.getDefaultFormat());
     private static final Supplier<DateFormat> DEFAULT_TIMESTAMP_FORMAT = () -> getDateFormat(RecordFieldType.TIMESTAMP.getDefaultFormat());
@@ -1329,9 +1327,7 @@ public class DataTypeUtils {
     }
 
     /**
-     * Get Date Format using GMT Time Zone
-     *
-     * This Date Format can produce unexpected results when the system default Time Zone is not GMT
+     * Get Date Format using default Local Time Zone
      *
      * @param pattern Date Format Pattern used for new SimpleDateFormat()
      * @return Date Format or null when pattern not provided
@@ -1340,7 +1336,7 @@ public class DataTypeUtils {
         if (pattern == null) {
             return null;
         }
-        return getDateFormat(pattern, GMT_TIME_ZONE);
+        return getDateFormat(pattern, TimeZone.getDefault());
     }
 
     /**
diff --git a/nifi-docs/src/main/asciidoc/record-path-guide.adoc b/nifi-docs/src/main/asciidoc/record-path-guide.adoc
index 5caa1ac..b59f78a 100644
--- a/nifi-docs/src/main/asciidoc/record-path-guide.adoc
+++ b/nifi-docs/src/main/asciidoc/record-path-guide.adoc
@@ -636,7 +636,8 @@ not the first value that is encountered in the Record itself.
 
 === format
 
-Converts a Date to a String in the given format with the given time zone(optional, default time zone is GMT).
+Converts a Date to a String in the given format with an optional time zone. The function defaults to the system local
+time zone when the second argument is not provided.
 
 The first argument to this function must be a Date or a Number, and the second argument must be a format String that
 follows the Java SimpleDateFormat, and the third argument, optional, must be a format String that
diff --git a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/s3/TestListS3.java b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/s3/TestListS3.java
index cab9e32..a05c9e3 100644
--- a/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/s3/TestListS3.java
+++ b/nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/test/java/org/apache/nifi/processors/aws/s3/TestListS3.java
@@ -48,7 +48,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -58,16 +57,13 @@ import static org.junit.Assert.assertTrue;
 public class TestListS3 {
 
     private TestRunner runner = null;
-    private ListS3 mockListS3 = null;
-    private AmazonS3Client actualS3Client = null;
     private AmazonS3Client mockS3Client = null;
 
     @Before
     public void setUp() {
         mockS3Client = Mockito.mock(AmazonS3Client.class);
-        mockListS3 = new ListS3() {
+        final ListS3 mockListS3 = new ListS3() {
             protected AmazonS3Client getClient() {
-                actualS3Client = client;
                 return mockS3Client;
             }
         };
@@ -161,7 +157,6 @@ public class TestListS3 {
         runner.assertAllFlowFilesTransferred(ListS3.REL_SUCCESS, 1);
 
         final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
         final String lastModifiedString = dateFormat.format(lastModified);
 
         final MockFlowFile flowFile = runner.getFlowFilesForRelationship(ListS3.REL_SUCCESS).get(0);
@@ -370,7 +365,7 @@ public class TestListS3 {
         runner.setProperty(ListS3.BUCKET, "test-bucket");
 
         Calendar calendar = Calendar.getInstance();
-        calendar.set(2017, 5, 2);
+        calendar.set(2017, Calendar.JUNE, 2);
         Date objectLastModified = calendar.getTime();
         long stateCurrentTimestamp = objectLastModified.getTime();
 
diff --git a/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestPutElasticsearchHttpRecord.java b/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestPutElasticsearchHttpRecord.java
index c5a621b..659de9a 100644
--- a/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestPutElasticsearchHttpRecord.java
+++ b/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestPutElasticsearchHttpRecord.java
@@ -52,6 +52,7 @@ import java.sql.Timestamp;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -65,6 +66,17 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public class TestPutElasticsearchHttpRecord {
+    private static final int DATE_YEAR = 2018;
+    private static final int DATE_MONTH = 12;
+    private static final int DATE_DAY = 20;
+    private static final int TIME_HOUR = 12;
+    private static final int TIME_MINUTE = 55;
+
+    private static final String ISO_DATE = String.format("%d-%d-%d", DATE_YEAR, DATE_MONTH, DATE_DAY);
+    private static final String EXPECTED_DATE = String.format("%d/%d/%d", DATE_DAY, DATE_MONTH, DATE_YEAR);
+    private static final LocalDateTime LOCAL_DATE_TIME = LocalDateTime.of(DATE_YEAR, DATE_MONTH, DATE_DAY, TIME_HOUR, TIME_MINUTE);
+    private static final LocalTime LOCAL_TIME = LocalTime.of(TIME_HOUR, TIME_MINUTE);
+
     private TestRunner runner;
 
     @After
@@ -76,35 +88,35 @@ public class TestPutElasticsearchHttpRecord {
     public void testPutElasticSearchOnTriggerIndex() throws IOException {
         PutElasticsearchHttpRecordTestProcessor processor = new PutElasticsearchHttpRecordTestProcessor(false);
         DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
-        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("d/M/YYYY h:m a");
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("d/M/yyyy h:m a");
         processor.setRecordChecks(record -> {
             assertEquals(1, record.get("id"));
             assertEquals("reç1", record.get("name"));
             assertEquals(101, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         }, record -> {
             assertEquals(2, record.get("id"));
             assertEquals("reç2", record.get("name"));
             assertEquals(102, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         }, record -> {
             assertEquals(3, record.get("id"));
             assertEquals("reç3", record.get("name"));
             assertEquals(103, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         }, record -> {
             assertEquals(4, record.get("id"));
             assertEquals("reç4", record.get("name"));
             assertEquals(104, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         });
         runner = TestRunners.newTestRunner(processor); // no failures
         generateTestData();
@@ -117,9 +129,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TIME_FORMAT, "h:m a");
         runner.setProperty(PutElasticsearchHttpRecord.TIMESTAMP_FORMAT, "d/M/yyyy h:m a");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -143,9 +153,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TYPE, "status");
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "create");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -163,35 +171,35 @@ public class TestPutElasticsearchHttpRecord {
     public void testPutElasticSearchOnTriggerIndex_withoutType() throws IOException {
         PutElasticsearchHttpRecordTestProcessor processor = new PutElasticsearchHttpRecordTestProcessor(false);
         DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
-        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("d/M/YYYY h:m a");
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("d/M/yyyy h:m a");
         processor.setRecordChecks(record -> {
             assertEquals(1, record.get("id"));
             assertEquals("reç1", record.get("name"));
             assertEquals(101, record.get("code"));
             assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         }, record -> {
             assertEquals(2, record.get("id"));
             assertEquals("reç2", record.get("name"));
             assertEquals(102, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         }, record -> {
             assertEquals(3, record.get("id"));
             assertEquals("reç3", record.get("name"));
             assertEquals(103, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         }, record -> {
             assertEquals(4, record.get("id"));
             assertEquals("reç4", record.get("name"));
             assertEquals(104, record.get("code"));
-            assertEquals("20/12/2018", record.get("date"));
-            assertEquals(LocalTime.of(18, 55).format(timeFormatter), record.get("time"));
-            assertEquals(LocalDateTime.of(2018, 12, 20, 18, 55).format(dateTimeFormatter), record.get("ts"));
+            assertEquals(EXPECTED_DATE, record.get("date"));
+            assertEquals(LOCAL_TIME.format(timeFormatter), record.get("time"));
+            assertEquals(LOCAL_DATE_TIME.format(dateTimeFormatter), record.get("ts"));
         });
         runner = TestRunners.newTestRunner(processor); // no failures
         generateTestData();
@@ -204,9 +212,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TIME_FORMAT, "h:m a");
         runner.setProperty(PutElasticsearchHttpRecord.TIMESTAMP_FORMAT, "d/M/yyyy h:m a");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -230,9 +236,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TYPE, "status");
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "Update");
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -251,9 +255,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.removeProperty(PutElasticsearchHttpRecord.TYPE);
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "Update");
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -272,9 +274,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TYPE, "status");
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "DELETE");
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -293,9 +293,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.removeProperty(PutElasticsearchHttpRecord.TYPE);
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "DELETE");
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -319,9 +317,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setVariable("es.url", "http://127.0.0.1:9200");
         runner.setVariable("connect.timeout", "5s");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -340,9 +336,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TYPE, "status");
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "${no.attr}");
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_FAILURE, 1);
@@ -383,17 +377,13 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TYPE, "status");
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_FAILURE, 1);
         runner.clearTransferState();
 
         processor.setStatus(500, "Should retry");
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_RETRY, 1);
     }
@@ -409,9 +399,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.TYPE, "status");
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_FAILURE, 1);
     }
@@ -502,9 +490,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.INDEX_OP, "index_fail");
         runner.assertValid();
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_FAILURE, 1);
@@ -527,9 +513,7 @@ public class TestPutElasticsearchHttpRecord {
         // Set dynamic property, to be added to the URL as a query parameter
         runner.setProperty("pipeline", "my-pipeline");
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "28039652140");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "28039652140"));
         runner.run(1, true, true);
 
         runner.assertAllFlowFilesTransferred(PutElasticsearchHttpRecord.REL_SUCCESS, 1);
@@ -611,12 +595,12 @@ public class TestPutElasticsearchHttpRecord {
      * A Test class that extends the processor in order to inject/mock behavior
      */
     private static class PutElasticsearchHttpRecordTestProcessor extends PutElasticsearchHttpRecord {
-        int numResponseFailures = 0;
+        int numResponseFailures;
         OkHttpClient client;
         int statusCode = 200;
         String statusMessage = "OK";
         String expectedUrl = null;
-        Consumer<Map>[] recordChecks;
+        Consumer<Map<?, ?>>[] recordChecks;
 
         PutElasticsearchHttpRecordTestProcessor(boolean responseHasFailures) {
             this.numResponseFailures = responseHasFailures ? 1 : 0;
@@ -636,7 +620,7 @@ public class TestPutElasticsearchHttpRecord {
         }
 
         @SafeVarargs
-        final void setRecordChecks(Consumer<Map>... checks) {
+        final void setRecordChecks(Consumer<Map<?, ?>>... checks) {
             recordChecks = checks;
         }
 
@@ -687,7 +671,7 @@ public class TestPutElasticsearchHttpRecord {
                             .protocol(Protocol.HTTP_1_1)
                             .code(statusCode)
                             .message(statusMessage)
-                            .body(ResponseBody.create(MediaType.parse("application/json"), sb.toString()))
+                            .body(ResponseBody.create(sb.toString(), MediaType.parse("application/json")))
                             .build();
 
                     when(call.execute()).thenReturn(mockResponse);
@@ -778,7 +762,7 @@ public class TestPutElasticsearchHttpRecord {
     }
 
     @Test(expected = AssertionError.class)
-    public void testPutElasticSearchBadHostInEL() throws IOException {
+    public void testPutElasticSearchBadHostInEL() {
         final TestRunner runner = TestRunners.newTestRunner(new PutElasticsearchHttpRecord());
 
         runner.setProperty(AbstractElasticsearchHttpProcessor.ES_URL, "${es.url}");
@@ -787,9 +771,7 @@ public class TestPutElasticsearchHttpRecord {
         runner.setProperty(PutElasticsearchHttpRecord.ID_RECORD_PATH, "/id");
         runner.assertValid();
 
-        runner.enqueue(new byte[0], new HashMap<String, String>() {{
-            put("doc_id", "1");
-        }});
+        runner.enqueue(new byte[0], Collections.singletonMap("doc_id", "1"));
 
         runner.run();
     }
@@ -817,8 +799,12 @@ public class TestPutElasticsearchHttpRecord {
         parser.addSchemaField("ts", RecordFieldType.TIMESTAMP);
         parser.addSchemaField("amount", RecordFieldType.DECIMAL);
 
+        final Date date = Date.valueOf(ISO_DATE);
+        final Timestamp timestamp = Timestamp.valueOf(LOCAL_DATE_TIME);
+        final Time time = Time.valueOf(LOCAL_TIME);
         for(int i=1; i<=numRecords; i++) {
-            parser.addRecord(i, "reç" + i, 100 + i, Date.valueOf("2018-12-20"), new Time(68150000), new Timestamp(1545332150000L), new BigDecimal(Double.MAX_VALUE).multiply(BigDecimal.TEN));
+
+            parser.addRecord(i, "reç" + i, 100 + i, date, time, timestamp, new BigDecimal(Double.MAX_VALUE).multiply(BigDecimal.TEN));
         }
     }
 
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestQueryRecord.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestQueryRecord.java
index a1b1b23..e37a712 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestQueryRecord.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestQueryRecord.java
@@ -21,7 +21,6 @@ import org.apache.nifi.csv.CSVReader;
 import org.apache.nifi.logging.ComponentLog;
 import org.apache.nifi.reporting.InitializationException;
 import org.apache.nifi.schema.access.SchemaAccessUtils;
-import org.apache.nifi.schema.access.SchemaNotFoundException;
 import org.apache.nifi.schema.inference.SchemaInferenceUtil;
 import org.apache.nifi.serialization.RecordSetWriter;
 import org.apache.nifi.serialization.RecordSetWriterFactory;
@@ -45,7 +44,10 @@ import org.junit.Test;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.math.BigDecimal;
-import java.sql.SQLException;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
 import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -53,7 +55,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static org.junit.Assert.assertArrayEquals;
@@ -70,10 +71,16 @@ public class TestQueryRecord {
 
     private static final String REL_NAME = "success";
 
+    private static final String ISO_DATE = "2018-02-04";
+    private static final String INSTANT_FORMATTED = String.format("%sT10:20:55Z", ISO_DATE);
+    private static final Instant INSTANT = Instant.parse(INSTANT_FORMATTED);
+    private static final Date INSTANT_DATE = Date.from(INSTANT);
+    private static final long INSTANT_EPOCH_MILLIS = INSTANT.toEpochMilli();
+
     public TestRunner getRunner() {
         TestRunner runner = TestRunners.newTestRunner(QueryRecord.class);
 
-        /**
+        /*
          * we have to disable validation of expression language because the scope of the evaluation
          * depends of the value of another property: if we are caching the schema/queries or not. If
          * we don't disable the validation, it'll throw an error saying that the scope is incorrect.
@@ -129,7 +136,11 @@ public class TestQueryRecord {
         assertEquals(30, output.getValue("ageObj"));
         assertArrayEquals(new String[] { "red", "green"}, (Object[]) output.getValue("colors"));
         assertArrayEquals(new String[] { "John Doe", "Jane Doe"}, (Object[]) output.getValue("names"));
-        assertEquals("1517702400000", output.getAsString("joinTime"));
+
+        final LocalDate localDate = LocalDate.parse(ISO_DATE);
+        final ZonedDateTime zonedDateTime = ZonedDateTime.of(localDate.atStartOfDay(), ZoneOffset.systemDefault());
+        final long epochMillis = zonedDateTime.toInstant().toEpochMilli();
+        assertEquals(Long.toString(epochMillis), output.getAsString("joinTime"));
         assertEquals(Double.valueOf(180.8D), output.getAsDouble("weight"));
     }
 
@@ -679,14 +690,14 @@ public class TestQueryRecord {
         favorites.put("roses", "raindrops");
         favorites.put("kittens", "whiskers");
 
-        final long ts = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(365 * 30);
+
         final Map<String, Object> map = new HashMap<>();
         map.put("name", "John Doe");
         map.put("age", 30);
         map.put("favoriteColors", new String[] { "red", "green" });
-        map.put("dob", new Date(ts));
-        map.put("dobTimestamp", ts);
-        map.put("joinTimestamp", "2018-02-04 10:20:55.802");
+        map.put("dob", INSTANT_DATE);
+        map.put("dobTimestamp", INSTANT_EPOCH_MILLIS);
+        map.put("joinTimestamp", INSTANT_FORMATTED);
         map.put("weight", 180.8D);
         map.put("height", 60.5);
         map.put("mother", mother);
@@ -696,8 +707,7 @@ public class TestQueryRecord {
         personValues.put("person", person);
         personValues.put("favoriteThings", favorites);
 
-        final Record record = new MapRecord(recordSchema, personValues);
-        return record;
+        return new MapRecord(recordSchema, personValues);
     }
 
 
@@ -722,8 +732,7 @@ public class TestQueryRecord {
         map.put("id", id);
         map.put("tags", Arrays.asList(tags));
 
-        final Record record = new MapRecord(recordSchema, map);
-        return record;
+        return new MapRecord(recordSchema, map);
     }
 
     /**
@@ -800,9 +809,7 @@ public class TestQueryRecord {
         map.put("height", 60.5);
         map.put("title", "Software Engineer");
         map.put("addresses", new Record[] {homeAddress, workAddress});
-        final Record person = new MapRecord(personSchema, map);
-
-        return person;
+        return new MapRecord(personSchema, map);
     }
 
 
@@ -834,7 +841,7 @@ public class TestQueryRecord {
     }
 
     @Test
-    public void testSimple() throws InitializationException, IOException, SQLException {
+    public void testSimple() throws InitializationException {
         final MockRecordParser parser = new MockRecordParser();
         parser.addSchemaField("name", RecordFieldType.STRING);
         parser.addSchemaField("age", RecordFieldType.INT);
@@ -867,7 +874,7 @@ public class TestQueryRecord {
     }
 
     @Test
-    public void testNullable() throws InitializationException, IOException, SQLException {
+    public void testNullable() throws InitializationException {
         final MockRecordParser parser = new MockRecordParser();
         parser.addSchemaField("name", RecordFieldType.STRING, true);
         parser.addSchemaField("age", RecordFieldType.INT, true);
@@ -902,7 +909,7 @@ public class TestQueryRecord {
     }
 
     @Test
-    public void testParseFailure() throws InitializationException, IOException, SQLException {
+    public void testParseFailure() throws InitializationException {
         final MockRecordParser parser = new MockRecordParser();
         parser.addSchemaField("name", RecordFieldType.STRING);
         parser.addSchemaField("age", RecordFieldType.INT);
@@ -935,7 +942,7 @@ public class TestQueryRecord {
     }
 
     @Test
-    public void testNoRecordsInput() throws InitializationException, IOException, SQLException {
+    public void testNoRecordsInput() throws InitializationException {
         TestRunner runner = getRunner();
 
         CSVReader csvReader = new CSVReader();
@@ -964,7 +971,7 @@ public class TestQueryRecord {
 
 
     @Test
-    public void testTransformCalc() throws InitializationException, IOException, SQLException {
+    public void testTransformCalc() throws InitializationException {
         final MockRecordParser parser = new MockRecordParser();
         parser.addSchemaField("ID", RecordFieldType.INT);
         parser.addSchemaField("AMOUNT1", RecordFieldType.FLOAT);
@@ -1029,7 +1036,7 @@ public class TestQueryRecord {
     }
 
     @Test
-    public void testAggregateFunction() throws InitializationException, IOException {
+    public void testAggregateFunction() throws InitializationException {
         final MockRecordParser parser = new MockRecordParser();
         parser.addSchemaField("name", RecordFieldType.STRING);
         parser.addSchemaField("points", RecordFieldType.INT);
@@ -1058,7 +1065,7 @@ public class TestQueryRecord {
     }
 
     @Test
-    public void testNullValueInSingleField() throws InitializationException, IOException {
+    public void testNullValueInSingleField() throws InitializationException {
         final MockRecordParser parser = new MockRecordParser();
         parser.addSchemaField("name", RecordFieldType.STRING);
         parser.addSchemaField("points", RecordFieldType.INT);
@@ -1134,7 +1141,7 @@ public class TestQueryRecord {
         }
 
         @Override
-        public RecordSchema getSchema(Map<String, String> variables, RecordSchema readSchema) throws SchemaNotFoundException, IOException {
+        public RecordSchema getSchema(Map<String, String> variables, RecordSchema readSchema) {
             final List<RecordField> recordFields = columnNames.stream()
                 .map(name -> new RecordField(name, RecordFieldType.STRING.getDataType()))
                 .collect(Collectors.toList());
@@ -1178,7 +1185,7 @@ public class TestQueryRecord {
                 }
 
                 @Override
-                public WriteResult write(Record record) throws IOException {
+                public WriteResult write(Record record) {
                     return null;
                 }
 
@@ -1188,11 +1195,11 @@ public class TestQueryRecord {
                 }
 
                 @Override
-                public void beginRecordSet() throws IOException {
+                public void beginRecordSet() {
                 }
 
                 @Override
-                public WriteResult finishRecordSet() throws IOException {
+                public WriteResult finishRecordSet() {
                     return WriteResult.EMPTY;
                 }
             };
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/avro/TestAvroReaderWithEmbeddedSchema.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/avro/TestAvroReaderWithEmbeddedSchema.java
index 1afedab..655541e 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/avro/TestAvroReaderWithEmbeddedSchema.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/avro/TestAvroReaderWithEmbeddedSchema.java
@@ -38,7 +38,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 
 import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
@@ -78,7 +77,6 @@ public class TestAvroReaderWithEmbeddedSchema {
         final int epochDay = 17260;
         final String expectedTime = "2017-04-04 14:20:33.000";
         final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
-        df.setTimeZone(TimeZone.getTimeZone("gmt"));
         final long timeLong = df.parse(expectedTime).getTime();
 
         final long secondsSinceMidnight = 33 + (20 * 60) + (14 * 60 * 60);
@@ -342,7 +340,7 @@ public class TestAvroReaderWithEmbeddedSchema {
         return array;
     }
 
-    public static enum Status {
+    public enum Status {
         GOOD, BAD;
     }
 }
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java
index 980ae32..8656dbd 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVRecordReader.java
@@ -45,7 +45,6 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.TimeZone;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -204,7 +203,6 @@ public class TestCSVRecordReader {
     public void testTimeNoCoersionExpectedFormat() throws IOException, MalformedRecordException, ParseException {
         final String timeFormat = "HH!mm!ss";
         DateFormat dateFmt = new SimpleDateFormat(timeFormat);
-        dateFmt.setTimeZone(TimeZone.getTimeZone("gmt"));
         final String timeVal = "19!02!03";
         final String text = "time\n" + timeVal;
 
@@ -278,7 +276,6 @@ public class TestCSVRecordReader {
     public void testTimestampNoCoersionExpectedFormat() throws IOException, MalformedRecordException, ParseException {
         final String timeFormat = "HH!mm!ss";
         DateFormat dateFmt = new SimpleDateFormat(timeFormat);
-        dateFmt.setTimeZone(TimeZone.getTimeZone("gmt"));
         final String timeVal = "19!02!03";
         final String text = "timestamp\n" + timeVal;
 
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestWriteCSVResult.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestWriteCSVResult.java
index 8fd14e1..821077f 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestWriteCSVResult.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestWriteCSVResult.java
@@ -45,7 +45,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 
 import static org.junit.Assert.assertEquals;
 
@@ -389,7 +388,6 @@ public class TestWriteCSVResult {
 
     private DateFormat getDateFormat(final String format) {
         final DateFormat df = new SimpleDateFormat(format);
-        df.setTimeZone(TimeZone.getTimeZone("gmt"));
         return df;
     }
 
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java
index b1f0582..baa84f9 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/json/TestWriteJsonResult.java
@@ -51,7 +51,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 
 import static org.junit.Assert.assertEquals;
 
@@ -77,7 +76,6 @@ public class TestWriteJsonResult {
 
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
         final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
-        df.setTimeZone(TimeZone.getTimeZone("gmt"));
         final long time = df.parse("2017/01/01 17:00:00.000").getTime();
 
         final Map<String, Object> map = new LinkedHashMap<>();
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
index b7521f0..81532fb 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
@@ -46,7 +46,6 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 
 import static org.apache.nifi.record.NullSuppression.ALWAYS_SUPPRESS;
 import static org.apache.nifi.record.NullSuppression.NEVER_SUPPRESS;
@@ -171,7 +170,6 @@ public class TestWriteXMLResult {
         final RecordSchema schema = new SimpleRecordSchema(fields, SCHEMA_IDENTIFIER_RECORD);
 
         final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
-        df.setTimeZone(TimeZone.getTimeZone("gmt"));
         final long time = df.parse("2017/01/01 17:00:00.000").getTime();
         final String date = "2017-01-01";