Class DurationFormat

java.lang.Object
org.apache.nifi.time.DurationFormat

public class DurationFormat extends Object
  • Field Details

    • UNION

      private static final String UNION
      See Also:
    • NANOS

      private static final String NANOS
    • MILLIS

      private static final String MILLIS
    • SECS

      private static final String SECS
    • MINS

      private static final String MINS
    • HOURS

      private static final String HOURS
    • DAYS

      private static final String DAYS
    • WEEKS

      private static final String WEEKS
    • VALID_TIME_UNITS

      private static final String VALID_TIME_UNITS
    • TIME_DURATION_REGEX

      public static final String TIME_DURATION_REGEX
    • TIME_DURATION_PATTERN

      public static final Pattern TIME_DURATION_PATTERN
    • TIME_UNIT_MULTIPLIERS

      private static final List<Long> TIME_UNIT_MULTIPLIERS
  • Constructor Details

    • DurationFormat

      private DurationFormat()
  • Method Details

    • getTimeDuration

      public static long getTimeDuration(String value, TimeUnit desiredUnit)
      Returns a time duration in the requested TimeUnit after parsing the String input. If the resulting value is a decimal (i.e. 25 hours -> TimeUnit.DAYS = 1.04), the value is rounded. Use getPreciseTimeDuration(String, TimeUnit) if fractional values are desirable
      Parameters:
      value - the raw String input (i.e. "28 minutes")
      desiredUnit - the requested output TimeUnit
      Returns:
      the whole number value of this duration in the requested units
      See Also:
    • getPreciseTimeDuration

      public static double getPreciseTimeDuration(String value, TimeUnit desiredUnit)
      Returns the parsed and converted input in the requested units.

      If the value is 0 <= x < 1 in the provided units, the units will first be converted to a smaller unit to get a value >= 1 (i.e. 0.5 seconds -> 500 milliseconds). This is because the underlying unit conversion cannot handle decimal values.

      If the value is x >= 1 but x is not a whole number, the units will first be converted to a smaller unit to attempt to get a whole number value (i.e. 1.5 seconds -> 1500 milliseconds).

      If the value is x < 1000 and the units are TimeUnit.NANOSECONDS, the result will be a whole number of nanoseconds, rounded (i.e. 123.4 ns -> 123 ns).

      This method handles decimal values over 1 ns, but < 1 ns will return 0 in any other unit.

      Examples:

      "10 seconds", TimeUnit.MILLISECONDS -> 10_000.0 "0.010 s", TimeUnit.MILLISECONDS -> 10.0 "0.010 s", TimeUnit.SECONDS -> 0.010 "0.010 ns", TimeUnit.NANOSECONDS -> 1 "0.010 ns", TimeUnit.MICROSECONDS -> 0

      Parameters:
      value - the String input
      desiredUnit - the desired output TimeUnit
      Returns:
      the parsed and converted amount (without a unit)
    • makeWholeNumberTime

      static List<Object> makeWholeNumberTime(double decimal, TimeUnit timeUnit)
      Converts the provided time duration value to one that can be represented as a whole number. Returns a List containing the new value as a long at index 0 and the TimeUnit at index 1. If the incoming value is already whole, it is returned as is. If the incoming value cannot be made whole, a whole approximation is returned. For values >= 1 TimeUnit.NANOSECONDS, the value is rounded (i.e. 123.4 ns -> 123 ns). For values < 1 TimeUnit.NANOSECONDS, the constant [1L, TimeUnit.NANOSECONDS] is returned as the smallest measurable unit of time.

      Examples:

      1, TimeUnit.SECONDS -> [1, TimeUnit.SECONDS] 1.1, TimeUnit.SECONDS -> [1100, TimeUnit.MILLISECONDS] 0.1, TimeUnit.SECONDS -> [100, TimeUnit.MILLISECONDS] 0.1, TimeUnit.NANOSECONDS -> [1, TimeUnit.NANOSECONDS]

      Parameters:
      decimal - the time duration as a decimal
      timeUnit - the current time unit
      Returns:
      the time duration as a whole number (long) and the smaller time unit used
    • calculateMultiplier

      static long calculateMultiplier(TimeUnit originalTimeUnit, TimeUnit newTimeUnit)
      Returns the numerical multiplier to convert a value from originalTimeUnit to newTimeUnit (i.e. for TimeUnit.DAYS -> TimeUnit.MINUTES would return 24 * 60 = 1440). If the original and new units are the same, returns 1. If the new unit is larger than the original (i.e. the result would be less than 1), throws an IllegalArgumentException.
      Parameters:
      originalTimeUnit - the source time unit
      newTimeUnit - the destination time unit
      Returns:
      the numerical multiplier between the units
    • getSmallerTimeUnit

      static TimeUnit getSmallerTimeUnit(TimeUnit originalUnit)
      Returns the next smallest TimeUnit (i.e. TimeUnit.DAYS -> TimeUnit.HOURS). If the parameter is null or TimeUnit.NANOSECONDS, an IllegalArgumentException is thrown because there is no valid smaller TimeUnit.
      Parameters:
      originalUnit - the TimeUnit
      Returns:
      the next smaller TimeUnit
    • isWeek

      private static boolean isWeek(String rawUnit)
      Returns true if this raw unit String is parsed as representing "weeks", which does not have a value in the TimeUnit enum.
      Parameters:
      rawUnit - the String containing the desired unit
      Returns:
      true if the unit is "weeks"; false otherwise
    • determineTimeUnit

      protected static TimeUnit determineTimeUnit(String rawUnit)
      Returns the TimeUnit enum that maps to the provided raw String input. The highest time unit is TimeUnit.DAYS. Any input that cannot be parsed will result in an IllegalArgumentException.
      Parameters:
      rawUnit - the String to parse
      Returns:
      the TimeUnit