1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package vogar.util; 18 19 /** 20 * Utilities to make it easier to work with ISO 8601 dates and times. 21 * This is a subset of the original class from http://software.jessies.org/salma-hayek/ --- please submit fixes upstream. 22 */ 23 public class TimeUtilities { 24 /** 25 * Returns the ISO 8601-format String corresponding to the given duration (measured in milliseconds). 26 */ 27 public static String msToIsoString(long duration) { 28 long milliseconds = duration % 1000; 29 duration /= 1000; 30 long seconds = duration % 60; 31 duration /= 60; 32 long minutes = duration % 60; 33 duration /= 60; 34 long hours = duration; 35 36 StringBuilder result = new StringBuilder("P"); 37 if (hours != 0) { 38 result.append(hours); 39 result.append('H'); 40 } 41 if (result.length() > 1 || minutes != 0) { 42 result.append(minutes); 43 result.append('M'); 44 } 45 result.append(seconds); 46 if (milliseconds != 0) { 47 result.append('.'); 48 result.append(milliseconds); 49 } 50 result.append('S'); 51 return result.toString(); 52 } 53 54 /** 55 * Returns a string representation of the given number of milliseconds. 56 */ 57 public static String msToString(long ms) { 58 return nsToString(ms * 1000000); 59 } 60 61 /** 62 * Returns a string representation of the given number of nanoseconds. 63 */ 64 public static String nsToString(long ns) { 65 if (ns < 1000L) { 66 return Long.toString(ns) + "ns"; 67 } else if (ns < 1000000L) { 68 return Long.toString(ns/1000L) + "us"; 69 } else if (ns < 1000000000L) { 70 return Long.toString(ns/1000000L) + "ms"; 71 } else if (ns < 60000000000L) { 72 return String.format("%.2fs", nsToS(ns)); 73 } else { 74 long duration = ns; 75 long nanoseconds = duration % 1000; 76 duration /= 1000; 77 long microseconds = duration % 1000; 78 duration /= 1000; 79 long milliseconds = duration % 1000; 80 duration /= 1000; 81 long seconds = duration % 60; 82 duration /= 60; 83 long minutes = duration % 60; 84 duration /= 60; 85 long hours = duration % 24; 86 duration /= 24; 87 long days = duration; 88 89 StringBuilder result = new StringBuilder(); 90 if (days != 0) { 91 result.append(days); 92 result.append('d'); 93 } 94 if (result.length() > 1 || hours != 0) { 95 result.append(hours); 96 result.append('h'); 97 } 98 if (result.length() > 1 || minutes != 0) { 99 result.append(minutes); 100 result.append('m'); 101 } 102 result.append(seconds); 103 result.append('s'); 104 return result.toString(); 105 } 106 } 107 108 /** 109 * Converts nanoseconds into (fractional) seconds. 110 */ 111 public static double nsToS(long ns) { 112 return ((double) ns)/1000000000.0; 113 } 114 115 private TimeUtilities() { 116 } 117 } 118