- ベストアンサー
java.util.Calendar クラスの add メソッドについて
APIドキュメントの Calendar クラスの解説のところに、 //------------------------------------------------------------------ Add rule 2。小さいフィールドが不変式であると予想される場合に、フィールド f が変更されてから最小値または最大値が変更されたために、その前の値と等しくならないと、フィールドの値はその予想される値にできるだけ近くなるように調整されます。小さいフィールドは、小さい時間の単位を表します。HOUR は、DAY_OF_MONTH よりも小さいフィールドです。不変式ではないと予想される小さいフィールドは、調整されません。カレンダシステムでは、不変式であると予想されるフィールドが判断されます。 //------------------------------------------------------------------ という記述がありますが、何のことかさっぱりわかりません。 いろいろ試しましたが、add メソッドが直感に反する振舞いをすることは ありませんでした。 こういうコードを書くと、add メソッドが変な動きをするよ、というのが あったら教えてください。
- みんなの回答 (3)
- 専門家の回答
関連するQ&A
- Stringクラスのlengthメソッドについて
こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。
- 締切済み
- Java
- Calendarクラスについて
java勉強中の初心者です。 現在、カレンダークラスの勉強をしています。 いろいろ試しているのですが、お聞きしたいこと があります。 末日を取得するgetActualMaximumメソッドですが Calendar cl = Calendar.getInstance(); int lastDay = cl.getActualMaximum(Calendar.DATE); でその月の末日を取得できることがわかりましたが 応用で、1年間の(1月~12月)すべてを取得するときに -------------------------------------------------- Calendar cl = Calendar.getInstance(); for(int n = 1; n<=12; n++){ cl.set(2005,12+n,1); cl.add(Calendar.DAY_OF_MONTH,1); cl.set(cl.get(Calendar.YEAR),cl.get(Calendar.MONTH),cl.getActualMaximum(Calendar.DATE)); System.out.println(cl.get(Calendar.YEAR) +"年"+ cl.get(Calendar.MONTH ) + "月"+ cl.getActualMaximum(Calendar.DATE) +"日"); } } } ------------------------------------------------- 月は「0」から始まるということは理解できたのですが これだと実行結果が 2006年1月28日 2006年2月31日 2006年3月30日 2006年4月31日 2006年5月30日 2006年6月31日 2006年7月31日 2006年8月30日 2006年9月31日 2006年10月30日 2006年11月31日 2007年0月31日 ---------------------------------------------- となってしまうのですが、一番初めが2月の 末日を取得してしまっているのはわかっているのですが どこを直せばよいのかわかりません。 ご教授お願いできますか? よろしくお願いいたします。
- ベストアンサー
- Java
- java.util.CalendarでのgetTime結果
お世話になります。 カレンダークラスを使用してDBへ格納するためのシリアル値を取得しようとしています。 やりたいことは任意の年月日(時分秒は無し)をPostgreSqlのDATEフィールドに日付として格納させ、レコード取得した結果の該当DATEフィールドと先ほどの任意の年月日を比較させたいのです。予想される結果は「一致」なのですがこれが不一致となってしまいます。 例えばjava.util.CalenderクラスのgetTime()を使用して取得されるシリアル値は1174611700734ですが、DBへ格納された後にレコードから取得されるデータは1174575600000となっていて比較しても不一致となってしまいます。 java.util.CalenderのgetTime()結果は実行するたびに値が異なるようで、下3桁が上記例のように"734"だったり"015"だったりします。 getTime()の結果で返されるシリアル値の下3桁を"000"とする方法はあるのでしょうか? java.util.Calendar xcal = java.util.Calendar.getInstance(); xcal.set(2007, 3 - 1, 23, 0, 0, 0); java.util.Date xday = xcal.getTime(); #xdayには"1174575600015"と格納されています。 #xdayをそのままPostgreSqlへデータ投入すると、日付のみ格納され次回取得時には"1174575600000"となります。
- ベストアンサー
- Java
- Calendarオブジェクトにタイムゾーンの設定
Calendarクラスで不思議に思ったことがあったので質問させてください。 下記サンプルのようにCalendarオブジェクトに対してタイムゾーンを設定しました。 表示1ではGMTタイム(9時間前の時間)が表示。 表示2では現在の時刻(設定したタイムゾーンを無視) して表示されてしまいます。これは仕様でしょうか。 JavaDocのなかで下記記述を見つけたのですがこの記述と関係ありますでしょうか。 いまいち文章が難解でよくわからないのですがgetメソッドなら計算した値 (この場合、タイムゾーンを反映して計算した値)を返しますよ と言っているのかなと 思ったのですが違いますでしょうか。 【JavaDocの記述】 「カレンダフィールド値は、set メソッドを呼び出して設定できます。 Calendar 内で設定されたフィールド値はすべて、その時間値 (「元期」からのミリ秒) または カレンダフィールドの値を計算する必要が生じるまで解釈されません。 get、getTimeInMillis、getTime、add、および roll の呼び出しでは、この種の計算が行われます。」 【サンプル】 Calendar cal = Calendar.getInstance(); cal.setTimeZone(TimeZone.getTimeZone("GMT")); //表示1 System.out.println(cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND)); //表示2 System.out.println(cal.getTime().toString());
- 締切済み
- Java
- java コマンドライン引数を利用したカレンダー
args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________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 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE); /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }
- ベストアンサー
- Java
- Calendarクラスのフィールドは、クラス変数?インスタンス変数?どちらですか?
宜しくお願いします。 Calendarクラスのフィールドの、Calendar.YEARなどは、 Calendarというクラス名で修飾されているので「クラス変数」ですよね。 クラス変数なので、全てのインスタンスで共有されているはずです。 なので、あるインスタンスから、Calendar.YEARに変更を加えると、全てのインスタンスに 変更が適用されると思うのですが、そうなりません。何故でしょうか。 例えば以下のようなコードを書いた場合、このように出力されます。 2008年10月6日 2009年10月6日 2008年10月6日 YEARはクラス変数なので、3つ目の出力も2009年になると思ったのですが、YEARは 各インスタンスで所有されているようです。 (上手くインデントできないようでして、読みにくいコードで失礼します) import java.util.*; public class DateTest { public static void main(String[]args){ Calendar cal = Calendar.getInstance(); showDate(cal); Calendar cal2 = Calendar.getInstance(); cal2.add(Calendar.YEAR, 1);//ここでCalendarのクラス変数を変更している showDate(cal2);//変更が適用されている showDate(cal);//変更が適用されていない?なぜ? } //Calendarインスタンスの年・月・日を出力する public static void showDate(Calendar cal){ System.out.println(cal.get(Calendar.YEAR)+"年" +(cal.get(Calendar.MONTH)+1)+"月" +cal.get(Calendar.DATE)+"日"); } } プログラムは嘘をつかないので、自分の理解が誤っていると思います。 どなたか解決する知識をお持ちの方、どうぞご教示ください。 (初心者ですので、できれば、ほどほどのレベルの説明でお願いします。) 宜しくお願いします。
- 締切済み
- 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
- Java CDLC 1.0 での日付計算
CLDC(携帯向けJava)での日付計算がうまくいきません。 JavaのSEでは、Calender.addなる日付計算関数があるようですが、 CLDC(携帯向けJava)では使えないみたいなので、以下の実験コードを 書いてみました。しかし、意図する結果が得られませんでした。 このケースでのよい計算方法をご存知でしたらご教授 頂ければうれしく思います。または、 以下のプログラムのバグ、ポカアホミス、作法的要修正点、 日付計算仕様的な可能/不可能等お気づきありましたら、 ご指摘頂ければ嬉しいです。 尚、意図した結果とは、下記の★部分において、 1970年1月1日(?曜日) 0:1:0 です。 グリニッジ標準時 1970 年 1 月 1 日 0:00:00 (エポック) からの 経過時間が、60000ミリ秒(60秒) というのを期待しました。 --以下コード-- void print_cal(Calendar cal){ String WEEK=" 日月火水木金土"; int year =cal.get(Calendar.YEAR); int month =cal.get(Calendar.MONTH)+1; int day_of_month=cal.get(Calendar.DAY_OF_MONTH); int day_of_week =cal.get(Calendar.DAY_OF_WEEK); int hour =cal.get(Calendar.HOUR_OF_DAY); int minute =cal.get(Calendar.MINUTE); int second =cal.get(Calendar.SECOND); System.out.println("" + year + "/" + month + "/" + day_of_month + "(" + WEEK.charAt(day_of_week) + ") " + hour + ":" + minute + ":" + second); } Calendar cal = Calendar.getInstance(); long now = cal.getTime().getTime(); print_cal(cal); cal.set(Calendar.YEAR, 2007); cal.set(Calendar.MONTH, Calendar.MAY); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 12); cal.set(Calendar.SECOND, 44); print_cal(cal); //<---- 2007/5/31(木) 6:12:44 long time1 = cal.getTime().getTime(); cal.set(Calendar.YEAR, 2007); cal.set(Calendar.MONTH, Calendar.MAY); cal.set(Calendar.DAY_OF_MONTH, 31); cal.set(Calendar.HOUR_OF_DAY, 6); cal.set(Calendar.MINUTE, 13); cal.set(Calendar.SECOND, 44); long time2 = cal.getTime().getTime(); print_cal(cal); //<------ 2007/5/31(木) 6:13:44 long sabun = time2 - time1; //<---- 60000 Date hoge = new Date(sabun); long hoge_time = hoge.getTime(); System.out.println(hoge_time); <--- 60000 //setTime: Calendar の現在の時刻を、指定された Date に。 cal.setTime(hoge); //★この時点でprint_cal。 print_cal(cal); <---- 1970/1/1(木) 9:1:0 ?9時間も経ってる? long now2 = cal.getTime().getTime(); System.out.println("now2: " + now2); <--- 60000。でも60秒がはいってるぽい --コード以上--
- ベストアンサー
- Java
- JAVAサーブレットプログラミングで質問
Javaの開発環境: J2SDK、Tomcat3.3.1を使用しています。 ***プログラミング内容*** import java.io.*; import java.util.*; import java.text.*; import javax.servlet.*; import javax.servlet.http.*; public class MyDate extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException{ response.setContentType("text/html; charset=SJIS"); Calendar cdr = Calendar.getInstance(); //現在の時間を取得 int year = cdr.get(Calendar.YEAR); //年(西暦) int month = cdr.get(Calendar.MONTH) + 1; //月 int date = cdr.get(Calendar.DATE); //日 int hour = cdr.get(Calendar.HOUR); //時間 int minute = cdr.get(Calendar.MINUTE); //分 int second = cdr.get(Calendar.SECOND); //秒 PrintWriter pw = response.getWriter(); pw.println("<html><body>今日は" + year + "年" + month + "月"+ date + "日(" + ★ + ")曜日です<br>\n" + "時間は" + hour + "時" + minute + "分" + second + 秒です</body></html>\n");}} といった内容で、取得したい値は日付と時間を取得するプログラミングなんですが、曜日の取得の方法を教えてもらえないでしょうか?取得した日付と時間の表示方法は、 日付: 2002年10月12日 時間: PM8時18分41秒です… といった感じを目指しています。
- ベストアンサー
- Java
- C# List<>が表示されない
C# List<>が表示されない Visual Studio にて作成 lblCalendar = new List<Label>(); for (int iAllCount = 0; iAllCount < 42; iAllCount++) { lblCalendar.Add(new Label()); } // ptbCalendar = new List<PictureBox>(); for (int iAllCount = 0; iAllCount < 42; iAllCount++) { ptbCalendar.Add(new PictureBox()); } // ptbCalendar[ptCalendar].BackColor = Color.FromArgb(100, 255, 255, 255); それぞれ42個生成しました。 それをカレンダーメソッドを作って画面に表示させました。 ピクチャーはColor.FromArgb(100, 255, 255, 255)で透過させました。 最初の画面(現在だと2月の画面が最初)は正常にカレンダーが表示されピクチャーは隠れています。 ですが private void button1_Click(object sender, EventArgs e) { month--; if (month == 0) { year = year - 1 month = 12; } CaledarControl(year, month);//カレンダー用のメソッド ptbControl(); //ピクチャー用のメソッド this.Refresh(); } これで次の月のページに飛ぶとカレンダーが全部消えてしまい、隠れていたピクチャーがすべてでてしまいます。 どうすればこのバグがなくなりますか?
- 締切済み
- その他(プログラミング・開発)
お礼
回答ありがとうございます。 とてもよくわかりました。 Calendarクラス、本格的に使う機会があるかわかりませんが、 この一連のQAはかなり勉強になりました。 また質問したときはよろしくおねがいします。