javaの日付の取得と変更に関するコードについて質問です
参考書のとおりに、下記のコードを書いて実行してみたのですが
実行してみても、現在の日付から5日後の日付が出力されず、現在の日付が出力されてしまいます。
どこを直せばよいのでしょうか。
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test{
public static void main(String[] args){
Date now = new Date();
Calendar c = Calendar.getInstance();
c.setTime(now);
int day = c.get(Calendar.DAY_OF_MONTH);
day += 5;
Date future = c.getTime();
c.set(Calendar.DAY_OF_MONTH,day);
SimpleDateFormat f = new SimpleDateFormat("西暦yyyy年MM月dd日");
System.out.println(f.format(future));
}
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
java での日付けの扱いは大きく変化しました。
java7 までの方法と、java8 の新しいクラスを利用した方法の両方を示します。
java
1import java.text.SimpleDateFormat; 2import java.time.LocalDateTime; 3import java.time.format.DateTimeFormatter; 4import java.util.Calendar; 5 6public class DateSample{ 7 public static void main(String[] args) { 8 sub0(); 9 System.out.println(); 10 sub1(); 11 } 12 13 // java7 までの方法 14 static void sub0() { 15 SimpleDateFormat sdf = new SimpleDateFormat("西暦yyyy年MM月dd日"); 16 17 Calendar cal = Calendar.getInstance(); // 今日 18 System.out.println(sdf.format(cal.getTime())); 19 20 cal.add(Calendar.DAY_OF_MONTH, 5); // 5 日後 21 System.out.println(sdf.format(cal.getTime())); 22 } 23 24 // java8 の新しい方法 25 static void sub1() { 26 LocalDateTime d = LocalDateTime.now(); // 今日 27 DateTimeFormatter f = DateTimeFormatter.ofPattern("西暦yyyy年MM月dd日"); 28 System.out.println(d.format(f)); 29 30 LocalDateTime d5 = d.plusDays(5); // 5 日後 31 System.out.println(d5.format(f)); 32 } 33}
実行例:
西暦2015年09月23日 西暦2015年09月28日 西暦2015年09月23日 西暦2015年09月28日
参考情報;
- ImmutableでスレッドセーフになったJavaの新しい日時APIの基礎知識 http://www.atmarkit.co.jp/ait/articles/1412/16/news041.html
- Java 8日時APIの主なメソッドとフォーマット用のパターン文字の使い方 http://www.atmarkit.co.jp/ait/articles/1501/29/news016.html
- Java8の日時APIはとりあえずこれだけ覚えとけ http://qiita.com/tag1216/items/91a471b33f383981bfaa
投稿2015/09/23 07:18
総合スコア22328
0
デバッグの仕方を覚えると、どこで間違っていたか発見しやすくなります。
一番のおすすめは、デバッグログを仕込んで、期待値通りの動きをしているかチェック。
下記は独自のデバッグログを入れてますが、log4jを使用した方がいいです。
private static final boolean DEBUG_LOG_MODE = true; public static void main(String[] args) { Date now = new Date(); debugLog("1.now",now); // ←1行1行デバックログを出力させる Calendar c = Calendar.getInstance(); debugLog("2.c", c); c.setTime(now); debugLog("3.c", c); int day = c.get(Calendar.DAY_OF_MONTH); debugLog("4.day", day); day += 5; debugLog("5.day", day); Date future = c.getTime(); debugLog("6.future",future); c.set(Calendar.DAY_OF_MONTH,day); debugLog("7.c", c); SimpleDateFormat f = new SimpleDateFormat("西暦yyyy年MM月dd日"); debugLog("8.f", f); System.out.println(f.format(future)); } /** * デバッグ用 * objのクラス名とtoStringの内容を表示 * DEBUG_LOG_MODE=falseで非出力 * * @param id どのログがどの位置で出力されたか識別できる文字 * @param obj 出力させるオブジェクト */ private static void debugLog(String id,Object obj) { if(DEBUG_LOG_MODE == false) return; System.out.println( String.format("[DEBUG]%s Class名:%s.toString()=%s", id, obj.getClass(),obj.toString() ) ); }
↓
出力結果
[DEBUG]1.now Class名:class java.util.Date.toString()=Wed Sep 23 15:19:49 JST 2015 [DEBUG]2.c Class名:class java.util.GregorianCalendar.toString()=java.util.GregorianCalendar[time=1442989189381,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=39,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=266,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=19,SECOND=49,MILLISECOND=381,ZONE_OFFSET=32400000,DST_OFFSET=0] [DEBUG]3.c Class名:class java.util.GregorianCalendar.toString()=java.util.GregorianCalendar[time=1442989189338,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=39,WEEK_OF_MONTH=4,DAY_OF_MONTH=23,DAY_OF_YEAR=266,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=19,SECOND=49,MILLISECOND=338,ZONE_OFFSET=32400000,DST_OFFSET=0] [DEBUG]4.day Class名:class java.lang.Integer.toString()=23 [DEBUG]5.day Class名:class java.lang.Integer.toString()=28 [DEBUG]6.future Class名:class java.util.Date.toString()=Wed Sep 23 15:19:49 JST 2015 [DEBUG]7.c Class名:class java.util.GregorianCalendar.toString()=java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=8,WEEK_OF_YEAR=39,WEEK_OF_MONTH=4,DAY_OF_MONTH=28,DAY_OF_YEAR=266,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=19,SECOND=49,MILLISECOND=338,ZONE_OFFSET=32400000,DST_OFFSET=0] [DEBUG]8.f Class名:class java.text.SimpleDateFormat.toString()=java.text.SimpleDateFormat@73b4b0ca 西暦2015年09月23日
※Eclipseのブレークポイント張ってデバッグ実行するやり方は、リモート環境でやりづらくなるのでオススメできません。
投稿2015/09/23 06:29
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
どのような参考書を、参考にされたかわかりませんが。
・上の方法だよ8/34等のありえない日付ができる
・Calendar c = Calendar.getInstance();は現在時刻のインスタンスを取得します。
・日付の操作はCalendarクラスだけで可能
Java
1import java.text.SimpleDateFormat; 2import java.util.Calendar; 3import java.util.Date; 4 5public class Test{ 6 public static void main(String[] args){ 7 Calendar c = Calendar.getInstance(); 8 c.add(Calendar.DAY_OF_MONTH,5); 9 SimpleDateFormat f = new SimpleDateFormat("西暦yyyy年MM月dd日"); 10 System.out.println(f.format(c.getTime())); 11 } 12}
投稿2015/09/23 05:17
編集2015/09/23 05:20総合スコア18157
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。