web-dev-qa-db-ja.com

Android 2つの日付間の日数を計算する

2つの日付の間の日を見つけるために次のコードを作成しました

    startDateValue = new Date(startDate);
    endDateValue = new Date(endDate);
    long diff = endDateValue.getTime() - startDateValue.getTime();
    long seconds = diff / 1000;
    long minutes = seconds / 60;
    long hours = minutes / 60;
    long days = (hours / 24) + 1;
    Log.d("days", "" + days);

開始日と終了日がそれぞれ2017年2月3日と2017年3月3日である場合、表示される日数は29です。 1日間の休暇を取る場合は、同じ開始日と終了日を選択する必要があります。この場合、2日間の休暇を取っています。

私は何を間違えていますか?お時間をいただきありがとうございます。

注:日付コンストラクターは使用しないでください。以下の受け入れられた回答を確認してください。 simpledateformatまたはJoda時間を使用します。日付コンストラクタは廃止されました。

10

日付オブジェクトを生成するためのコード:

_Date date = new Date("2/3/2017"); //deprecated
_

Date(String)コンストラクターによると、日= 3、月= 2、年= 2017と考えているため、28日の回答を得ています。

次のように、文字列を日付に変換できます。

_String dateStr = "2/3/2017";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = sdf.parse(dateStr);
_

上記のテンプレートを使用して、Dateオブジェクトを作成します。次に、2つの日付の間の日を計算するために以下のコードを使用します。これが明確になることを願っています。

次のように実行できます。

_long diff = endDateValue.getTime() - startDateValue.getTime();
System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
_

リンク を確認してください

Joda Timeを使用する場合は、はるかに簡単です。

_int days = Days.daysBetween(date1, date2).getDays();
_

確認してください JodaTime

Java Project)でのJodaTimeの使用方法

26
SachinSarawgi
public static int getDaysDifference(Date fromDate,Date toDate)
{
if(fromDate==null||toDate==null)
return 0;

return (int)( (toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
}
9
Jitendra virani

どの日付形式を使用しますか?それは...ですか d/M/yyyyまたはM/d/yyyy

d =日、M =月、yyyy =年

(参照: https://developer.Android.com/reference/Java/text/SimpleDateFormat.html

次に、コード:

public static final String DATE_FORMAT = "d/M/yyyy";  //or use "M/d/yyyy"   

public static long getDaysBetweenDates(String start, String end) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH);
    Date startDate, endDate;
    long numberOfDays = 0;
    try {
        startDate = dateFormat.parse(start);
        endDate = dateFormat.parse(end);
        numberOfDays = getUnitBetweenDates(startDate, endDate, TimeUnit.DAYS);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return numberOfDays;
}

getUnitBetweenDatesメソッドの場合:

private static long getUnitBetweenDates(Date startDate, Date endDate, TimeUnit unit) {
    long timeDiff = endDate.getTime() - startDate.getTime();
    return unit.convert(timeDiff, TimeUnit.MILLISECONDS);
}
5
Janice Kartika

AndroidJava-8を完全にサポートしていますか?はいの場合、単純にChronoUnitclass を使用できます

LocalDate start = LocalDate.of(2017,2,3);
LocalDate end = LocalDate.of(2017,3,3);

System.out.println(ChronoUnit.DAYS.between(start, end)); // 28

またはフォーマッタを使用して同じこと

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");
LocalDate start = LocalDate.parse("2/3/2017",formatter);
LocalDate end = LocalDate.parse("3/3/2017",formatter);

System.out.println(ChronoUnit.DAYS.between(start, end)); // 28
4
Anton Balaniuc

非常に簡単です。カレンダーを使用して、2つの日付に対して2つのインスタンスを作成し、ミリ秒に変換し、減算して日に変換します(切り上げ)...

Calendar startDate = Calendar.getInstance();
startDate.set(mStartYear, mStartMonth, mStartDay);
long startDateMillis = startDate.getTimeInMillis();

Calendar endDate = Calendar.getInstance();
endDate.set(mEndYear, mEndMonth, mEndDay);
long endDateMillis = endDate.getTimeInMillis();

long differenceMillis = endDateMillis - startDateMillis;
int daysDifference = (int) (differenceMillis / (1000 * 60 * 60 * 24));
2
fuzzKitty

このコードを見てください、これは私にとって役立ちます、それがあなたを助けることを願っています。

public String get_count_of_days(String Created_date_String, String Expire_date_String) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());

Date Created_convertedDate = null, Expire_CovertedDate = null, todayWithZeroTime = null;
try {
    Created_convertedDate = dateFormat.parse(Created_date_String);
    Expire_CovertedDate = dateFormat.parse(Expire_date_String);

    Date today = new Date();

    todayWithZeroTime = dateFormat.parse(dateFormat.format(today));
} catch (ParseException e) {
    e.printStackTrace();
}

int c_year = 0, c_month = 0, c_day = 0;

if (Created_convertedDate.after(todayWithZeroTime)) {
    Calendar c_cal = Calendar.getInstance();
    c_cal.setTime(Created_convertedDate);
    c_year = c_cal.get(Calendar.YEAR);
    c_month = c_cal.get(Calendar.MONTH);
    c_day = c_cal.get(Calendar.DAY_OF_MONTH);

} else {
    Calendar c_cal = Calendar.getInstance();
    c_cal.setTime(todayWithZeroTime);
    c_year = c_cal.get(Calendar.YEAR);
    c_month = c_cal.get(Calendar.MONTH);
    c_day = c_cal.get(Calendar.DAY_OF_MONTH);
}


/*Calendar today_cal = Calendar.getInstance();
int today_year = today_cal.get(Calendar.YEAR);
int today = today_cal.get(Calendar.MONTH);
int today_day = today_cal.get(Calendar.DAY_OF_MONTH);
*/

Calendar e_cal = Calendar.getInstance();
e_cal.setTime(Expire_CovertedDate);

int e_year = e_cal.get(Calendar.YEAR);
int e_month = e_cal.get(Calendar.MONTH);
int e_day = e_cal.get(Calendar.DAY_OF_MONTH);

Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.clear();
date1.set(c_year, c_month, c_day);
date2.clear();
date2.set(e_year, e_month, e_day);

long diff = date2.getTimeInMillis() - date1.getTimeInMillis();

float dayCount = (float) diff / (24 * 60 * 60 * 1000);

return ("" + (int) dayCount + " Days");

}

2
Mr. Mad

受信した整数を使用したい場合は気をつけてください。カスタムカレンダーの実装で特定の日を示すため。たとえば、1970-01-01から選択した日付までの日付を計算して、月間カレンダービューから日次ビューにmアプリでアクセスし、毎日のコンテンツを表示しようとしました。 datesDifferenceInMillis / (24 * 60 * 60 * 1000);は17645,95833333333のような値を返し、これをintにキャストすると値が1減ります。この場合、NumberFormatクラスを使用して受信した浮動小数点数を丸めることで正しく取得できる日数になります。私のコードは次のとおりです。

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
numberFormat.setMaximumFractionDigits(0);
numberFormat.setMinimumFractionDigits(0);
int days = numberFormat.parse(numberFormat.format(value)).intValue();

役立つことを願っています。

1
grabarz121

Kotlin

以下は、今日から特定の日付までの日数を計算する例です。

 val millionSeconds = yourDate.time - Calendar.getInstance().timeInMillis
 leftDays.text = TimeUnit.MILLISECONDS.toDays(millionSeconds).toString() + "days"

2日間を計算する場合は、次を変更します。

val millionSeconds = yourDate1.time - yourDate2.time

動作するはずです。

1
William Hu