package com.cloudhopper.commons.util;
/*
* #%L
* ch-commons-util
* %%
* Copyright (C) 2012 Cloudhopper by Twitter
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
// third party imports
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
/**
* Utility class to create useful Joda PeriodFormatters.
*
* @author joelauer (twitter: @jjlauer or <a href="http://twitter.com/jjlauer" target=window>http://twitter.com/jjlauer</a>)
*/
public class PeriodFormatterUtil {
private static PeriodFormatter linuxUptimeStyle;
private static PeriodFormatter standardUptimeStyle;
private static PeriodType dayHourMinSecPeriodType;
static {
// create a standard period type that does not include years, months,
// weeks, or millis -- this is required in order to properly print out
// the uptime values where we only want a max value of days calculated
dayHourMinSecPeriodType = PeriodType.standard().withYearsRemoved().withMonthsRemoved().withWeeksRemoved().withMillisRemoved();
linuxUptimeStyle = new PeriodFormatterBuilder()
.printZeroAlways()
.appendDays()
.appendSuffix(" day", " days")
.appendSeparator(", ")
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
.minimumPrintedDigits(2)
.appendMinutes()
.appendSeparator(":")
.minimumPrintedDigits(2)
.appendSeconds()
.toFormatter();
standardUptimeStyle = new PeriodFormatterBuilder()
.printZeroAlways()
.appendDays()
.appendSuffix(" day ", " days ")
.appendHours()
.appendSuffix(" hours ")
.appendMinutes()
.appendSuffix(" mins ")
.appendSeconds()
.appendSuffix(" secs")
.toFormatter();
}
/**
* Gets a PeriodType that can be used to create a Period that is normalized
* to only include the fields Day, Hour, Minute, and Second. Basically,
* this PeriodType would max out at days, so that someting like 40 days
* does not get converted to 1 month, 1 week, and 3 days like it normally
* would with the Joda library.
* @return A PeriodType that only includes Days, Hours, Minutes, and Seconds.
* @see PeriodFormatterUtil#createDayHourMinSecPeriod(long)
*/
public static PeriodType getDayHourMinSecPeriodType() {
return dayHourMinSecPeriodType;
}
/**
* Creates a new Period that can be used properly with the "Uptime" styles
* returned by this utility class. This period normalizes the internal
* fields to only include days, hours, minutes, and seconds.
* @param durationInMillis The length of the duration in milliseconds
* @return A new normalized Period
*/
public static Period createDayHourMinSecPeriod(long durationInMillis) {
return new Period(durationInMillis).normalizedStandard(dayHourMinSecPeriodType);
}
/**
* Gets a PeriodFormatter in the Linux OS style such as "0 days, 01:05:12"
* or "2 days, 07:00:00". NOTE: You need to be careful with the Period
* used with this formatter object. It needs to be normalized to max out
* with the days fields (not include years, months, weeks, or millis).
* @return The global PeriodFormatter instance
* @see PeriodFormatterUtil#createDayHourMinSecPeriod(long)
*/
public static PeriodFormatter getLinuxUptimeStyle() {
return linuxUptimeStyle;
}
/**
* Gets a PeriodFormatter in the standard Uptime style such as "0 days 0 hours 1 min 50 secs"
* or "2 days 7 hours 1 min 50 secs". NOTE: You need to be careful with the Period
* used with this formatter object. It needs to be normalized to max out
* with the days fields (not include years, months, weeks, or millis).
* @return The global PeriodFormatter instance
* @see PeriodFormatterUtil#createDayHourMinSecPeriod(long)
*/
public static PeriodFormatter getStandardUptimeStyle() {
return standardUptimeStyle;
}
/**
* Helper method to create a "Linux" uptime styled string that represents
* the duration (in milliseconds). This method will only call other methods
* publicly available on this class. Converts the duration into a String
* such as "0 days, 01:05:12" or "2 days, 07:00:00".
* @param durationInMillis The duration (in millis)
* @return A styled String of the duration
*/
public static String toLinuxUptimeStyleString(long durationInMillis) {
return getLinuxUptimeStyle().print(createDayHourMinSecPeriod(durationInMillis));
}
/**
* Helper method to create a "Standard" uptime styled string that represents
* the duration (in milliseconds). This method will only call other methods
* publicly available on this class. Converts the duration into a String
* such as "0 days 0 hours 1 min 50 secs" or "2 days 7 hours 1 min 50 secs".
* @param durationInMillis The duration (in millis)
* @return A styled String of the duration
*/
public static String toStandardUptimeStyleString(long durationInMillis) {
return getStandardUptimeStyle().print(createDayHourMinSecPeriod(durationInMillis));
}
}