統合環境(IBM Process Server)で作業していますが、何もインポートできず、標準のJava機能しか使用できません。
特定の日付にxか月数を追加するにはどうすればよいですか?
統合環境(IBM Process Server)で作業していますが、何もインポートできず、標準のJava機能しか使用できません。
特定の日付にxか月数を追加するにはどうすればよいですか?
デフォルトでDateがインポートされている場合、次の方法で日付オブジェクトに月数を追加できます。
public void addMonths(Date date, int numMonths){
date.setMonth((date.getMonth() - 1 + numMonths) % 12 + 1);
}
ノート
完全なパッケージ名を使用して、JavaSEの外部クラスを使用できます。import java.util.Calendar;
つまり、ファイルの先頭に追加できない場合でも、.java
を実行してカレンダーオブジェクトを作成できます。java.util.Calendar cal = java.util.Calendar.getInstance();
@ewokの答えは、年末を過ぎても常に機能するとは限りません。numMonths
次の1月までの月以下の値に設定されている場合のみです。
SSCCE:
public static void main(String[] args) {
for(int i=0;i<10; i++) {
Date date = new Date();
Date updated = (Date)date.clone();
addMonths(updated, i);
System.out.println(" original: " + date+ " adding " +i+ " months: " + updated);
}
}
public static void addMonths(Date date, int numMonths){
date.setMonth((date.getMonth() - 1 + numMonths) % 12 + 1);
}
出力:
original: Sat Aug 24 14:02:17 CEST 2013 adding 0 months: Sat Aug 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 1 months: Tue Sep 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 2 months: Thu Oct 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 3 months: Sun Nov 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 4 months: Tue Dec 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 5 months: Fri Jan 24 14:02:17 CET 2014
original: Sat Aug 24 14:02:17 CEST 2013 adding 6 months: Sun Feb 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 7 months: Sun Mar 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 8 months: Wed Apr 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 9 months: Fri May 24 14:02:17 CEST 2013
2月、3月などの日付が2013年に戻っていることに注意してください。奇妙な算術のためにコードに欠陥があります...setMonthは12を超える値も処理します...
修正されました(非推奨のメソッドをまだ使用していますが...):
date.setMonth((date.getMonth() + numMonths) );
出力:
original: Sat Aug 24 14:13:09 CEST 2013 adding 0 months: Sat Aug 24 14:13:09 CEST 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 1 months: Tue Sep 24 14:13:09 CEST 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 2 months: Thu Oct 24 14:13:09 CEST 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 3 months: Sun Nov 24 14:13:09 CET 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 4 months: Tue Dec 24 14:13:09 CET 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 5 months: Fri Jan 24 14:13:09 CET 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 6 months: Mon Feb 24 14:13:09 CET 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 7 months: Mon Mar 24 14:13:09 CET 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 8 months: Thu Apr 24 14:13:09 CEST 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 9 months: Sat May 24 14:13:09 CEST 2014
考慮事項
数か月の最後の日、setMonth()のJavaドキュメントから:
この日付の月を指定された値に設定します。このDateオブジェクトは、ローカルタイムゾーンで解釈されるように、年、日付、時、分、秒が以前と同じで、指定された月内のある時点を表すように変更されます。たとえば、日付が10月31日で、月が6月に設定されている場合、6月は30日しかないため、新しい日付は7月1日と同じように扱われます。
まだ非推奨-問題を適切に解決するには、(例外的な場合、うるう日、うるう秒など)、ホイールの完全な再発明は言うまでもなく、非常に時間がかかります...カレンダーを最小限にトリミングして、コードはそれを解決します-しかしそれでも面倒な価値はありません...
@ewokが提案した2番目のアプローチである完全修飾クラス名を試してみてください。
カレンダーなしで実装する場合、非推奨のメソッドで作業する場合は@ewokの提案を使用して問題を解決し、次のコードを使用します。
SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); //Date format
SimpleDateFormat dt = new SimpleDateFormat("MM");
Date date = dt1.parse("2013-12-31");
int dm=0;
int m = Integer.parseInt(dt.format(date));
switch(m){
case 2:
m = 27;
break;
case 4:
case 6:
case 9:
case 11:
m = 29;
break;
default:
m = 30;
break;
}// Closing switch block
long month = Math.round(1000*60*60*24.25*m);
long oneMonthTime = date.getTime()+month;
System.out.println(dt1.format(oneMonthTime));
このコードはうるう年用ではありません。私はその完璧ではないものを知っていますが、それでも機能するコードです。