/******************************************************************************* * Copyright 2012 Pearson Education * * 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. ******************************************************************************/ package org.semantictools.util; public class DurationUtil { private static final long millisPerSecond = 1000; private static final long millisPerMinute = 60 * millisPerSecond; private static final long millisPerHour = 60 * millisPerMinute; private static final long millisPerDay = 24 * millisPerHour; private static final long millisPerWeek = 7 * millisPerDay; private static final long millisPerYear = 52 * millisPerWeek; private static final long millisPerMonth = millisPerYear / 12; public static String durationAsString(long duration) { StringBuilder builder = new StringBuilder(); long years = duration / millisPerYear; duration -= years * millisPerYear; long months = duration / millisPerMonth; duration -= months*millisPerMonth; long weeks = duration / millisPerWeek; duration -= weeks*millisPerWeek; long days = duration / millisPerDay; duration -= days*millisPerDay; long hours = duration / millisPerHour; duration -= hours*millisPerHour; long minutes = duration / millisPerMinute; duration -= minutes*millisPerMinute; long seconds = duration / millisPerSecond; long millis = duration - seconds*millisPerSecond; builder.append('P'); if (years>0) { builder.append(years); builder.append('Y'); } if (months>0) { builder.append(months); builder.append('M'); } if (weeks>0) { builder.append(weeks); builder.append('W'); } if (days>0) { builder.append(days); builder.append('D'); } if (hours>0 || minutes>0 || seconds>0) { builder.append('T'); } if (hours > 0) { builder.append(hours); builder.append('H'); } if (minutes > 0) { builder.append(minutes); builder.append('M'); } if (seconds > 0) { builder.append(seconds); if (millis>0) { builder.append('.'); builder.append(millis); } builder.append('S'); } return builder.toString(); } public static long parseDuration(String text) { int years = 0; int months = 0; int weeks = 0; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; if (text.charAt(0) != 'P') { throw new DurationParseException("ISO8601 requires a duration to start with 'P'"); } int mark=1; boolean time = false; for (int i=1; i<text.length(); i++) { char c = text.charAt(i); if (c == 'T') { mark = i+1; time = true; continue; } if (Character.isAlphabetic(c)) { int digits = parseInt(text, mark, i); switch (c) { case 'Y' : years = digits; break; case 'M' : if (time) { minutes = digits; } else { months = digits; } break; case 'W' : weeks = digits; break; case 'D' : days = digits; break; case 'H' : hours = digits; break; case 'S' : seconds = digits; break; } mark = i+1; } } long duration = years * millisPerYear + months * millisPerMonth + weeks * millisPerWeek + days * millisPerDay + hours * millisPerHour + minutes * millisPerMinute + seconds * millisPerSecond; return duration; } private static int parseInt(String text, int start, int end) { return Integer.parseInt(text.substring(start, end)); } }