This is an automated email from the ASF dual-hosted git repository. vy pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit a6b89a200b36d2ef62d8a66610e7cb66780d7111 Author: Markus Spann <[email protected]> AuthorDate: Wed Aug 4 08:01:39 2021 +0200 LOG4J2-2885: Added support for US-style date patterns and micro/nano seconds (#548) Co-authored-by: Markus Spann <[email protected]> --- .../core/time/internal/format/FixedDateFormat.java | 16 +++++-- .../core/pattern/DatePatternConverterTest.java | 52 ++++++++++------------ 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java index 77c015f..d4da20f 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FixedDateFormat.java @@ -76,6 +76,16 @@ public class FixedDateFormat { DATE_PERIOD("dd MMM yyyy HH:mm:ss.SSS", "dd MMM yyyy ", 0, ':', 1, '.', 1, 3, null), /** + * American date/time format with 2-digit year: {@code "dd/MM/yy HH:mm:ss.SSS"}. + */ + US_MONTH_DAY_YEAR2_TIME("dd/MM/yy HH:mm:ss.SSS", "dd/MM/yy ", 0, ':', 1, '.', 1, 3, null), + + /** + * American date/time format with 4-digit year: {@code "dd/MM/yyyy HH:mm:ss.SSS"}. + */ + US_MONTH_DAY_YEAR4_TIME("dd/MM/yyyy HH:mm:ss.SSS", "dd/MM/yyyy ", 0, ':', 1, '.', 1, 3, null), + + /** * DEFAULT time format: {@code "yyyy-MM-dd HH:mm:ss,SSS"}. */ DEFAULT("yyyy-MM-dd HH:mm:ss,SSS", "yyyy-MM-dd ", 0, ':', 1, ',', 1, 3, null), @@ -461,13 +471,13 @@ public class FixedDateFormat { } final String option0 = options[0]; - final FixedFormat withNanos = FixedFormat.lookupIgnoringNanos(option0); - if (withNanos != null) { + final FixedFormat withoutNanos = FixedFormat.lookupIgnoringNanos(option0); + if (withoutNanos != null) { final int[] nanoRange = FixedFormat.nanoRange(option0); final int nanoStart = nanoRange[0]; final int nanoEnd = nanoRange[1]; final int secondFractionDigits = nanoEnd - nanoStart; - return new FixedDateFormat(withNanos, tz, secondFractionDigits); + return new FixedDateFormat(withoutNanos, tz, secondFractionDigits); } final FixedFormat type = FixedFormat.lookup(option0); return type == null ? null : new FixedDateFormat(type, tz); diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java index a9362e3..3310929 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java @@ -105,7 +105,7 @@ public class DatePatternConverterTest { field.setBoolean(null, threadLocalEnabled.booleanValue()); } - private Date date(final int year, final int month, final int date) { + private static Date date(final int year, final int month, final int date) { final Calendar cal = Calendar.getInstance(); cal.set(year, month, date, 14, 15, 16); cal.set(Calendar.MILLISECOND, 123); @@ -122,12 +122,7 @@ public class DatePatternConverterTest { @Test public void testFormatDateStringBuilderDefaultPattern() { - final DatePatternConverter converter = DatePatternConverter.newInstance(null); - final StringBuilder sb = new StringBuilder(); - converter.format(date(2001, 1, 1), sb); - - final String expected = "2001-02-01 14:15:16,123"; - assertEquals(expected, sb.toString()); + assertDatePattern(null, date(2001, 1, 1), "2001-02-01 14:15:16,123"); } @Test @@ -142,24 +137,12 @@ public class DatePatternConverterTest { @Test public void testFormatDateStringBuilderIso8601BasicWithPeriod() { - final String[] pattern = {FixedDateFormat.FixedFormat.ISO8601_BASIC_PERIOD.name()}; - final DatePatternConverter converter = DatePatternConverter.newInstance(pattern); - final StringBuilder sb = new StringBuilder(); - converter.format(date(2001, 1, 1), sb); - - final String expected = "20010201T141516.123"; - assertEquals(expected, sb.toString()); + assertDatePattern(FixedDateFormat.FixedFormat.ISO8601_BASIC_PERIOD.name(), date(2001, 1, 1), "20010201T141516.123"); } @Test public void testFormatDateStringBuilderIso8601WithPeriod() { - final String[] pattern = {FixedDateFormat.FixedFormat.ISO8601_PERIOD.name()}; - final DatePatternConverter converter = DatePatternConverter.newInstance(pattern); - final StringBuilder sb = new StringBuilder(); - converter.format(date(2001, 1, 1), sb); - - final String expected = "2001-02-01T14:15:16.123"; - assertEquals(expected, sb.toString()); + assertDatePattern(FixedDateFormat.FixedFormat.ISO8601_PERIOD.name(), date(2001, 1, 1), "2001-02-01T14:15:16.123"); } @Test @@ -180,13 +163,7 @@ public class DatePatternConverterTest { @Test public void testFormatDateStringBuilderOriginalPattern() { - final String[] pattern = {"yyyy/MM/dd HH-mm-ss.SSS"}; - final DatePatternConverter converter = DatePatternConverter.newInstance(pattern); - final StringBuilder sb = new StringBuilder(); - converter.format(date(2001, 1, 1), sb); - - final String expected = "2001/02/01 14-15-16.123"; - assertEquals(expected, sb.toString()); + assertDatePattern("yyyy/MM/dd HH-mm-ss.SSS", date(2001, 1, 1), "2001/02/01 14-15-16.123"); } @Test @@ -212,6 +189,25 @@ public class DatePatternConverterTest { } @Test + public void testFormatAmericanPatterns() { + Date date = date(2011, 2, 11); + assertDatePattern("US_MONTH_DAY_YEAR4_TIME", date, "11/03/2011 14:15:16.123"); + assertDatePattern("US_MONTH_DAY_YEAR2_TIME", date, "11/03/11 14:15:16.123"); + assertDatePattern("dd/MM/yyyy HH:mm:ss.SSS", date, "11/03/2011 14:15:16.123"); + assertDatePattern("dd/MM/yyyy HH:mm:ss.nnnnnn", date, "11/03/2011 14:15:16.123000"); + assertDatePattern("dd/MM/yy HH:mm:ss.SSS", date, "11/03/11 14:15:16.123"); + assertDatePattern("dd/MM/yy HH:mm:ss.nnnnnn", date, "11/03/11 14:15:16.123000"); + } + + private static void assertDatePattern(final String format, final Date date, final String expected) { + DatePatternConverter converter = DatePatternConverter.newInstance(new String[] {format}); + StringBuilder sb = new StringBuilder(); + converter.format(date, sb); + + assertEquals(expected, sb.toString()); + } + + @Test public void testFormatLogEventStringBuilderIso8601TimezoneJST() { final LogEvent event = new MyLogEvent(); final String[] optionsWithTimezone = {ISO8601, "JST"};
