mirror of https://github.com/apache/nifi.git
NIFI-3719:
- Removing the usage of SimpleDateFormat when formatting hours/minutes/seconds as the current timezone could cause unintended results. This closes #1871.
This commit is contained in:
parent
2b435cdfc6
commit
7bcccb10f4
|
@ -17,9 +17,6 @@
|
|||
package org.apache.nifi.util;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
@ -66,8 +63,16 @@ public class FormatUtils {
|
|||
*/
|
||||
public static String formatMinutesSeconds(final long sourceDuration, final TimeUnit sourceUnit) {
|
||||
final long millis = TimeUnit.MILLISECONDS.convert(sourceDuration, sourceUnit);
|
||||
final SimpleDateFormat formatter = new SimpleDateFormat("mm:ss.SSS", Locale.US);
|
||||
return formatter.format(new Date(millis));
|
||||
|
||||
final long millisInMinute = TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES);
|
||||
final int minutes = (int) (millis / millisInMinute);
|
||||
final long secondsMillisLeft = millis - minutes * millisInMinute;
|
||||
|
||||
final long millisInSecond = TimeUnit.MILLISECONDS.convert(1, TimeUnit.SECONDS);
|
||||
final int seconds = (int) (secondsMillisLeft / millisInSecond);
|
||||
final long millisLeft = secondsMillisLeft - seconds * millisInSecond;
|
||||
|
||||
return pad2Places(minutes) + ":" + pad2Places(seconds) + "." + pad3Places(millisLeft);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -79,17 +84,22 @@ public class FormatUtils {
|
|||
*/
|
||||
public static String formatHoursMinutesSeconds(final long sourceDuration, final TimeUnit sourceUnit) {
|
||||
final long millis = TimeUnit.MILLISECONDS.convert(sourceDuration, sourceUnit);
|
||||
|
||||
final long millisInHour = TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS);
|
||||
final int hours = (int) (millis / millisInHour);
|
||||
final long whatsLeft = millis - hours * millisInHour;
|
||||
final long minutesSecondsMillisLeft = millis - hours * millisInHour;
|
||||
|
||||
return pad(hours) + ":" + new SimpleDateFormat("mm:ss.SSS", Locale.US).format(new Date(whatsLeft));
|
||||
return pad2Places(hours) + ":" + formatMinutesSeconds(minutesSecondsMillisLeft, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
private static String pad(final int val) {
|
||||
private static String pad2Places(final long val) {
|
||||
return (val < 10) ? "0" + val : String.valueOf(val);
|
||||
}
|
||||
|
||||
private static String pad3Places(final long val) {
|
||||
return (val < 100) ? "0" + pad2Places(val) : String.valueOf(val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the specified data size in human readable format.
|
||||
*
|
||||
|
|
|
@ -16,13 +16,12 @@
|
|||
*/
|
||||
package org.apache.nifi.processor;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import org.apache.nifi.util.FormatUtils;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.apache.nifi.util.FormatUtils;
|
||||
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class TestFormatUtils {
|
||||
|
||||
|
@ -37,4 +36,25 @@ public class TestFormatUtils {
|
|||
assertEquals(60, FormatUtils.getTimeDuration("1 Hrs", TimeUnit.MINUTES));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFormatTime() throws Exception {
|
||||
assertEquals("00:00:00.000", FormatUtils.formatHoursMinutesSeconds(0, TimeUnit.DAYS));
|
||||
assertEquals("01:00:00.000", FormatUtils.formatHoursMinutesSeconds(1, TimeUnit.HOURS));
|
||||
assertEquals("02:00:00.000", FormatUtils.formatHoursMinutesSeconds(2, TimeUnit.HOURS));
|
||||
assertEquals("00:01:00.000", FormatUtils.formatHoursMinutesSeconds(1, TimeUnit.MINUTES));
|
||||
assertEquals("00:00:10.000", FormatUtils.formatHoursMinutesSeconds(10, TimeUnit.SECONDS));
|
||||
assertEquals("00:00:00.777", FormatUtils.formatHoursMinutesSeconds(777, TimeUnit.MILLISECONDS));
|
||||
assertEquals("00:00:07.777", FormatUtils.formatHoursMinutesSeconds(7777, TimeUnit.MILLISECONDS));
|
||||
|
||||
assertEquals("20:11:36.897", FormatUtils.formatHoursMinutesSeconds(TimeUnit.MILLISECONDS.convert(20, TimeUnit.HOURS)
|
||||
+ TimeUnit.MILLISECONDS.convert(11, TimeUnit.MINUTES)
|
||||
+ TimeUnit.MILLISECONDS.convert(36, TimeUnit.SECONDS)
|
||||
+ TimeUnit.MILLISECONDS.convert(897, TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS));
|
||||
|
||||
assertEquals("1000:01:01.001", FormatUtils.formatHoursMinutesSeconds(TimeUnit.MILLISECONDS.convert(999, TimeUnit.HOURS)
|
||||
+ TimeUnit.MILLISECONDS.convert(60, TimeUnit.MINUTES)
|
||||
+ TimeUnit.MILLISECONDS.convert(60, TimeUnit.SECONDS)
|
||||
+ TimeUnit.MILLISECONDS.convert(1001, TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue