web-dev-qa-db-ja.com

Javaカレンダーを使用して日付からX日を減算する方法は?

Javaカレンダーを使用して日付からX日を引く簡単な方法を知っている人はいますか?

Javaの日付からX日を直接減算できる関数を見つけることができませんでした。誰かが私を正しい方向に向けることができますか?

166
fmsf

ドキュメントはこちら

カレンダーのルールに基づいて、指定されたカレンダーフィールドに指定された時間を加算または減算します。たとえば、カレンダーの現在の時刻から5日間を差し引くには、次を呼び出して達成できます。

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).
286
Anson Smith

addメソッドを使用して、負の数を渡すことができます。ただし、次のようなCalendarクラスを使用しない単純なメソッドを記述することもできます

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

これは、日付のタイムスタンプ値(エポックからのミリ秒)を取得し、適切なミリ秒数を追加します。 daysパラメーターに負の整数を渡して、減算を行うことができます。これは、「適切な」カレンダーソリューションよりも簡単です。

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

これらのソリューションはどちらも、まったく新しいDateを返すのではなく、パラメーターとして渡されたDateオブジェクトを変更することに注意してください。どちらの機能も、必要に応じて簡単に変更して、他の方法で実行できます。

38
Eli Courtwright

アンソンの答え は単純な場合には問題なく機能しますが、より複雑な日付計算を行う場合は、 Joda Time をチェックすることをお勧めします。それはあなたの人生をずっと楽にします。

参考までにJodaでできること

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
35
Mike Deck

tl; dr

LocalDate.now().minusDays( 10 )

タイムゾーンを指定する方が適切です。

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

詳細

Java.util.Date/.Calendarなど、Javaの初期バージョンにバンドルされている古い日時クラスは、面倒で混乱を招き、欠陥があることが判明しています。それらを避けてください。

Java.time

Java 8以降は、新しいJava.timeフレームワークでこれらの古いクラスに取って代わります。 チュートリアル を参照してください。 JSR 31 で定義され、 Joda-Time に触発され、- ThreeTen-Extra プロジェクトによって拡張されました。 ThreeTen-Backportプロジェクトは、クラスをJava 6&7にバックポートします。 ThreeTenABPプロジェクトをAndroidに。

質問はあいまいで、日付のみを要求するのか日時を要求するのかは明確ではありません。

LocalDate

時刻なしの日付のみの場合は、 LocalDate クラスを使用します。 「今日」などの日付を決定する際に重要なタイムゾーンに注意してください。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

日付時刻を意味する場合は、 Instant クラスを使用して、 UTC のタイムラインで瞬間を取得します。そこから、タイムゾーンに調整して ZonedDateTime オブジェクトを取得します。

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い legacyJava.util.DateCalendar 、& SimpleDateFormat などの日時クラスに取って代わります。

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列もJava.sql.*クラスも必要ありません。

Java.timeクラスはどこで入手できますか?

  • Java SE 8Java SE 9Java SE 10 以降、
    • ビルトイン。
    • 実装がバンドルされた標準Java AP​​Iの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされています。 。
  • Android
    • Androidの後のバージョンは、Java.timeクラスの実装をバンドルします。
    • 以前のAndroid(<26)の場合、 ThreeTenABP プロジェクトは適応しますThreeTen-Backport(上記)。 ThreeTenABPの使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。

11
Basil Bourque

Eliが提案するように独自のaddDaysを書く代わりに、ApacheDateUtilsを使用することを好みます。特にプロジェクト内で複数の場所で使用する必要がある場合に便利です。

APIは言う:

addDays(Date date, int amount)

新しいオブジェクトを返す日付に日数を追加します。

新しいDateオブジェクトを返し、以前のオブジェクト自体を変更しないことに注意してください。

5
Risav Karna
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

編集:パーサーはJavadocへのリンクを好まないようですので、ここではプレーンテキストです:

http://Java.Sun.com/j2se/1.4.2/docs/api/Java/util/Calendar.html#add(int 、int)

5
matt b

以下によって簡単にできます

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());
1
rab

だれかがJoda Timeをお勧めしたので、これを使用していますCalendarDateclass http://calendardate.sourceforge.net

これはJoda Timeとやや競合するプロジェクトですが、2つのクラスでより基本的なものです。私のプロジェクトよりも大きなパッケージを使用したくないので、それは非常に便利で、私が必要とするものに最適に機能しました。 Javaの対応物とは異なり、その最小単位は日であるため、実際には日付です(ミリ秒単位などにはなりません)。日付を作成すると、myDay.addDays(-5)のように5日間遡って減算するだけです。これを使用して、曜日などを見つけることができます。もう一つの例:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

そして:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}
1
mikato

Eli Courtwrightの2番目の解決策は間違っています。

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
0
user178973