• ベストアンサー

javaで週の最初の日(例:月曜日)を求める事ができるのでしょうか?

javaで指定した日付の曜日を取得できたのですが、 (例:今日(2002/07/16)なら、「火」を取得) 指定した日の週の最初の日付を取得する事ができるのでしょうか? (例:今日(2002/07/16)なら、今週の月曜(2002/07/15)の日付を取得) もし、何か分かることがありましたら、ご教授お願い致します。

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

  • ベストアンサー
noname#16216
noname#16216
回答No.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の日曜日という結果になります。

takekun22
質問者

お礼

回答ありがとうございました。 返事が大変遅くなり申し訳ございません。 ># 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の日曜日という結果になりますよね。 今回は本当にどうもありがとうございました。 又何かありましたら、ご教授宜しくお願い致します。

その他の回答 (9)

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.9

> このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、 > これで週の先頭が月曜日になっているのでしょうか? はい。それでよいと思います。 > デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい > カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは > 特殊なカレンダーであり、そのカレンダーにおいてsetFirstDayOfWeek() で > 変更するのは目的にあっていると考えます。 読んでると、なんかそんな気がしてきました。 ところで、同じグレゴリア暦でも、 ヨーロッパとかでは週の最初の曜日が異なったりするので、 週の最初の曜日が異なる文化、というのは考えているほど例外的なものでは ないのだと思います。 ので、サブクラスとしてではなく、クラスの属性の一つとして、 週の最初の曜日というのが準備されているのだろう、と考えてました。 けれど、それは、コンストラクタに Locale をわたすことで、 ちゃんと設定してくれる、ということも考えると、 それでも敢えて setFirstDayOfWeek があるということは、 きっと spoony さんのおっしゃるとおりなんでしょう。

takekun22
質問者

お礼

回答ありがとうございました。 返事が大変遅くなり申し訳ございません。 >> このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、 >> これで週の先頭が月曜日になっているのでしょうか? >はい。それでよいと思います。 戻り値が2(= Calendar.MONDAY)になると週の先頭が月曜日になるのですね。解りました。 今回はどうもありがとうございました。 また何かありましたら、ご教授宜しくお願い致します。

noname#16216
noname#16216
回答No.8

> でも、setFirstDayOfWeek() は、 > 本来こういう使い方をするために存在するのではないと思います。 > 本当に、文化的に週の最初の曜日が異なる地域で利用するときに > 用いるべきだと思います。 これについては私は若干の別の考え方なので、一応アドバイスということで。。。 デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは 特殊なカレンダーであり、そのカレンダーにおいてsetFirstDayOfWeek() で 変更するのは目的にあっていると考えます。 # 本当に文化的に週の最初の曜日が異なるという場合、その地域専用の # カレンダーサブクラスを作成すべきで、そういう利用のみを想定していれば # publicではなくprotected指定して、外部からの変更を禁止すべきだと # 考えますが、どうでしょう?

takekun22
質問者

補足

回答どうもありがとうございます。 >デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい >カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは >特殊なカレンダーであり、そのカレンダーにおいて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日 となるようにしたいと考えています。 その為に月曜日を週の最初の日にしようと考えてます。

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.7

どうも。 週の最初の曜日は、setFirstDayOfWeek() すれば ちゃんと変更されると思います。 もう一度確認されてはどうでしょうか。 でも、setFirstDayOfWeek() は、 本来こういう使い方をするために存在するのではないと思います。 本当に、文化的に週の最初の曜日が異なる地域で利用するときに 用いるべきだと思います。 あと、add メソッドに関するAPIドキュメントの記述ですが、 一体何を言ってるのか私にはさっぱりわかりません。 これに関しては別件で質問したいと思いますので、 わかる方がいらしたら是非回答してください。

takekun22
質問者

補足

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

noname#16216
noname#16216
回答No.6

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)が返されるようですが、、、 どんなソースを記述したのでしょうか?

takekun22
質問者

補足

回答どうもありがとうございます。 >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日(日)が出力されると思っていました。 考え方が間違っていると思うのですが、どうしてよいかわかりませんので、 解る事がありましたらご教授お願い致します。

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.5

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()); でも、これでよいのかあまり自信がないです。 穴があったらだれか指摘してください。

takekun22
質問者

補足

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

noname#16216
noname#16216
回答No.4

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/util/Calendar.html
takekun22
質問者

補足

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

  • mrt136
  • ベストアンサー率35% (33/92)
回答No.3

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

takekun22
質問者

補足

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

  • mrt136
  • ベストアンサー率35% (33/92)
回答No.2

java.util.Date クラスの getTime() で ミリ秒が取得出来るので、 日付もミリ秒まで落とせば単純に引き算で出来ますよ。

takekun22
質問者

補足

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

  • mrt136
  • ベストアンサー率35% (33/92)
回答No.1

火曜日が取得出来るんなら、火曜日から月曜日を引いた値を、 今日の日付から引いてやれば月曜日の日付が取れるような。。。

takekun22
質問者

補足

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

関連するQ&A