diff -ur apache-log4j-2.11.2-src/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java apache-log4j-2.11.2-src-nf/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
--- apache-log4j-2.11.2-src/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java	2018-11-25 21:59:38.000000000 -0700
+++ apache-log4j-2.11.2-src-nf/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java	2019-05-28 16:16:11.174207361 -0600
@@ -18,7 +18,9 @@
 
 import org.junit.Test;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Calendar;
 import java.util.GregorianCalendar;
 
 import static org.junit.Assert.*;
@@ -153,4 +155,22 @@
         assertEquals("Dates not equal.", expected, fireDate);
     }
 
+    /*
+     * Input time with milliseconds will correctly return the next
+     * scheduled time.
+     */
+    @Test
+    public void testTimeBeforeMilliseconds() throws Exception {
+        final CronExpression parser = new CronExpression("0 0 0 * * ?");
+	final GregorianCalendar cal = new GregorianCalendar(2015, 10, 2, 0, 0, 0);
+	cal.set(Calendar.MILLISECOND, 100);
+        final Date date = cal.getTime();
+	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+	System.err.println(sdf.format(date));
+        final Date fireDate = parser.getTimeBefore(date);
+	System.err.println(sdf.format(fireDate));
+        final Date expected = new GregorianCalendar(2015, 10, 1, 0, 0, 0).getTime();
+        assertEquals("Dates not equal.", expected, fireDate);
+    }
+
 }
