5

重複の可能性:
Javaでの日付の差の計算Javaで日付を
どのように減算しますか?

次のような文字列から2つの日付を解析しています。

Oct 15, 2012 1:07:13 PM
Oct 23, 2012 03:43:34 PM

私がする必要があるのは、これら2つの日付の違いを見つけることです。例:

Oct 23, 2012 03:43:34 PM - Oct 15, 2012 1:07:13 PM

=8日2時間36分21秒

^これは私が持っている2つの日付/時刻で取得する必要があるものです

フォーマットを解析して別のフォーマットに変換し、その差を差し引いて計算を行い、日/時間/分/秒を取得する必要があると思います。

4

3 に答える 3

12

他の回答者がほのめかそうとしていることとは対照的に、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」には多少の作業が必要ですが、それは問題外です。

于 2012-10-23T19:17:00.523 に答える
0

SimpleDateFormat文字列を解析して作成するには、を使用する必要がありますDate

次に、日付間の違いを見つけることができます。

SimpleDateFormatのjavadocは次のとおりです

于 2012-10-23T18:32:28.277 に答える
-4

これを試して:

Calendar ca1 = Calendar.getInstance();
ca1.set(2012,05,25);
// Addition of date in java        
ca1.add(Calendar.DATE, 23); // Add 23 days in Dates in Calendar
ca1.add(Calendar.MONTH, 2); // Add 2 Month in Date in Calendar
ca1.add(Calendar.YEAR, 4); // add 4 Year in Date in Calendar

ca1.add(Calendar.DATE, -23); // sub 23 days in Dates in Calendar
ca1.add(Calendar.MONTH, -2); // sub 2 Month in Date in Calendar
ca1.add(Calendar.YEAR, -4); // sub 4 Year in Date in Calendar
于 2012-10-23T18:35:48.283 に答える