可能性のある複製:
2つのJava Dateインスタンスの差の計算
Javaでは、2つの日付間の日数を計算します。
私のデータベースでは、それらはDATE
データ型として保存されますが、私のコードでは文字列です。
これらの2つの文字列間の日数を計算したいです。
Java 8.では、Enum ChronoUnit
のインスタンスを使用して、異なる単位(日、月、秒)で時間を計算できます。
例えば:
ChronoUnit.DAYS.between(startDate,endDate)
このコードを試してください
Calendar cal1 = new GregorianCalendar();
Calendar cal2 = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
Date date = sdf.parse("your first date");
cal1.setTime(date)
date = sdf.parse("your second date");
cal2.setTime(date);
//cal1.set(2008, 8, 1);
//cal2.set(2008, 9, 31);
System.out.println("Days= "+daysBetween(cal1.getTime(),cal2.getTime()));
この機能
public int daysBetween(Date d1, Date d2){
return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
}
私はこのスレッドがもう2年前であることを知っていますが、まだ正しい答えがここにありません。
Jodaを使用する場合、またはJava 8を使用する場合、および夏時間の影響を受けた日付をサブラクトする必要がある場合を除きます。
だから私は自分の解決策を書いた。重要な点は、時刻情報を破棄する必要があるため、日付のみを本当に気にする場合にのみ機能することです。したがって、25.06.2014 - 01.01.2010 = 1636
のようなものが必要な場合、これはDSTに関係なく機能します。
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
public static long getDayCount(String start, String end) {
long diff = -1;
try {
Date dateStart = simpleDateFormat.parse(start);
Date dateEnd = simpleDateFormat.parse(end);
//time is always 00:00:00, so rounding should help to ignore the missing hour when going from winter to summer time, as well as the extra hour in the other direction
diff = Math.round((dateEnd.getTime() - dateStart.getTime()) / (double) 86400000);
} catch (Exception e) {
//handle the exception according to your own situation
}
return diff;
}
時刻は常に00:00:00
であるため、doubleを使用してからMath.round()
を使用すると、冬から夏に行くときに欠落している3600000ミリ秒(1時間)、および夏から行く場合に余分な時間を無視できます冬に。
これは、私がそれを証明するために使用する小さなJUnit4テストです。
@Test
public void testGetDayCount() {
String startDateStr = "01.01.2010";
GregorianCalendar gc = new GregorianCalendar(locale);
try {
gc.setTime(simpleDateFormat.parse(startDateStr));
} catch (Exception e) {
}
for (long i = 0; i < 10000; i++) {
String dateStr = simpleDateFormat.format(gc.getTime());
long dayCount = getDayCount(startDateStr, dateStr);
assertEquals("dayCount must be equal to the loop index i: ", i, dayCount);
gc.add(GregorianCalendar.DAY_OF_YEAR, 1);
}
}
...または「ライフ」が何をするのかを知りたい場合は、アサーションを次のように置き換えます。
System.out.println("i: " + i + " | " + dayCount + " - getDayCount(" + startDateStr + ", " + dateStr + ")");
...そして、これは出力がどのように見えるかです:
i: 0 | 0 - getDayCount(01.01.2010, 01.01.2010)
i: 1 | 1 - getDayCount(01.01.2010, 02.01.2010)
i: 2 | 2 - getDayCount(01.01.2010, 03.01.2010)
i: 3 | 3 - getDayCount(01.01.2010, 04.01.2010)
...
i: 1636 | 1636 - getDayCount(01.01.2010, 25.06.2014)
...
i: 9997 | 9997 - getDayCount(01.01.2010, 16.05.2037)
i: 9998 | 9998 - getDayCount(01.01.2010, 17.05.2037)
i: 9999 | 9999 - getDayCount(01.01.2010, 18.05.2037)
ここに役立つ小さなプログラムがあります:
import Java.util.*;
public class DateDifference {
public static void main(String args[]){
DateDifference difference = new DateDifference();
}
DateDifference() {
Calendar cal1 = new GregorianCalendar();
Calendar cal2 = new GregorianCalendar();
cal1.set(2010, 12, 1);
cal2.set(2011, 9, 31);
System.out.println("Days= "+daysBetween(cal1.getTime(),cal2.getTime()));
}
public int daysBetween(Date d1, Date d2) {
return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
}
}
// http://en.wikipedia.org/wiki/Julian_day
public static int julianDay(int year, int month, int day) {
int a = (14 - month) / 12;
int y = year + 4800 - a;
int m = month + 12 * a - 3;
int jdn = day + (153 * m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;
return jdn;
}
public static int diff(int y1, int m1, int d1, int y2, int m2, int d2) {
return julianDay(y1, m1, d1) - julianDay(y2, m2, d2);
}
私は本当に本当にJavaが本当に新しいので、私が提案していることをするより良い方法があると確信しています。
これと同じ要求があり、2つの日付のDAYOFYEARの差を使用して実行しました。それを行う簡単な方法のように見えました...
パフォーマンスと安定性の観点からこのソリューションを実際に評価することはできませんが、大丈夫だと思います。
ここに:
public static void main(String [] args)throws ParseException { //作成するためだけにコードのこの部分を作成します使用する変数。 //私はブラジルにいます。ここでの日付形式はDD/MM/YYYYですが、皆さんにとっては問題になりません。 //とにかくあなたのフォーマットで動作します。 String s1 = "18/09/2014"; String s2 = "01/01/2014"; DateFormat f = DateFormat.getDateInstance(); Date date1 = f.parse(s1); Date date2 = f.parse(s2); //これは、日を取得する部分です Calendar day1 = Calendar.getInstance(); Calendar day2 = Calendar.getInstance(); day1.setTime(date1); day2.setTime(date2); int daysBetween = day1.get(Calendar.DAY_OF_YEAR)-day2.get( Calendar.DAY_OF_YEAR); //結果を表示するためだけのコード... f = DateFormat.getDateInstance(DateFormat。 MEDIUM); System.out.println( "There's" + daysBetween + "days between" + f.format(day1.getTime())+ "と" + f.format(day2.getTime()) + "。"); }
この場合、出力は次のようになります(日付形式DD/MM/YYYYを使用していることを思い出してください)。
2014年9月18日から2014年1月1日までの期間は260日です。
この機能は私に適しています:
public static int getDaysCount(Date begin, Date end) {
Calendar start = org.Apache.commons.lang.time.DateUtils.toCalendar(begin);
start.set(Calendar.MILLISECOND, 0);
start.set(Calendar.SECOND, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.HOUR_OF_DAY, 0);
Calendar finish = org.Apache.commons.lang.time.DateUtils.toCalendar(end);
finish.set(Calendar.MILLISECOND, 999);
finish.set(Calendar.SECOND, 59);
finish.set(Calendar.MINUTE, 59);
finish.set(Calendar.HOUR_OF_DAY, 23);
long delta = finish.getTimeInMillis() - start.getTimeInMillis();
return (int) Math.ceil(delta / (1000.0 * 60 * 60 * 24));
}
日数の差を計算するための私の最善の解決策(これまで):
// This assumes that you already have two Date objects: startDate, endDate
// Also, that you want to ignore any time portions
Calendar startCale=new GregorianCalendar();
Calendar endCal=new GregorianCalendar();
startCal.setTime(startDate);
endCal.setTime(endDate);
endCal.add(Calendar.YEAR,-startCal.get(Calendar.YEAR));
endCal.add(Calendar.MONTH,-startCal.get(Calendar.Month));
endCal.add(Calendar.DATE,-startCal.get(Calendar.DATE));
int daysDifference=endCal.get(Calendar.DAY_OF_YEAR);
ただし、これは1年未満の差を想定していることに注意してください!