質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

9147閲覧

java 日付の取得と変更について

birdeater52

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2015/09/23 05:08

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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日

参考情報;

投稿2015/09/23 07:18

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

TetsujiMiwa

総合スコア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
yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

birdeater52

2015/09/23 05:36

回答ありがとうございます。参考書では、DateとCalendarを両方つかって、Calendar型にDate型で取得した日付を代入しながらやるやりかただったので、こういうコードになりました。 参考書のコードをよくみてみたら c.set (Calendar.DAY_OF_MONTH,day); と Date future = c.getTime(); を自分で上下逆に書いてたのに気づきました。 回答のとおりのaddメソッドを使ったやりかたも、これから自分でも書いてみて、 参考にさせていただきます ありがとうございました
yona

2015/09/23 05:48 編集

すみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問