カレンダーの処理が分かりません

このQ&Aのポイント
  • カレンダーの処理が分からない場合、休みの日を判定するプログラムを作成する際に問題が発生しています。
  • 具体的には、2005年6月26日が日曜日であるにも関わらず、「日曜日」と表示されないという問題が発生しています。
  • この問題の原因を特定し、正しい判定結果を表示するための修正を行いたいと考えています。
回答を見る
  • ベストアンサー

カレンダーの処理が分かりません

休みの日を判定しようと思います。 土曜日か日曜日なら曜日を表示させるプログラムです。 2005/6/26日は日曜日なのですが「日曜日」と表示されません。どこがいけないのでしょうか? public void day() { Calendar calendar = Calendar.getInstance(); int y = 2005; int m = 6; int d = 26; calendar.set(y,m,d); // 日曜日のとき if(calendar.get(calendar.DAY_OF_WEEK) == calendar.SUNDAY){ System.out.println("日曜日"); } // 土曜日のとき else if(calendar.get(calendar.DAY_OF_WEEK) == calendar.SATURDAY){ System.out.println("土曜日 } }

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • goo_mania
  • ベストアンサー率25% (22/87)
回答No.1

Calendarクラスについて getメソッドと、MONTHフィールドにより、現在の月を取得します。MONTHフィールドの月は0~11の値をとるため、実際の月は1加えた値になります。 (Javaの道HPより説明文を拝借しました。詳しくは参考URLを・・・) ということは、そのソースコードを実行したときの曜日は2005年7月26日の曜日が返ってくるので、月にセットする数を1減らせば良いです。

参考URL:
http://www.javaroad.jp/java_date2.htm
morumomo
質問者

お礼

早い回答ありがとうございます。 おかげで思うとおりのプログラムができました。

関連するQ&A

  • java Calendar作成

    javaでのカレンダー作成についての質問です。 表示イメージ(_はすべて半角スペースの意です) year年month月(今回は2016年04月) _日_月_火_水_木_金_土 _______________1__2_ _3__4__5__6__7__8__9_ 10_11_12_13_14_15_16_ 17_18_19_20_21_22_23_ 24_25_26_27_28_29_30_ public class CalShow { 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("___(半角3マス)"); } String empty; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); ●if ( == java.util.Calendar.SATURDAY) { System.out.println(""); } } } } ●部分で土曜日なら改行、としたいのですが、 上でint weekで土曜日=7と判明しているため、 if ( week == java.util.Calendar.SATURDAY) { とか if ( day % 7 == java.util.Calendar.SATURDAY) { など色々考え付くものを書き込んでいるのですが全く上手く動作しません。 どうしたらよいのかご教授お願いいたします・・・;;

    • ベストアンサー
    • Java
  • javaのカレンダー作成について

    コマンドライン引数で渡された6桁の数字をカレンダーに起こすプログラムを作成しています。 以下のように書きました。 ↓ 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); int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //日曜始まり一週間のセット作成 int weekset = 0; if (week == cal.SUNDAY) { weekset = 0; } else if (week == cal.MONDAY) { weekset = 1; } else if (week == cal.TUESDAY) { weekset = 2; } else if (week == cal.WEDNESDAY) { weekset = 3; } else if (week == cal.THURSDAY) { weekset = 4; } else if (week == cal.FRIDAY) { weekset = 5; } else if (week == cal.SATURDAY) { weekset = 6; } //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); //7日ごとに改行するカウンタ用意 int counter = 0; System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); //weekset分回す for (int i = 0; i < weekset; i++) { System.out.print(" "); counter ++; } //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { System.out.print(" " + day + " "); } else { System.out.print( day + " "); } counter ++; if (counter == 7) { // 7日おきに改行する counter = 0; System.out.println(); } } } } きちんと動作してくれるのですが、2つ目のループ内の、 ************** for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { ●System.out.print(" " + day + " "); } else { ●System.out.print( day + " "); } ************** ●の部分の出力はループの外で一つに纏められるはずだと指摘されました。 dayの後ろの部分にだけなら、for文の前にString str = "";と宣言しておいて、 for (int day = 1 ; day <= lastDay; day ++) { str += " "; とすることで空白を付けられる気がしているのですが、前部分に空白を設定した上でまとめて出力する方法が分かりません。 お分かりになる方、どのようにすればよいのかご教授お願いいたします。 (また、上記の方法自体全く的外れということでしたらそれを含めてご教授お願いいたします・・・;;)

    • ベストアンサー
    • Java
  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • 配列を使ってカレンダーを表示したい。

    配列を使った場合のカレンダー表示方法で質問します。 現在、 Calendarクラスを使い、配列に日を入れていくようにしているのですが Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at CalendarSample.main(CalendarSample.java:33) のようなエラーが生じます。 以下のような手順でで考えることは可能なのでしょうか? よろしくお願いします。 Calendar cal = Calendar.getInstance(); //最終日 int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH); //月の週の合計数 int week = cal.get(Calendar.WEEK_OF_MONTH); //日を格納する配列 int[][] date = new int[week][7]; int n = 0; for(int d=1;d<=max;d++){ //年月日の設定 cal.set(2011,6,d); int youbi = cal.get(Calendar.DAY_OF_WEEK); date[n][youbi] =d; //日が、土曜になったら、配列の列を変える if(cal.get(Calendar.DAY_OF_WEEK)==6){ n+=1; } }

  • カレンダーを作成する記述方法について

    1月 1 2 3 4 5 6 7 (中略) 22 23 24 25 26 27 28 29 30 31 2月 1 2 3 4 5 6 7 8 9 10 11 このように1月~12月までのカレンダーを作成する為の プログラムの記述方法について伺います。 ※ここでは左詰で表示されてしまいますが、実際には 2/1は1/31の隣から表示されるようになっています。 <解答> class Calen{ public static void main(String[] args){ int week =0;//7日で折り返しする為の変数 //12回ループ(日付) for(int month =1; i <=12; i++){ System.out.println(month + "月"); //一ヶ月の始まりと終わりの並びを合わせる for(int sp = week; sp > 0; sp--){ System.out.println(" ");//スペース3つ } //31回ループ(日付) for(int day = 1; i <=31; i++){ //日付を右詰にする。 if(day < 10){ System.out.println(" " + day);//スペース2つ }else{ System.out.println(" " + day);//スペース1つ } //一週間のカウントを行い、折り返し処理を行う if(week < 6){ week++; }else{ System.out.println(); week = 0; } //2月は28日まで if(month == 2 && day ==28){ break; } //4.6.9.11は30日まで if((month == 4 || month == 6 || month == 9 || month == 11) && day == 30){ break; } } System.out.println(); } } } ************************************************************** <質問> 1.int week = 0; とありますが、なぜ0を代入しているのですか? 0週なんてないのに・・・ 2.//一ヶ月の始まりと終わりの並びを合わせる for(int sp = week; sp > 0; sp--){ System.out.println(" ");//スペース3つ } ここの記述については「sp > 0; sp--」と記述する理由も 分かりませんが、そもそもspの変数が指しているものって 何なのでしょうか? 3.>//日付を右詰にする。   if(day < 10){  >//一週間のカウントを行い、折り返し処理を行う   if(week < 6){ 一番の疑問は、ここで10と6という数字が使われている理由です。 week < 7なら納得行くけど、なぜ6なのか・・・? day < 10については、まったく意味が分かりません。 出来れば、全体的に解説していただけるとありがたいです。 もちろん、一ヶ所だけの回答でも結構ですので、よろしくお願いします。

    • ベストアンサー
    • Java
  • Calenderクラスを使うと変?

    サーブレットで現在の日付と時刻を取得しようとして、まず、日付と時刻を表示させるプログラムを書きました。 APIドキュメントで探すとDateクラスのgetDate等が推奨されていないということだったので、Calendarクラスを使いました。 すると、月の表示がおかしいのです。年と日と時間はあっているのですが、月が10月になっているのです。(ちなみに今日なので、11月になるハズ・・・) パソコンの日付と時刻も今日(11月7日、タイムゾーン(GMT+09:00)大阪、札幌、東京)です。 そこで、DATEクラスを使うとちゃんと11月になっています。 どういうことなのでしょうか? import java.util.*; class Hiduke {    public static void main(String args[]) {      System.out.println(Calendar.getInstance());      Calendar calendar = Calendar.getInstance();      System.out.println(calendar.get(Calendar.YEAR));      System.out.println(calendar.get(Calendar.MONTH));      System.out.println(calendar.get(Calendar.DAY_OF_MONTH));      Date d = new Date();      System.out.println(d);    } } java.util.GregorianCalendartime=1036634060997,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null], firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2002,MONTH=10,WEEK_OF_YEAR=45,WEEK_OF_MONTH=2, DAY_OF_MONTH=7,DAY_OF_YEAR=311,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1, AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=54,SECOND=20,MILLISECOND=997,ZONE_OFFSET=32400000,DST_OFFSET=0] 2002 10 7 Thu Nov 07 10:54:21 JST 2002

    • ベストアンサー
    • Java
  • 本日の日付を”「」”で括りたい

    今はカレンダーにかんする課題をやっております。 本日の日付を”「」”で括りたいので方法がよくわかりません。 こんな感じ ーーーー9月ーーーー  月 火 水 木 金 土 日 1 2 3 4 5 6 7 8 9 10 11 12 13 「14」 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ソースを上げますので教えてください。 public class Canlda { public static void main(String[] A00) { Calendar L00 = Calendar.getInstance(); int L01 = L00.get(YEAR); int L02 = L00.get(MONTH); int date= L00.get(DATE); L00.set(L01, L02, 1); int L03 = L00.getActualMaximum(DAY_OF_MONTH); int L04 = L00.get(DAY_OF_WEEK); System.out.printf("ーーーー%d月ーーーー %n",L02 + 1); System.out.println("月 火 水 木 金 土 日"); // 空白の個数を求める int L06; if (L04 < MONDAY) { L06 = (L04 + 7) - MONDAY; } else { L06 = L04 - MONDAY; } int L05 = 0; for (int L07 = 0; L07 < L06; L07++) { System.out.print(" "); L05++; } for (int L08 = 1; L08 <= L03; L08++) { if (L05 < 6) {          if(date == L08){ System.out.printf("[%2d] ", L08); } System.out.printf("%2d ", L08); } else { System.out.printf("%2d%n", L08); } L05 = ++L05 % 7; } } } よろしくお願いします。

  • Javaによる現在時刻の表示について

    Javaで現在時刻を表示するプログラムを作りました。 今のままだと 2009/8/26(木) 15:8:7となり、 月日・時間分秒が一桁のときは前に0をつけて二桁(15:08:07のように)表示にしたいと思います。 何かいい方法はないでしょうか? if文で作成するとなると、かなりたくさんのコードを書かないといけない気がします。 良い案があれば是非ご教授頂ければと思います。 import java.util.Calendar; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet_106 extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{ res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); String title = "現在時刻:"; Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DATE); StringBuffer dow = new StringBuffer(); switch (cal.get(Calendar.DAY_OF_WEEK)){ case Calendar.SUNDAY: dow.append("日"); break; ~~~(略)~~~ } int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); out.println("<html lang=\"ja\">"); out.println("<head><title></title></head>"); out.println("<body>"); out.println("<p>現在時刻:" + year + "/" + month + "/" + day + "(" + dow + ")" + hour + ":" + minute + ":" + second + "</p>"); out.println("</body></html>"); out.close(); } }

    • ベストアンサー
    • Java
  • Javaと言うより、for文の長さの問題なのですが……

    <%@ page language="java" contentType="text/html; charset=Shift_JIS" import="java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>カレンダー</title> </head> <body> <% //カレンダーオブジェクトを生成する Calendar myCal = Calendar.getInstance(); //年月日を取得する int year = myCal.get(Calendar.YEAR); int month = myCal.get(Calendar.MONTH) + 1; if (request.getMethod().equals("POST")) { year = Integer.parseInt(request.getParameter("yyyy")); month = Integer.parseInt(request.getParameter("mm")); } //年月選択リストを表示する out.println("<form method='POST' action='Calendar2.jsp'>"); out.println("<table><tr><td>"); //年 out.println("<select name='yyyy'>"); for (int i = 2000; i <= 2020; i++) { out.println("<option"); if (i == year) { out.println(" selected "); } out.println(">" + i); } out.println("</select>年"); //月 out.println("<select name='mm'>"); for (int i = 1; i <= 12; i++) { out.println("<option"); if (i == month) { out.println(" selected "); } out.println(">" + i); } out.println("</select>月"); out.println("</td>"); out.println("<td><input type='submit' value='更新'></td>"); out.println("</tr></table></form>"); //カレンダーを表示する out.println("<table border='1'>"); out.println("<tr>"); out.println("<td>日</td>"); out.println("<td>月</td>"); out.println("<td>火</td>"); out.println("<td>水</td>"); out.println("<td>木</td>"); out.println("<td>金</td>"); out.println("<td>土</td>"); out.println("</tr>"); //1日の曜日を取得する myCal.set(year, month - 1, 1); int dw1 = myCal.get(Calendar.DAY_OF_WEEK); //末日を取得する int lastd = myCal.getActualMaximum(Calendar.DAY_OF_MONTH); //表示する日付を初期化する int day = 0; //1日から末日まで日付を表示する 添付したcalendar.jspなのですが、ずばりココ↓の部分なのですが、 for (int i=0; i<=5; i++) { ここで最大は5以下になっているのですが、そうすると1列多くならないでしょうか。 これだと行数が6つになりますよね。 曜日のセルはその前に作っているので、曜日だけが入るのですから5行でいいと思うのですが、自分の考えは間違っているのでしょうか。 宜しくお願い致します。 for (int i = 0; i <= 5; i++) { if (day >= lastd) {break;} out.println("<tr>"); for (int j = 0; j <= 6; j++) { day = i * 7 + j - dw1 + 2; if (day > lastd || day < 1) { out.println("<td> </td>"); } else { out.println("<td>" + day + "</td>"); } } out.println("</tr>"); } out.println("</table>"); %> </body> </html>

    • ベストアンサー
    • Java
  • Javaと言うより、for文の長さの問題なのですが……

    <%@ page language=\"java\" contentType=\"text/html; charset=Shift_JIS\" import=\"java.util.*\"%> <!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"> <title>カレンダー</title> </head> <body> <% //カレンダーオブジェクトを生成する Calendar myCal = Calendar.getInstance(); //年月日を取得する int year = myCal.get(Calendar.YEAR); int month = myCal.get(Calendar.MONTH) + 1; if (request.getMethod().equals(\"POST\")) { year = Integer.parseInt(request.getParameter(\"yyyy\")); month = Integer.parseInt(request.getParameter(\"mm\")); } //年月選択リストを表示する out.println(\"<form method=\'POST\' action=\'Calendar2.jsp\'>\"); out.println(\"<table><tr><td>\"); //年 out.println(\"<select name=\'yyyy\'>\"); for (int i = 2000; i <= 2020; i++) { out.println(\"<option\"); if (i == year) { out.println(\" selected \"); } out.println(\">\" + i); } out.println(\"</select>年\"); //月 out.println(\"<select name=\'mm\'>\"); for (int i = 1; i <= 12; i++) { out.println(\"<option\"); if (i == month) { out.println(\" selected \"); } out.println(\">\" + i); } out.println(\"</select>月\"); out.println(\"</td>\"); out.println(\"<td><input type=\'submit\' value=\'更新\'></td>\"); out.println(\"</tr></table></form>\"); //カレンダーを表示する out.println(\"<table border=\'1\'>\"); out.println(\"<tr>\"); out.println(\"<td>日</td>\"); out.println(\"<td>月</td>\"); out.println(\"<td>火</td>\"); out.println(\"<td>水</td>\"); out.println(\"<td>木</td>\"); out.println(\"<td>金</td>\"); out.println(\"<td>土</td>\"); out.println(\"</tr>\"); //1日の曜日を取得する myCal.set(year, month - 1, 1); int dw1 = myCal.get(Calendar.DAY_OF_WEEK); //末日を取得する int lastd = myCal.getActualMaximum(Calendar.DAY_OF_MONTH); //表示する日付を初期化する int day = 0; //1日から末日まで日付を表示する 添付したcalendar.jspなのですが、ずばりココ↓の部分なのですが、 for (int i=0; i<=5; i++) { ここで最大は5以下になっているのですが、そうすると1列多くならないでしょうか。 これだと行数が6つになりますよね。 曜日のセルはその前に作っているので、曜日だけが入るのですから5行でいいと思うのですが、自分の考えは間違っているのでしょうか。 宜しくお願い致します。 for (int i = 0; i <= 5; i++) { if (day >= lastd) {break;} out.println(\"<tr>\"); for (int j = 0; j <= 6; j++) { day = i * 7 + j - dw1 + 2; if (day > lastd || day < 1) { out.println(\"<td> </td>\"); } else { out.println(\"<td>\" + day + \"</td>\"); } } out.println(\"</tr>\"); } out.println(\"</table>\"); %> </body> </html>

    • ベストアンサー
    • Java

専門家に質問してみよう