class DateUtils {

    public static String getDurationISO8601(long timeInMSec) {
        double totalTime = 0.0;
        int year = (int) Math.floor((timeInMSec - totalTime) / ONE_YEAR_IN_MILLI);
        totalTime += year * ONE_YEAR_IN_MILLI;

        int month = (int) Math.floor((timeInMSec - totalTime) / ONE_MONTH_IN_MILLI);
        totalTime += month * ONE_MONTH_IN_MILLI;

        int day = (int) Math.floor((timeInMSec - totalTime) / ONE_DAY_IN_MILLI);
        totalTime += day * ONE_DAY_IN_MILLI;

        int hour = (int) Math.floor((timeInMSec - totalTime) / ONE_HOUR_IN_MILLI);
        totalTime += hour * ONE_HOUR_IN_MILLI;

        int min = (int) Math.floor((timeInMSec - totalTime) / ONE_MINUTE_IN_MILLI);
        totalTime += min * ONE_MINUTE_IN_MILLI;

        int sec = (int) Math.floor((timeInMSec - totalTime) / ONE_SECOND_IN_MILLI);
        totalTime += sec * ONE_SECOND_IN_MILLI;

        int milli = (int) Math.floor((timeInMSec - totalTime));

        StringBuilder sb = new StringBuilder();
        if (milli > 0) {
            sb.insert(0, "." + String.format("%03d", milli));
        }
        if (sec > 0) {
            sb.insert(0, sec + "S");
        }
        if (min > 0) {
            sb.insert(0, min + "M");
        }
        if (hour > 0) {
            sb.insert(0, hour + "H");
        }
        if (sb.length() > 0) {
            sb.insert(0, "T");
        }

        if (day > 0) {
            sb.insert(0, day + "D");
        }

        if (month > 0) {
            sb.insert(0, month + "M");
        }

        if (year > 0) {
            sb.insert(0, year + "Y");
        }
        sb.insert(0, "P");
        if (sb.length() == 1) {
            sb.append("0D");
        }
        return sb.toString();
    }

    private  DateUtils();

}