マンガでよめる痔のこと・薬のこと

javaで指定した日付の曜日を取得できたのですが、
(例:今日(2002/07/16)なら、「火」を取得)
指定した日の週の最初の日付を取得する事ができるのでしょうか?
(例:今日(2002/07/16)なら、今週の月曜(2002/07/15)の日付を取得)

もし、何か分かることがありましたら、ご教授お願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (10件)

訂正です。



http://oshiete1.goo.ne.jp/kotaeru.php3?q=316650
に記述しましたが、No.6の回答に記述した

------
今のように1週間単位で日付を動かしている場合には影響はないでしょうが、例えば1月1日から13ヶ月動かすと、DAY_OF_WEEKやDAY_OF_YEARなど、不変式ではない小さいフィールドは調整されないようなので、この場合には注意が必要だと思いますが。。。
------
というのは、現状では的を外した指摘です。すみませんm(_ _)m
上記のURLでも記述しているように、getメソッドで値を取得する限り、
この条件は影響を受けないと思われます。。。

# addメソッドでカレンダーを移動するのが正しいです


> Calendar cal = new GregorianCalendar(2002, 8-1, 2);
> cal.setFirstDayOfWeek(Calendar.MONDAY);
> int week = cal.get(Calendar.DAY_OF_WEEK);    ←1
> cal.add(Calendar.DATE, Calendar.SUNDAY - week); ←2
> System.out.println(cal.getTime());
>
> このソースを実行しても、2002年7月28日(日)が出力されました。
> 自分のイメージでは2行目で、週の先頭を月曜にしたので、
> 日曜日は週の最後となり、2002年8月4日(日)が出力されると思っていました。
>
> 考え方が間違っていると思うのですが、どうしてよいかわかりませんので、
> 解る事がありましたらご教授お願い致します。


考え方として間違っているのは、1の場所です。
> int week = cal.get(Calendar.DAY_OF_WEEK);
としていますが、これはsetFirstDayOfWeek()で週の先頭を変更しても値は
変わりません。
というのは、週の先頭を変更しても当日(8/2)は金曜日だからです。

# setFirstDayOfWeekでは、あくまでも週の先頭となる値を指定された
# ものに変更するためのメソッドであり、カレンダー自体のフィールドを
# 再計算する(Calendar.MONDAY=1 に変更する)ようなものではないです。

このため、2つのコードのどちらでもweekには6(金曜日)が入ります。
こうなると、weekの値が同じなので2の位置でadd()によって計算された日付は
7/28の日曜日という結果になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

返事が大変遅くなり申し訳ございません。

># addメソッドでカレンダーを移動するのが正しいです
了解しました。


>> int week = cal.get(Calendar.DAY_OF_WEEK);
>としていますが、これはsetFirstDayOfWeek()で週の先頭を変更しても値は
>変わりません。
>というのは、週の先頭を変更しても当日(8/2)は金曜日だからです。
># setFirstDayOfWeekでは、あくまでも週の先頭となる値を指定された
># ものに変更するためのメソッドであり、カレンダー自体のフィールドを
># 再計算する(Calendar.MONDAY=1 に変更する)ようなものではないです。
週の先頭を変更してもカレンダー自体の再計算はされないのですね。
納得しました。

>このため、2つのコードのどちらでもweekには6(金曜日)が入ります。
>こうなると、weekの値が同じなので2の位置でadd()によって計算された日付は
>7/28の日曜日という結果になります。
確かに再計算されないのでしたら、そうですよね。7/28の日曜日という結果になりますよね。

今回は本当にどうもありがとうございました。

又何かありましたら、ご教授宜しくお願い致します。

お礼日時:2002/07/22 12:57

> このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、


> これで週の先頭が月曜日になっているのでしょうか?

はい。それでよいと思います。


> デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい
> カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは
> 特殊なカレンダーであり、そのカレンダーにおいてsetFirstDayOfWeek() で
> 変更するのは目的にあっていると考えます。

読んでると、なんかそんな気がしてきました。

ところで、同じグレゴリア暦でも、
ヨーロッパとかでは週の最初の曜日が異なったりするので、
週の最初の曜日が異なる文化、というのは考えているほど例外的なものでは
ないのだと思います。

ので、サブクラスとしてではなく、クラスの属性の一つとして、
週の最初の曜日というのが準備されているのだろう、と考えてました。

けれど、それは、コンストラクタに Locale をわたすことで、
ちゃんと設定してくれる、ということも考えると、
それでも敢えて setFirstDayOfWeek があるということは、
きっと spoony さんのおっしゃるとおりなんでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

返事が大変遅くなり申し訳ございません。

>> このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、
>> これで週の先頭が月曜日になっているのでしょうか?

>はい。それでよいと思います。
戻り値が2(= Calendar.MONDAY)になると週の先頭が月曜日になるのですね。解りました。

今回はどうもありがとうございました。
また何かありましたら、ご教授宜しくお願い致します。

お礼日時:2002/07/22 12:53

> でも、setFirstDayOfWeek() は、


> 本来こういう使い方をするために存在するのではないと思います。
> 本当に、文化的に週の最初の曜日が異なる地域で利用するときに
> 用いるべきだと思います。

これについては私は若干の別の考え方なので、一応アドバイスということで。。。

デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい
カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは
特殊なカレンダーであり、そのカレンダーにおいてsetFirstDayOfWeek() で
変更するのは目的にあっていると考えます。

# 本当に文化的に週の最初の曜日が異なるという場合、その地域専用の
# カレンダーサブクラスを作成すべきで、そういう利用のみを想定していれば
# publicではなくprotected指定して、外部からの変更を禁止すべきだと
# 考えますが、どうでしょう?

この回答への補足

回答どうもありがとうございます。

>デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい
>カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは
>特殊なカレンダーであり、そのカレンダーにおいてsetFirstDayOfWeek() で
>変更するのは目的にあっていると考えます。
正にそうです。月曜日を週の先頭としてカレンダーを作成しようと考えています。
その際に例えば、2002年8月2日(金)を指定した時に、
月曜日を取得すると、2002年7月29日
火曜日を取得すると、2002年7月30日
水曜日を取得すると、2002年7月31日
木曜日を取得すると、2002年8月1日
金曜日を取得すると、2002年8月2日
土曜日を取得すると、2002年8月3日
日曜日を取得すると、2002年8月4日
となるようにしたいと考えています。
その為に月曜日を週の最初の日にしようと考えてます。

補足日時:2002/07/18 09:51
    • good
    • 0

どうも。



週の最初の曜日は、setFirstDayOfWeek() すれば
ちゃんと変更されると思います。
もう一度確認されてはどうでしょうか。

でも、setFirstDayOfWeek() は、
本来こういう使い方をするために存在するのではないと思います。
本当に、文化的に週の最初の曜日が異なる地域で利用するときに
用いるべきだと思います。


あと、add メソッドに関するAPIドキュメントの記述ですが、
一体何を言ってるのか私にはさっぱりわかりません。
これに関しては別件で質問したいと思いますので、
わかる方がいらしたら是非回答してください。

この回答への補足

回答どうもありがとうございます。

>週の最初の曜日は、setFirstDayOfWeek() すれば
>ちゃんと変更されると思います。
>もう一度確認されてはどうでしょうか。
------------------------------------------------------
Calendar cal = new GregorianCalendar(2002, 8-1, 2);
cal.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println(cal.getFirstDayOfWeek());
------------------------------------------------------
このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、
これで週の先頭が月曜日になっているのでしょうか?

補足日時:2002/07/18 09:58
    • good
    • 0

Harry_さんのおっしゃる通りですね。


add メソッドなら問題ないです。

> でも、これでよいのかあまり自信がないです。
> 穴があったらだれか指摘してください。

気になるのは、javadoc に記述されている
----
 Add rule 2
 小さいフィールドが不変式であると予想される場合に、フィールド f が変更されてから
 最小値または最大値が変更されたために、その前の値と等しくならないと、フィールドの
 値はその予想される値にできるだけ近くなるように調整されます。小さいフィールドは、
 小さい時間の単位を表します。HOUR は、DAY_OF_MONTH よりも小さいフィールドです。
 不変式ではないと予想される小さいフィールドは、調整されません。カレンダシステムでは、
 不変式であると予想されるフィールドが判断されます。
----

となっているところですかね。
今のように1週間単位で日付を動かしている場合には影響はないでしょうが、例えば1月1日から13ヶ月動かすと、DAY_OF_WEEKやDAY_OF_YEARなど、不変式ではない小さいフィールドは調整されないようなので、この場合には注意が必要だと思いますが。。。

> Calendar.MONDAYを指定したのですが、うまくいきませんでした。
> 週の先頭を変えることはできるのでしょうか?

System.out.println(cal.setFirstDayOfWeek(Calendar.MONDAY));
としたところ、2(= Calendar.MONDAY)が返されるようですが、、、
どんなソースを記述したのでしょうか?

この回答への補足

回答どうもありがとうございます。

>System.out.println(cal.setFirstDayOfWeek(Calendar.MONDAY));
>としたところ、2(= Calendar.MONDAY)が返されるようですが、、、
Calendar cal = new GregorianCalendar(2002, 8-1, 2);
cal.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println(cal.getFirstDayOfWeek());
このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、
自分のイメージと違いました。



自分的には
Harry_さんのサンプルソースだと、日曜日が週の先頭なので、
例えば2002年8月2日(金)を指定すると、日曜日を取得する場合は
------------------------------------
Calendar cal = new GregorianCalendar(2002, 8-1, 2);
int week = cal.get(Calendar.DAY_OF_WEEK);
cal.add(Calendar.DATE, Calendar.SUNDAY - week);
System.out.println(cal.getTime());
------------------------------------
とすると2002年7月28日(日)が出力され、正しい結果になりました。


そこで都合上、週の先頭を日曜日から月曜日に変えようと思い、
以下のソースを組みました。
------------------------------------
Calendar cal = new GregorianCalendar(2002, 8-1, 2);
cal.setFirstDayOfWeek(Calendar.MONDAY);
int week = cal.get(Calendar.DAY_OF_WEEK);
cal.add(Calendar.DATE, Calendar.SUNDAY - week);
System.out.println(cal.getTime());
------------------------------------
このソースを実行しても、2002年7月28日(日)が出力されました。
自分のイメージでは2行目で、週の先頭を月曜にしたので、
日曜日は週の最後となり、2002年8月4日(日)が出力されると思っていました。

考え方が間違っていると思うのですが、どうしてよいかわかりませんので、
解る事がありましたらご教授お願い致します。

補足日時:2002/07/18 09:33
    • good
    • 0

add メソッドならずれないですよ。



 Calendar cal = new GregorianCalendar(2002, Calendar.JANUARY, 1);
 int week = cal.get(Calendar.DAY_OF_WEEK);

 System.out.println(cal.getTime());

 cal.add(Calendar.DATE, Calendar.MONDAY - week);
 //cal.roll(Calendar.DATE, Calendar.MONDAY - week);

 System.out.println(cal.getTime());


でも、これでよいのかあまり自信がないです。
穴があったらだれか指摘してください。

この回答への補足

回答どうもありがとうございます。

記載して下さったサンプルソースは大変参考になりました。

一つ気になった部分があるのですが、
デフォルトで日本の週の先頭は「日曜日」となっているらしいのですが、
例えば「月曜日」というように週の先頭を変えることはできるのでしょうか?
週の最初の日が何であるかを設定するCalendarクラスの
setFirstDayOfWeek(int value)メソッドの引数のvalueに
Calendar.MONDAYを指定したのですが、うまくいきませんでした。

週の先頭を変えることはできるのでしょうか?

補足日時:2002/07/17 16:06
    • good
    • 0

mrt136さんの回答でもできそうですが、java.util.Calendarクラスを使えば、もう少し簡単にできます。

。。

コードとしてはこんな感じでしょうか。。。

----
 Calendar now = Calendar.getInstance();
 now.setTimeInMillis(System.currentTimeMillis());

 // 週の先頭の曜日(日曜日が1、土曜日が7)
 int first_date_of_week = now.getFirstDayOfWeek();
 // 今日の曜日
 int now_date_of_week = now.get(Calendar.DAY_OF_WEEK);

 // 週の先頭まで日付をずらす
 now.roll(Calendar.DAY_OF_YEAR,
      first_date_of_week - now_date_of_week);

 // 週の先頭の日付を取得する
 int first_date = now.get(Calendar.DATE);
----

ただし、この方法には若干の注意が必要です。

参考URLに示したJavadocにも記述されていますが、roll()では、指定されたフィールド(今の場合は1年の何日目 = Calendar.DAY_OF_YEAR)の値しか変更してくれません。
これは、年をまたぐ(週の先頭が去年)の場合には、年がずれてしまうことを意味します。
また、その前に現在の曜日と週の先頭の曜日を取得して、その差分だけ日付を移動させていますが、週の先頭は日本では「日曜日」です。


この辺は、適宜補正する必要がありますね。。。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …

この回答への補足

回答どうもありがとうございます。

一つ気になった部分があるのですが、
>週の先頭は日本では「日曜日」です。
この部分は、例えば週の先頭を日本では「日曜日」となっていますが、
「月曜日」というように、週の先頭を変えることはできるのでしょうか?
週の最初の日が何であるかを設定するCalendarクラスの
setFirstDayOfWeek(int value)メソッドの引数のvalueに
Calendar.MONDAYを指定したのですが、うまくいきませんでした。

週の先頭を変えることはできるのでしょうか?

補足日時:2002/07/17 16:00
    • good
    • 0

指定した曜日が取得できているのなら、月曜日からの日差は取得出来るんじゃないですか?


そしたら、
月曜日からの日数×1000×60×60×24
で、日差分のミリ秒が取得出来ますね?
それを、指定日のミリ秒から引き算すれば取得したい日のミリ秒が取得出来ますね?
そして、それを、本来の日付に戻してやればよいのです。
まぁ、他にもやり方はあるでしょうが。。。
一つの方法としての提案です。

この回答への補足

回答ありがとうございます。

>月曜日からの日数×1000×60×60×24
>で、日差分のミリ秒が取得出来ますね?
>それを、指定日のミリ秒から引き算すれば取得したい日のミリ秒が取得出来ます
>ね?
>そして、それを、本来の日付に戻してやればよいのです。
わざわざやり方をご教授頂きありがとうございます。

参考にさせて頂きます。

補足日時:2002/07/17 16:09
    • good
    • 0

java.util.Date クラスの getTime() で ミリ秒が取得出来るので、


日付もミリ秒まで落とせば単純に引き算で出来ますよ。

この回答への補足

回答ありがとうございます。

>java.util.Date クラスの getTime() で ミリ秒が取得出来るので、
>日付もミリ秒まで落とせば単純に引き算で出来ますよ。
8月2日(金)と7月29日(月)というように差分対象日付を予め設定していれば、
ミリ秒まで取得して引き算をすると、日数差「4」という正しい数値は
得られたのですが、

例えば、差分対象日付の8月2日(金)のみの情報で、
7月29日(月)という情報を取得する方法はないのでしょうか?

補足日時:2002/07/16 20:35
    • good
    • 0

火曜日が取得出来るんなら、火曜日から月曜日を引いた値を、


今日の日付から引いてやれば月曜日の日付が取れるような。。。

この回答への補足

>火曜日が取得出来るんなら、火曜日から月曜日を引いた値を、
>今日の日付から引いてやれば月曜日の日付が取れるような。。。
確かにこのやり方でも月曜の日付が取れるのですが、
例えば、今年の8月2日(金)の週の月曜(7月29日)を求めるとなると、
引き算だけでは難しいので、うまいやり方はないでしょうか?

補足日時:2002/07/16 19:32
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjava.util.Calendar クラスの add メソッドについて

APIドキュメントの Calendar クラスの解説のところに、

//------------------------------------------------------------------

Add rule 2。小さいフィールドが不変式であると予想される場合に、フィールド f が変更されてから最小値または最大値が変更されたために、その前の値と等しくならないと、フィールドの値はその予想される値にできるだけ近くなるように調整されます。小さいフィールドは、小さい時間の単位を表します。HOUR は、DAY_OF_MONTH よりも小さいフィールドです。不変式ではないと予想される小さいフィールドは、調整されません。カレンダシステムでは、不変式であると予想されるフィールドが判断されます。

//------------------------------------------------------------------

という記述がありますが、何のことかさっぱりわかりません。
いろいろ試しましたが、add メソッドが直感に反する振舞いをすることは
ありませんでした。

こういうコードを書くと、add メソッドが変な動きをするよ、というのが
あったら教えてください。

APIドキュメントの Calendar クラスの解説のところに、

//------------------------------------------------------------------

Add rule 2。小さいフィールドが不変式であると予想される場合に、フィールド f が変更されてから最小値または最大値が変更されたために、その前の値と等しくならないと、フィールドの値はその予想される値にできるだけ近くなるように調整されます。小さいフィールドは、小さい時間の単位を表します。HOUR は、DAY_OF_MONTH よりも小さいフィールドです。不変式ではないと予...続きを読む

Aベストアンサー

> 不変式ではないと予想される小さいフィールドは、調整されません。
>
> という一文があるのが気になってます。
> 調整されない、というのはどういうことで、
> 具体的にどういうときに起こるものなんでしょうか。
> それとも何か、考え方が根本的に間違ってるんでしょうか。

javadocにあるとおり、addメソッドで月を変更しても、より小さい不変式ではないと予想されるフィールド(DAY_OF_YEARやDAY_OF_WEEK)が再計算されないことを意味します。

ここで問題になるのが、Calendarクラスのgetメソッドです。
(GregorianCalendarはオーバーライドしていないので同じもの)

addメソッドの中では不変式フィールド(YEARやMONTHなど)については再計算していますが、不変式ではないDAY_OF_WEEKなどは再計算されていません。
が、実際はgetメソッドの中でこれらの値を補正するための関数(abstract指定されているので、実際はGregorianCalendarの中の関数)で補正しなおしています。

> いろいろ試しましたが、add メソッドが直感に反する振舞いをすることは
> ありませんでした。

上記のような理由から、getメソッドが呼ばれると自動的に補正されます。


このため、例えば以下のようなソースを記述します。

import java.util.GregorianCalendar;
public class CalendarDemo extends GregorianCalendar {

 public CalendarDemo(int year, int month, int day) {
  super(year, month, day);
 }
 public int myGet(int field) {
  return internalGet(field);
 }
}

このクラスでは、フィールドの値を取得するときに、補正を行わずに取得します。そして、addメソッドで月のフィールドに値を加算し、myGetメソッドでDAY_OF_YEARなどを取得すると、見事に補正されない値が返されているのが分かります。。。

public void met() {
 CalendarDemo cal = new CalendarDemo(2001, 0, 1);
 GregorianCalendar cal2 = new GregorianCalendar(2001, 0, 1);

 cal.add(Calendar.MONTH, 9);
 cal2.add(Calendar.MONTH, 9);

 System.out.println( "DAY_OF_YEAR(Demo) : " + cal.myGet(Calendar.DAY_OF_YEAR) );
 System.out.println( "DAY_OF_YEAR(Greg) : " + cal2.get( Calendar.DAY_OF_YEAR ) );
 System.out.println( "DATE(Demo) : " + cal.myGet(Calendar.DATE) );
 System.out.println( "DATE : " + cal2.get( Calendar.DATE ) );
 System.out.println( "CalendarDemo = " + cal.getTime().toString() );
 System.out.println( "GregorianCalendar = " + cal2.getTime().toString() );
}


Calendarクラスを利用するプログラムでは、getメソッドを使わずにフィールドにアクセスすることは不可能(フィールドがprotected intだから)なので問題になることはないようです。
ただし、サブクラスを作るような場合には、上記の条件の影響を受ける可能性がありますので、注意が必要ということになります。

> 不変式ではないと予想される小さいフィールドは、調整されません。
>
> という一文があるのが気になってます。
> 調整されない、というのはどういうことで、
> 具体的にどういうときに起こるものなんでしょうか。
> それとも何か、考え方が根本的に間違ってるんでしょうか。

javadocにあるとおり、addメソッドで月を変更しても、より小さい不変式ではないと予想されるフィールド(DAY_OF_YEARやDAY_OF_WEEK)が再計算されないことを意味します。

ここで問題になるのが、Calendarクラスのgetメソ...続きを読む

Q週単位の日付の加算

すみませんが、どなたか教えて下さい。

日付の加算を4週間後、というような日付の加算をしたいのですが、
28日や31日の月があった場合、ずれてしまいます。
どのようにしたら正確なカレンダー通り加算ができるでしょうか?
「20060404」の結果が欲しいが下記だと、「20060405」となってしまう。

Calendar cal = Calendar.getInstance();
cal.set(2006,3,7);
int plus = 7*4; //7日×4週間
cal.add(Calendar.DATE, plus);

Aベストアンサー

4週後なら、日付に変換しなくても、以下の引数で計算できます。

cal.add(Calendar.WEEK_OF_YEAR, 4);

Calendar.WEEK_OF_YEARは、addで利用する場合、1週間単位というパラメータとして利用出来ます。
他の単位もAPIに載っているので参考にして下さい。

参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Calendar.html

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

QJavaで年月の取得(YYYYMM形式で)

Javaで“前月”の年月(YYYYMM形式)を取得するロジックを組んだのですが、
以下のコードを実行すると、前月の月が1桁の場合に、「YYYYM」(5桁)の形式になってしまいます。
(元がintなので当然かも知れませんが。)

Calendar calendar = Calendar.getInstance();
String yearMonth =
String.valueOf(calendar.get(Calendar.YEAR)) + String.valueOf(calendar.get(Calendar.MONTH) - 2);

こちら、解決する方法はありますでしょうか?
※他に気掛かりな点としては、2012年の1月に実行した時に、正しく「201112」を返してくれるか、というのもあります。

また、別の実装方法として、以下の場合は「YYYYMM形式」で取得出来るのですが、
“前月”に変換する方法が分かりませんでした。。。

Calendar calendar = Calendar.getInstance();
String yearMonth2 =
new SimpleDateFormat("yyyyMM").format(calendar.getTime());


ロジックはシンプルである方が助かります。
分かる方、教えて下さい!

Javaで“前月”の年月(YYYYMM形式)を取得するロジックを組んだのですが、
以下のコードを実行すると、前月の月が1桁の場合に、「YYYYM」(5桁)の形式になってしまいます。
(元がintなので当然かも知れませんが。)

Calendar calendar = Calendar.getInstance();
String yearMonth =
String.valueOf(calendar.get(Calendar.YEAR)) + String.valueOf(calendar.get(Calendar.MONTH) - 2);

こちら、解決する方法はありますでしょうか?
※他に気掛かりな点としては、2012年の1月に実行した時に、正しく「201112」を返して...続きを読む

Aベストアンサー

Calendar calendar = Calendar.getInstance();
calendar.add( Calendar.MONTH, -1 );
String lastMonth = new SimpleDateFormat( "yyyyMM" ).format( calendar.getTime() );

Javaの開発をするなら、Javadoc くらい読めるようになりましょうね。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q文字列を日付に変換でParseException

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(8,10);
sgndate = DateFormat.getDateInstance().parse(lstdaysgn); ・・・・・・・・・ここでエラー発生
}

どこが悪いのか解りません。
よろしくご教授ください。

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(...続きを読む

Aベストアンサー

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろん後続のルーチンでnullチェックは要るようになる。
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
// ↓これもしない。
// lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
//                              lstdaysgn.substring(8,10);
sgndate = new SimpleDateFormat("yyyyMMdd").parse(lstdaysgn); // スラッシュつけずに8桁のyyyyMMddでそのままDateにする。
}

以上の手直しにより、このルーチンを通る際にDate 1つとString 7つ、インスタンスの生成を回避する事ができる。これがループで処理されるならなおさら。
仮に、「new SimpleDateFormat("yyyyMMdd")だとパースのたびにSimpleDateFormatのインスタンスが作られちゃうジャン!」と思うならルーチン化していいと思うけど、その場合はスレッドセーフなルーチンにしないといけないのでそこらへん注意の事。

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろ...続きを読む

Q「eclipseで作るカレンダー(スケジュール管理画面)」

「eclipseで作るカレンダー(スケジュール管理画面)」

こんばんは。現在、eclipseでカレンダーを作りたいと思っております。また、一目でその月のスケジュールがわかるようにし、日付をクリックするとその日のスケジュールの詳細を表示できるようにしたいと思っております。カレンダーは1カ月ごとに日付を表示し、左右のボタンを押すと前の月、次の月に移動するものにしたいと思っております。

インターネット上でカレンダーの作り方を調べても全くわかりません。コマンドプロンプト上でカレンダーを表示するものしかないのです。そうではなくて、私はアプリケーションに以上の機能を持ったカレンダーを作りたいのです。どうやって作ったらいいのか、教えてください。私はjavaはまだまだ初心者ですが、よろしくお願い致します。

※なお、別の質問カテゴリーに同様の質問がございますが、ご回答を確実に頂くためにこちらのカテゴリーからも質問させていただきました。

Aベストアンサー

参考URLにあるような感じでしょうか?
自分もまだまだ初心者なので技術的なことは教えれませんが・・・・

参考URL:http://www.javadrive.jp/servlet/schedule/

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

QDate型オブジェクトから日付のみ取得し、Integer型にしたい

Date型のオブジェクトから日付(ddの部分)を取得し、
その取得した日付をInteger型に変換して、Integerオブジェクトに入れたいのですが・・
うまく説明できないですが、例えば
「2002/8/12」の値を持つDate型オブジェクトから、
日付の「12」を取得し、Integer型オブジェクトに入れる→new Integer(12);
という事をしたいんです。

Date型オブジェクトから日付のみ取得する方法を
ご存知の方、教えて下さい。

Aベストアンサー

No1の回答に対してレスします。

その方法は、やるべきではありません。
現在はそのやり方で問題ないかもしれませんが、toString()型は今後のJDKバージョンアップで同じ値が返される保証がありません。

詳しくはJAVADOC Calendar型


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング