回答:
カレンダーのルールに基づいて、指定された時間を特定のカレンダーフィールドに加算または減算します。たとえば、カレンダーの現在の時刻から5日を引くには、次のように呼び出してそれを実現できます。
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
Calendar.DAY_OF_MONTH
望むように月間のロールを処理しないので、この場合は使用しません。Calendar.DAY_OF_YEAR
代わりに使用
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
。どちらの関数も、必要に応じて、他の方法で簡単に変更できます。
Ansonの答えは単純なケースでは問題なく機能しますが、より複雑な日付の計算を行う場合は、Joda Timeを確認することをお勧めします。それはあなたの人生をはるかに容易にします。
あなたができるジョーダタイムの参考情報
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
LocalDate.now().minusDays( 10 )
タイムゾーンを指定する方がよい。
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
java.util.Date
/ などのJavaの初期バージョンにバンドルされていた古い日時クラスは、.Calendar
面倒で混乱を招き、欠陥があることが判明しています。それらを避けてください。
Java 8以降は、これらの古いクラスを新しいjava.timeフレームワークに置き換えます。チュートリアルを参照してください。JSR 310によって定義され、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に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
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());
LocalDate
がはるかに簡単で適切です。
誰かがJoda Timeをすすめました-私はこのCalendarDateクラス を使用しています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
}
時間単位(月、日、時間、分、秒など)の減算または加算を実行するためのクリーンで優れた方法は、java.time.Instantクラスを使用して実現できると思います。
現在時刻から5日を減算し、結果を日付として取得する例:
new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());
1時間を減算して15分を加算する別の例:
Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));
より高い精度が必要な場合、インスタンスはナノ秒まで測定します。ナノ秒部分を操作する方法:
minusNano()
plusNano()
getNano()
また、日付はインスタントほど正確ではありません。
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
イーライコートライトの2番目の解決策は間違っています。
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
addDays
です。彼の解決策は正しいです。日付から日数を減算する場合は、に負の値を渡しますdays
。
java.util.Calendar
今ではレガシーなどの厄介な古い日時クラス。Oracleによるチュートリアルを参照してください。