2013-10-19 6 views
23

私は2つのCalendarオブジェクトの違いを日数で知りたいのですが、もし時計が23:59-0:00にチェックされているような場合は、日差があります。2カレンダーインスタンス間の日数はどのように取得するのですか?

私はこの

public static int daysBetween(Calendar startDate, Calendar endDate) { 
    return Math.abs(startDate.get(Calendar.DAY_OF_MONTH)-endDate.get(Calendar.DAY_OF_MONTH)); 
} 

を書いたが、平均月差が無価値がある場合、それは唯一の日の間の差を与えるように、その作業はありません。

+1

質問彼らはジョダ時間を書いた理由です。 Javaのカレンダーはとても絶望的です...あなたはそれを使用しなければなりませんか? – iluxa

+5

あなたがしなければならない場合、私は両方ともmillisに変換し、これらと一緒に、率直に言って:-) – iluxa

答えて

23

には、次のアプローチを試してみてください。

public static long daysBetween(Calendar startDate, Calendar endDate) { 
    long end = endDate.getTimeInMillis(); 
    long start = startDate.getTimeInMillis(); 
    return TimeUnit.MILLISECONDS.toDays(Math.abs(end - start)); 
} 
+1

それは1だけ増えるかもしれません。 – CoDe

+11

これは元の質問に対する正解ではありません。この答えは、1日の差分が86,400,000ミリ秒(24時間のミリ秒数)であると定義されている場合には正しいです。しかし、元の質問は 'のような日付の変更がある場合、23:59-0:00から時計をチェックした場合、1日の違いがあるはずです。したがって、質問では、暦日が1で異なる場合の1日の違いを定義します。 – stackoverflowuser2010

6

をこの関数は、OPが望んでそれらの間にある月の暦日数、などの2つのカレンダーの間の日数を計算します。計算は、それぞれの日の深夜に設定された後、カレンダーの間に86,400,000ミリ秒の倍数を数えることによって実行されます。

たとえば、私の関数は、1月1日午後11時59分、午前12時01分1月2日のカレンダーとの1日の差分を計算します。

-4

カレンダーday1 = Calendar.getInstance();

カレンダーday2 = Calendar.getInstance();

int diff = day1.get(Calendar.DAY_OF_YEAR) - day2.get(Calendar.DAY_OF_YEAR);

+6

このコードは、両方のインスタンスが同じ年の場合にのみ機能します。 –

2

UPDATEJoda-Timeプロジェクトは、今maintenance modeで、java.timeクラスへの移行をアドバイスします。 ChronoUnitおよびその他のjava.timeクラスの使用については、Anees Aによってthe Answerを参照してください。

ジョダタイム

古いjava.util.Date/.Calendarクラスは、悪名高い厄介であり、避けるべきです。

代わりにJoda-Timeライブラリを使用してください。 Java 8テクノロジを使用している場合を除き、その後継の組み込みのjava.timeフレームワーク(2015年時点ではAndroidでは使用できません)。

「日」は日付として定義されているため(24時間ではなく)、日付に焦点を当てます。 Joda-Timeは、LocalDateクラスに時間帯や時間帯のない日付のみの値を表すクラスを提供します。

時間帯が不足している場合、タイムゾーンはであり、重要なのはで、今日のような日付を決定することに注意してください。西日本よりも東日本に新しい日が始まります。だから、ある日に世界中の日付が同じではなく、日付はあなたのタイムゾーンによって異なります。

DateTimeZone zone = DateTimeZone.forID ("America/Montreal"); 
LocalDate today = LocalDate.now (zone); 

次の週までの日数を数えましょう。これはもちろん7日間とします。端に

LocalDate weekLater = today.plusWeeks (1); 
int elapsed = Days.daysBetween (today , weekLater).getDays(); 

getDaysdaysBetweenによって返さDays物体からプレーンint番号を抽出します。

コンソールにダンプします。

System.out.println ("today: " + today + " to weekLater: " + weekLater + " is days: " + days); 

今日:weekLaterへ2015年12月22日:2015年12月29日の日です:7

あなたはカレンダーオブジェクトを持っています。 Joda-Timeオブジェクトに変換する必要があります。内部的には、カレンダーオブジェクトはlongの整数で、1970年の初めの時代からのミリ秒数を追跡します。UTCです。その番号を抽出してJoda-Timeに送ることができます。また、日付を決定する予定の時間帯を割り当てる必要があります。

long startMillis = myStartCalendar.getTimeInMillis(); 
DateTime startDateTime = new DateTime(startMillis , zone); 

long stopMillis = myStopCalendar.getTimeInMillis(); 
DateTime stopDateTime = new DateTime(stopMillis , zone); 

DateTimeオブジェクトをLocalDateに変換します。

LocalDate start = startDateTime.toLocalDate(); 
LocalDate stop = stopDateTime.toLocalDate(); 

これまでに見たのと同じ経過計算を行ってください。

int elapsed = Days.daysBetween (start , stop).getDays(); 
10

Java 8以降では、単にjava.timeクラスを使用できます。

hoursBetween = ChronoUnit.HOURS.between(calendarObj.toInstant(), calendarObj.toInstant()); 

daysBetween = ChronoUnit.DAYS.between(calendarObj.toInstant(), calendarObj.toInstant()); 
+0

Java 8よりも前でも使用できます... java.timeの機能の多くは、[*** ThreeTen-Backport ***](http://www.threeten.org)のJava 6とJava 7にバックポートされています。/threetenbp /)プロジェクト。さらに、[*** ThreeTenABP ***](https://github.com/JakeWharton/ThreeTenABP)プロジェクトでAndroidに対応しました。 –

0

Iはhttps://stackoverflow.com/a/31800947/3845798によって上記同様の(全く​​同じではない)アプローチを持っています。

私は、 第8回3月2017 - 開始日として、終了日として2017年8月7日を渡すと、私のためにテストケースを書きました。

1日差が表示される日付はほとんどありません。 はしたがって、私は一種の私のAPIのいくつかの小さな変更を加えて、私の現在のAPIは、今私は私にいくつかの問題を引き起こしていたTimeUnit.MILLISECONDS.toDaysを使用していないこの

public long getDays(long currentTime, long endDateTime) { 

Calendar endDateCalendar; 
Calendar currentDayCalendar; 


//expiration day 
endDateCalendar = Calendar.getInstance(TimeZone.getTimeZone("EST")); 
endDateCalendar.setTimeInMillis(endDateTime); 
endDateCalendar.set(Calendar.MILLISECOND, 0); 
endDateCalendar.set(Calendar.MINUTE, 0); 
endDateCalendar.set(Calendar.HOUR, 0); 
endDateCalendar.set(Calendar.HOUR_OF_DAY, 0); 

//current day 
currentDayCalendar = Calendar.getInstance(TimeZone.getTimeZone("EST")); 
currentDayCalendar.setTimeInMillis(currentTime); 
currentDayCalendar.set(Calendar.MILLISECOND, 0); 
currentDayCalendar.set(Calendar.MINUTE, 0); 
currentDayCalendar.set(Calendar.HOUR,0); 
currentDayCalendar.set(Calendar.HOUR_OF_DAY, 0); 


long remainingDays = (long)Math.ceil((float) (endDateCalendar.getTimeInMillis() - currentDayCalendar.getTimeInMillis())/(24 * 60 * 60 * 1000)); 

return remainingDays;} 

ようになります。 JK1素晴らしい答え@へ

0

拡張子:このような

public static long daysBetween(Calendar startDate, Calendar endDate) { 

    //Make sure we don't change the parameter passed 
    Calendar newStart = Calendar.getInstance(); 
    newStart.setTimeInMillis(startDate.); 
    newStart.set(Calendar.HOUR_OF_DAY, 0) 
    newStart.set(Calendar.MINUTE, 0) 
    newStart.set(Calendar.SECOND, 0) 
    newStart.set(Calendar.MILLISECOND, 0) 

    Calendar newEnd = Calendar.getInstance(); 
    newEnd.setTimeInMillis(startDate.); 
    newEnd.set(Calendar.HOUR_OF_DAY, 0) 
    newEnd.set(Calendar.MINUTE, 0) 
    newEnd.set(Calendar.SECOND, 0) 
    newEnd.set(Calendar.MILLISECOND, 0) 

    long end = newEnd.getTimeInMillis(); 
    long start = newStart.getTimeInMillis(); 
    return TimeUnit.MILLISECONDS.toDays(Math.abs(end - start)); 
} 
関連する問題