• ベストアンサー

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

  • 週の始まりは、日曜日それとも月曜日?

    常識をお聞きするようでお恥ずかしいのですが..... よく「今週の○○曜日」という言い方をしますが、週の始まりは日曜日なのでしょうか、それとも月曜日なのでしょうか。 私は、カレンダーを見ると日曜日から始まっているため、週の始まりは日曜日だと思っていますが、それで正しいでしょうか。

  • Calendarクラスを使って次の週の月曜日を知りたい

    Calendarクラスを使い、現在日付を取得するところまではよいのですが、その日について、次の週の月曜の日付を知りたいのですが、どのようにすればよいかわかりません。 ぜひ教えてください。お願い致します。

  • 第1月曜日は第1週の月曜日かその月の最初の月曜日か

    皆さんに一般論的、社会通念的なところもからめて伺いたいのですが,第1月曜日、第2月曜日といった言葉の「第1、第2」というのは、 「カレンダー上の第1週の月曜日」でしょうか、 それとも「その月の最初の月曜日」なんでしょうか? 今月4月はキレイに日曜頭の1日始まりで誰の目にも4月2日が第1月曜日ですが、翌5月をみると、火曜日1日はじまりです。こういった場合、第1月曜日は「5月7日」であると考える人はいないのでしょうか? 理美容関係の業種等、「その月の最初の月曜日」を「第1月曜日」としてないかなぁと・・・。

    • ベストアンサー
    • Perl
  • ACCESS2000で今週の月曜日を取得する方法

    ACCESS2000で例えば今日が水曜だとすると 今週の月曜は何日かを取得する方法が わかりません。 どなたかご存知ならご教授願います。

  • ロシアで週の始まりが月曜日なのは何故?

    週の始まりが日曜日とされているのは、ユダヤ教来歴だといわれていて、キリスト教国でも一般には日曜日が週の始まりとされています(例えば↓)。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1110496641 日本の曜日呼称は、その意訳だと思うので、日本で週の始まりがいつであるかは、文化的にはあまり関係がないと思います(←これ、間違ってたら、ご指摘ください)が、キリスト教国であるはずのロシアで、月曜日“понедельник”が週の始めであるとされているのは何故なのでしょう? また、中国でも、月曜日のことを、週の始めっぽい“星期一”と言ってますが、やはり週の始めは月曜日からという感じなのでしょうか?

  • 第一月曜日

    すみません! いまさらなんですが…質問させてください。 第一月曜日というのは、月の第一週めの月曜日のこと ですか? それとも 初めの月曜日が2週目にあっても 一番最初の月曜日という意味で、第一月曜日なのでしょうか? たとえば先月 5月の4日(月曜日)は、第一月曜日なのでしょうか、 それとも第2月曜日?? 恥ずかしながら、毎月の紙ごみが第一第三月曜日と決まって いるのですが、よく分からず牛乳パックがこれでもかと、 たまっています。 いまさらなのですが、よろしくお願いします。

  • 月曜日の笑っていいとも

    月曜日のレギュラーの岸田健作さんが先週も今週もでていなかったんですが、なぜでしょうか?昨日は最初から最後まで見ていたのですが、先週は最初の辺はあまり見ていませんでした。そのときに出演者の人たちは何かいっていましたか?教えてください。

  • 月曜日はムーンデイ?

    英語の曜日の話になります、  とても気になるのですが、土曜、日曜、月曜日は、サターン(土星)デイ、サン(太陽)デイ、ムーン(月)デイ。なのだろうと思いましたが、火水木金はあてはまりません。何故でしょうか?  あと、何故この順番なのでしょうか?教えて下さい。

  • エクセルで月曜日から始まる月々の週番号

    エクセル2010利用者です。 月々の週番号(1~5)を表示する式を探しています。 月曜日が週の始まりとしたいのですが、難しい点は「前月の最後の週に新しい月が始まった場合」です。 例えば、2012年11月1日(木)であれば「週1」ではなく「週5」として表示したいです。10月29日(月)から始まる週として扱いたいです。そして11月の「週1」は「11月1日(月)」ではなく、「11月5日(月)」から始まるようにしたいです。 毎月の最初の月曜日が最初の週にする式は分かるのですが、上記の要件に合う式が見つからず… 教えて頂けると幸いです。

  • エクセル2010で週間予定表の月曜の日付を1日だけ入れると、他のセルが

    エクセル2010で週間予定表の月曜の日付を1日だけ入れると、他のセルが自動で更新されるようにしたいです。 具体的には、週のはじめの月曜である”11月1日”の”1日”を”8日”と書き換えたとき、下のセルの火曜~の欄が自動で9日~になるようにしたいのです。 少し厄介なことに、縦の日付のセルと日付のセルの間に曜日のセルが挟まっているのです。 できれば、他人の作ったこのフォーマットを崩したくないのです。 よろしくお願いいたします。