Javaで引数で受け取った2つの時刻間の差分を出すプログラム(calcTimeDiff)を作成した。ログ解析などをしていて、ログ内のある時刻からある時刻までの正確な経過時間が欲しい時、脳内でいちいち計算するのが面倒だったので、これを作成した。
使い方は、
java calcTimeDiff "開始時刻" "終了時刻"
で、"開始時刻" と "終了時刻" との差分を出す。
例えば、
java calcTimeDiff "2019/03/24 22:00:00" "2020/03/24 22:20:30"
として実行すると、結果は、
Diff Time: 366 days 0 hours 20 minutes 30 seconds
となる。
なお、対応している引数の時刻の形式は以下。
yyyy/MM/dd HH:mm:ss (例:2019/03/24 22:00:00)
yyyy/MM/dd HH:mm (例:2019/03/24 22:00)
yyyy/MM/dd HH (例:2019/03/24 22)
yyyy/MM/dd (例:2019/03/24)
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class calcTimeDiff { public static void main(String[] args) { if (args.length != 2) { throw new IllegalArgumentException("Both start date and end date are necessary."); } String startDateStr = args[0]; String endDateStr = args[1]; long timeDiff = getEpochTime(endDateStr) - getEpochTime(startDateStr); if (timeDiff < 0) { throw new IllegalArgumentException("End date should be later than start date."); } printTimeDiff(timeDiff); } private static void printTimeDiff (long timeDiff) { int ONE_MIN_MILL_SEC_TIME = 1000 * 60; int ONE_HOUR_MILL_SEC_TIME = 1000 * 60 * 60; long ONE_DAY_MILL_SEC_TIME = 1000 * 60 * 60 * 24; long days = timeDiff / (ONE_DAY_MILL_SEC_TIME); int restExceptDays = (int)(timeDiff % (ONE_DAY_MILL_SEC_TIME)); int hours = restExceptDays / ONE_HOUR_MILL_SEC_TIME; int restExceptHours = restExceptDays % (ONE_HOUR_MILL_SEC_TIME); int mins = restExceptHours / ONE_MIN_MILL_SEC_TIME; int restExceptMins = restExceptHours % (ONE_MIN_MILL_SEC_TIME); int seconds = restExceptMins / 1000; System.out.printf("Diff Time: %d days %d hours %d minutes %d seconds", days, hours, mins, seconds); } private static long getEpochTime (String dateStr) { List<SimpleDateFormat> formatters = new ArrayList<SimpleDateFormat>(); formatters.add(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")); formatters.add(new SimpleDateFormat("yyyy/MM/dd HH:mm")); formatters.add(new SimpleDateFormat("yyyy/MM/dd HH")); formatters.add(new SimpleDateFormat("yyyy/MM/dd")); long epochTime = 0; int counter = 0; for (SimpleDateFormat formatter : formatters) { try { epochTime = formatter.parse(dateStr).getTime(); break; } catch (ParseException ex) { counter++; if (counter >= formatters.size()) { throw new IllegalArgumentException("Failed to format the input date", ex); } } } return epochTime; } }