これは私の仕事ではありません、ここで答えを見つけました。将来的に壊れたリンクを望んでいませんでした:)。
重要なのは、日光の設定を考慮に入れるためのこの行です。フルコードを参照してください。
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
または合格してみてくださいTimeZone
へのパラメータとしてdaysBetween()
、コールsetTimeZone()
にsDate
し、eDate
オブジェクト。
だからここに行く:
public static Calendar getDatePart(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal;
}
ここから取得したgetDatePart()
public static long daysBetween(Date startDate, Date endDate) {
Calendar sDate = getDatePart(startDate);
Calendar eDate = getDatePart(endDate);
long daysBetween = 0;
while (sDate.before(eDate)) {
sDate.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
return daysBetween;
}
ニュアンス:
2つの日付の違いを見つけることは、2つの日付を減算し、結果を(24 * 60 * 60 * 1000)で割るほど簡単ではありません。実際、その誤りです!
例えば: 2007年3月24日と2007年3月25日の2つの日付の差は1日である必要があります。ただし、上記の方法を使用すると、英国では0日が発生します。
自分の目で確かめてください(以下のコード)。ミリ秒単位で進むと、エラーが四捨五入されます。夏時間のような小さなことがわかったら、エラーが最も顕著になります。
完全なコード:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateTest {
public class DateTest {
static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
Date d1 = new Date("01/01/2007 12:00:00");
Date d2 = new Date("01/02/2007 12:00:00");
Date d3 = new Date("03/24/2007 12:00:00");
Date d4 = new Date("03/25/2007 12:00:00");
Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);
printOutput("Manual ", d1, d2, calculateDays(d1, d2));
printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
System.out.println("---");
printOutput("Manual ", d3, d4, calculateDays(d3, d4));
printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}
private static void printOutput(String type, Date d1, Date d2, long result) {
System.out.println(type+ "- Days between: " + sdf.format(d1)
+ " and " + sdf.format(d2) + " is: " + result);
}
public static long calculateDays(Date dateEarly, Date dateLater) {
return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}
public static long daysBetween(Date startDate, Date endDate) {
...
}
出力:
マニュアル-2007年1月1日から2007年1月2日までの日数:1
カレンダー-2007年1月1日から2007年1月2日までの日数:1
手動-2007年3月24日から2007年3月25日までの日数:0
カレンダー-2007年3月24日から2007年3月25日までの日数:1