- ベストアンサー
Javaでカレンダーを作成する方法
- Javaでカレンダーを作成する方法についての質問です。
- カレンダーの表示イメージや、土曜日ごとに改行する方法がうまく動作しません。
- どのように修正すれば良いでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> java.util.Calendar.SATURDAY ああ、この定数で判定したいと言う事ですか。 > if (((day-1+week-1) % 7)==6) -1と-1も纏めると「if (((day+week-2) % 7)==(java.util.Calendar.SATURDAY-1))」 ちなみに(java.util.Calendar.SATURDAY-1)もゼロスタートとして計算してます。 下記は簡単ですね。 > if (j<7) 「if (j<java.util.Calendar.SATURDAY)」
その他の回答 (5)
- amanojaku1
- ベストアンサー率54% (265/488)
「%」で"あまり"を計算する場合の有用性としては「if (((day-1+week-1) % 7)==6)」のような計算式でカウンターがリセットできない場合に必要となります。 「j = day-1+week-1;」と変数 j に代入しても、この場合 結局 変数 j もリセットしてはいけません。
お礼
うう・・・まだ半分ほど頭の中がクエスチョンマークでいっぱいです・・・! あの、恐らくものすごく基本的なことをよろしければ教えていただきたいのですが、 「if (((day-1+week-1) % 7)==6)」で、余りが6なのは何故なのでしょうか・・・?? 現在==7(土曜日はCalendar.get(DAY_OF_WEEK)で7だから)ということで頭が凝り固まっているのです;
- amanojaku1
- ベストアンサー率54% (265/488)
> この場合、変数 j は 1 スタートになってます。 これはループのロールバック時にカウンターがリセットされた値の事です。 つまり、下記の「j=1;」の事です。 > if (j<7) { > j++; > }else{ > j=1; > System.out.println(""); > }
お礼
この部分については理解出来たように思います、ありがとうございます!
- amanojaku1
- ベストアンサー率54% (265/488)
回答例(2) こちらは変数 j を本当にカウンターとして使っています。 こちらは「%」で"あまり"を計算していないのでゼロスタートにする必要はありません(「%」で"あまり"を計算する場合はゼロスタートにする必要があります)。 この場合、変数 j は 1 スタートになってます。 public class Calendar { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("_日_月_火_水_木_金_土"); //日付のない日数分回す for (int i = 1; i < week ; i ++) { System.out.print("___"); } String empty; int j = week; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); if (j<7) { j++; }else{ j=1; System.out.println(""); } } } }
お礼
%であまりを意識する際は0スタートであるということも存じませんでした・・・ 一つ賢くなれました、教えてくださりありがとうございます!
- amanojaku1
- ベストアンサー率54% (265/488)
以前のプログラムにヒントがありますよ。 なぜ以前のプログラムでループ用カウンターを2つ使っていたのかと言う事です。 このプログラムでは変数 j を使っていますが、変数 j を使わずに、直に if 文の中に「if (((day-1+week-1) % 7)==6)」と記述しても、(見た目はカウンターは1つでも)結局2つの「カウンター値」を使っていると言うことになります。 public class Calendar { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("_日_月_火_水_木_金_土"); //日付のない日数分回す for (int i = 1; i < week ; i ++) { System.out.print("___"); } String empty; int j; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); //day も week もゼロスタートにして加算。 j = day-1+week-1; if ((j % 7)==6) { System.out.println(""); } } } }
お礼
またもご回答くださり、誠にありがとうございます。 少し時間を掛けてじっくり理解させていただきます>< 本当にありがとうございます!
- maiko0333
- ベストアンサー率19% (839/4401)
私はこのように7回回しています。 if(startDay!=7) for(int i=1 ;i<startDay;i++) System.out.print(" "); 1日までのスペース int x=1; for(int i=startDay;i<=7;i++) { 1週めの表示 if(x<10) System.out.print(" "); System.out.print(" "+x); x++; } System.out.println(""); for(int j=1;j<7;j++){ 2週目以降の表示 for(int k=0;k<7;k++){ 日曜から土曜まで7回まわす if(x<=lastDay){ 最終日以降は表示しない if(x<10) System.out.print(" "); System.out.print(" "+x); x++; } } System.out.println(""); }
お礼
ご回答ありがとうございます。
補足
せっかくお答えいただいたのに申し訳ないのですが、知りたいのはあくまで元の文を出来るだけ残しつつ、●部分のif分、右辺が土曜日の状態での判定のやり方なのでございます・・・
お礼
まだなんとなくではありますが、掴めて来た気がいたします! ありがとうございました><