他の回答者がほのめかそうとしていることとは対照的に、2 つの日付の差を計算することは、標準の Java SE ではそれほど簡単ではありません。
最初のステップは、これらの文字列を使用可能なDate
インスタンスに変換することです。を使用してこれを行うことができますSimpleDateFormat
。キックオフの例を次に示します。
String string1 = "Oct 15, 2012 1:07:13 PM";
String string2 = "Oct 23, 2012 03:43:34 PM";
SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.ENGLISH);
Date date1 = sdf.parse(string1);
Date date2 = sdf.parse(string2);
Locale
(ここでオプションの引数の重要性に注意してください。これは、文字列を日付に変換することに関する回答で見落とされることがよくあります)
次のステップは、これら 2 つの日付の差を計算することです。標準の Java SE API に制限されている場合、これはひどい仕事です。あなたが得ることができる最高のものはですjava.util.Calendar
。
もちろん、ミリ秒を減算し、通常の算術演算子を使用して差を計算できることに注意してください。
long differenceInMillis = date2.getTime() - date1.getTime();
// ...
しかし、この単純なアプローチではうるう年は考慮されず、夏時間や地域固有の datetime の変更は言うまでもありません。
java.util.Calendar
アプローチに関しては、基本的にカウンターループで使用Calendar#add()
して、年、月、日の経過値を取得する必要があります。これには、うるう年、夏時間、および地域固有の時間の乱れが適切に考慮されます。
最初にこのヘルパー メソッドを作成して、いくつかの定型コードを削除します。
public static int elapsed(Calendar before, Calendar after, int field) {
Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected.
int elapsed = -1;
while (!clone.after(after)) {
clone.add(field, 1);
elapsed++;
}
return elapsed;
}
これで、次のように経過時間を計算できます。
Calendar start = Calendar.getInstance();
start.setTime(date1);
Calendar end = Calendar.getInstance();
end.setTime(date2);
Integer[] elapsed = new Integer[6];
Calendar clone = (Calendar) start.clone(); // Otherwise changes are been reflected.
elapsed[0] = elapsed(clone, end, Calendar.YEAR);
clone.add(Calendar.YEAR, elapsed[0]);
elapsed[1] = elapsed(clone, end, Calendar.MONTH);
clone.add(Calendar.MONTH, elapsed[1]);
elapsed[2] = elapsed(clone, end, Calendar.DATE);
clone.add(Calendar.DATE, elapsed[2]);
elapsed[3] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 3600000;
clone.add(Calendar.HOUR, elapsed[3]);
elapsed[4] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 60000;
clone.add(Calendar.MINUTE, elapsed[4]);
elapsed[5] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 1000;
System.out.format("%d years, %d months, %d days, %d hours, %d minutes, %d seconds", elapsed);
かなり醜いです、ええ。
Java で日付と時刻を頻繁に扱う場合は、Joda の時刻が walhalla であることに気付くかもしれません。純粋な Joda Time ですべてを実行する方法の具体的なキックオフの例を次に示します。
String string1 = "Oct 15, 2012 1:07:13 PM";
String string2 = "Oct 23, 2012 03:43:34 PM";
DateTimeFormatter dtf = DateTimeFormat.forPattern("MMM d, yyyy h:mm:ss a").withLocale(Locale.ENGLISH);
DateTime dateTime1 = dtf.parseDateTime(string1);
DateTime dateTime2 = dtf.parseDateTime(string2);
Period period = new Period(dateTime1, dateTime2);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendYears().appendSuffix(" years ")
.appendMonths().appendSuffix(" months ")
.appendWeeks().appendSuffix(" weeks ")
.appendDays().appendSuffix(" days ")
.appendHours().appendSuffix(" hours ")
.appendMinutes().appendSuffix(" minutes ")
.appendSeconds().appendSuffix(" seconds ")
.printZeroNever()
.toFormatter();
String elapsed = formatter.print(period);
System.out.println(elapsed);
はるかに良いですよね?ただし、複数形の「s」には多少の作業が必要ですが、それは問題外です。