Javaカレンダーを使用して日付からX日を引く簡単な方法を知っている人はいますか?
Javaの日付からX日を直接減算できる関数を見つけることができませんでした。誰かが私を正しい方向に向けることができますか?
カレンダーのルールに基づいて、指定されたカレンダーフィールドに指定された時間を加算または減算します。たとえば、カレンダーの現在の時刻から5日間を差し引くには、次を呼び出して達成できます。
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
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
オブジェクトを変更することに注意してください。どちらの機能も、必要に応じて簡単に変更して、他の方法で実行できます。
LocalDate.now().minusDays( 10 )
タイムゾーンを指定する方が適切です。
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
Java.util.Date
/.Calendar
など、Javaの初期バージョンにバンドルされている古い日時クラスは、面倒で混乱を招き、欠陥があることが判明しています。それらを避けてください。
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 8以降に組み込まれています。これらのクラスは、厄介な古い legacyJava.util.Date
、 Calendar
、& SimpleDateFormat
などの日時クラスに取って代わります。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列もJava.sql.*
クラスも必要ありません。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがあります。
Eliが提案するように独自のaddDays
を書く代わりに、ApacheのDateUtils
を使用することを好みます。特にプロジェクト内で複数の場所で使用する必要がある場合に便利です。
APIは言う:
addDays(Date date, int amount)
新しいオブジェクトを返す日付に日数を追加します。
新しいDate
オブジェクトを返し、以前のオブジェクト自体を変更しないことに注意してください。
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)
以下によって簡単にできます
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());
だれかが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
}
Eli Courtwrightの2番目の解決策は間違っています。
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());