
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の日曜日という結果になります。
回答ありがとうございました。
返事が大変遅くなり申し訳ございません。
># 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の日曜日という結果になりますよね。
今回は本当にどうもありがとうございました。
又何かありましたら、ご教授宜しくお願い致します。
No.9
- 回答日時:
> このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、
> これで週の先頭が月曜日になっているのでしょうか?
はい。それでよいと思います。
> デフォルトのロケールにおいて週の先頭が日曜日になっているが、今作りたい
> カレンダーが週の先頭を月曜日にするものであるというものであるなら、これは
> 特殊なカレンダーであり、そのカレンダーにおいてsetFirstDayOfWeek() で
> 変更するのは目的にあっていると考えます。
読んでると、なんかそんな気がしてきました。
ところで、同じグレゴリア暦でも、
ヨーロッパとかでは週の最初の曜日が異なったりするので、
週の最初の曜日が異なる文化、というのは考えているほど例外的なものでは
ないのだと思います。
ので、サブクラスとしてではなく、クラスの属性の一つとして、
週の最初の曜日というのが準備されているのだろう、と考えてました。
けれど、それは、コンストラクタに Locale をわたすことで、
ちゃんと設定してくれる、ということも考えると、
それでも敢えて setFirstDayOfWeek があるということは、
きっと spoony さんのおっしゃるとおりなんでしょう。
回答ありがとうございました。
返事が大変遅くなり申し訳ございません。
>> このようにソースを組むと、2(= Calendar.MONDAY)が返って来たのですが、
>> これで週の先頭が月曜日になっているのでしょうか?
>はい。それでよいと思います。
戻り値が2(= Calendar.MONDAY)になると週の先頭が月曜日になるのですね。解りました。
今回はどうもありがとうございました。
また何かありましたら、ご教授宜しくお願い致します。
No.8
- 回答日時:
> でも、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日
となるようにしたいと考えています。
その為に月曜日を週の最初の日にしようと考えてます。
No.7
- 回答日時:
どうも。
週の最初の曜日は、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)が返って来たのですが、
これで週の先頭が月曜日になっているのでしょうか?
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)が返されるようですが、、、
どんなソースを記述したのでしょうか?
この回答への補足
回答どうもありがとうございます。
>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日(日)が出力されると思っていました。
考え方が間違っていると思うのですが、どうしてよいかわかりませんので、
解る事がありましたらご教授お願い致します。
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());
でも、これでよいのかあまり自信がないです。
穴があったらだれか指摘してください。
この回答への補足
回答どうもありがとうございます。
記載して下さったサンプルソースは大変参考になりました。
一つ気になった部分があるのですが、
デフォルトで日本の週の先頭は「日曜日」となっているらしいのですが、
例えば「月曜日」というように週の先頭を変えることはできるのでしょうか?
週の最初の日が何であるかを設定するCalendarクラスの
setFirstDayOfWeek(int value)メソッドの引数のvalueに
Calendar.MONDAYを指定したのですが、うまくいきませんでした。
週の先頭を変えることはできるのでしょうか?
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 …
この回答への補足
回答どうもありがとうございます。
一つ気になった部分があるのですが、
>週の先頭は日本では「日曜日」です。
この部分は、例えば週の先頭を日本では「日曜日」となっていますが、
「月曜日」というように、週の先頭を変えることはできるのでしょうか?
週の最初の日が何であるかを設定するCalendarクラスの
setFirstDayOfWeek(int value)メソッドの引数のvalueに
Calendar.MONDAYを指定したのですが、うまくいきませんでした。
週の先頭を変えることはできるのでしょうか?
No.3
- 回答日時:
指定した曜日が取得できているのなら、月曜日からの日差は取得出来るんじゃないですか?
そしたら、
月曜日からの日数×1000×60×60×24
で、日差分のミリ秒が取得出来ますね?
それを、指定日のミリ秒から引き算すれば取得したい日のミリ秒が取得出来ますね?
そして、それを、本来の日付に戻してやればよいのです。
まぁ、他にもやり方はあるでしょうが。。。
一つの方法としての提案です。
この回答への補足
回答ありがとうございます。
>月曜日からの日数×1000×60×60×24
>で、日差分のミリ秒が取得出来ますね?
>それを、指定日のミリ秒から引き算すれば取得したい日のミリ秒が取得出来ます
>ね?
>そして、それを、本来の日付に戻してやればよいのです。
わざわざやり方をご教授頂きありがとうございます。
参考にさせて頂きます。
No.2
- 回答日時:
java.util.Date クラスの getTime() で ミリ秒が取得出来るので、
日付もミリ秒まで落とせば単純に引き算で出来ますよ。
この回答への補足
回答ありがとうございます。
>java.util.Date クラスの getTime() で ミリ秒が取得出来るので、
>日付もミリ秒まで落とせば単純に引き算で出来ますよ。
8月2日(金)と7月29日(月)というように差分対象日付を予め設定していれば、
ミリ秒まで取得して引き算をすると、日数差「4」という正しい数値は
得られたのですが、
例えば、差分対象日付の8月2日(金)のみの情報で、
7月29日(月)という情報を取得する方法はないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 祝日を除いた月曜から土曜までの1週間分の日付行を選択し、別シートへカットアンドペーストしたい 13 2023/07/13 22:46
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- 派遣社員・契約社員 派遣について詳しい方へ質問 1 有給の具体的な1日の金額は普段勤務している金額ではなく、もっと低いの 3 2023/05/09 15:04
- 中途・キャリア 6月30日に就職内定の電話が午前中に登録していたキャリアエージェント経由できました。そこから入社日や 3 2022/07/04 23:10
- 会社・職場 有給を取得したいと考えているのですが、取りづらい状況で取得しようか悩んでいます。 6月末に引っ越しを 4 2022/06/07 14:35
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Excel(エクセル) 条件付き書式で文字入力 6 2022/08/29 10:40
- 薬学 マーベロン28を服用しています。今週の月曜日が休薬期間最終日で薬もなかったので取りに行きました。さっ 3 2023/04/30 21:57
- 郵便・宅配 郵便局の配達 1 2023/07/16 11:11
- 片思い・告白 [質問] 初デート後のLINEについて 相手からすぐに「今日はありがとう!帰り気をつけてね」とLIN 6 2023/03/27 08:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
count(*)で取得した値をJAVAの...
-
VB.NETで DataRow()を利用して...
-
like演算子内に変数って使えな...
-
ListView 項目の選択/選択解除...
-
JSP+Servletでのページングの常識
-
PHP8でWarning:Undefined varia...
-
JavaScriptにおいてコンピュー...
-
PostgresSQL JDBC で Select結...
-
Excel VBA でログインしてい...
-
VBA:小数点以下の数字を取得で...
-
VB .netにて現在時刻+1時間後...
-
getParameter と getAttribut...
-
ドロップダウンリストの初期表...
-
Yahoo! JAPANのID取得について
-
データ数をカウントしたいのですが
-
利用者側のMACアドレスを取得し...
-
ExcelでNTPサーバーから時刻を...
-
JAVAでWindowsのアカウント名を...
-
VBA Shapesの座標からセル位置...
-
javaで週の最初の日(例:月曜日...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBA:小数点以下の数字を取得で...
-
VBAでActiveDirectoryのユーザ...
-
Spreadの選択行の取得について
-
PHP8でWarning:Undefined varia...
-
Flexgridで選択行の列の値を取...
-
count(*)で取得した値をJAVAの...
-
VBA Shapesの座標からセル位置...
-
データ数をカウントしたいのですが
-
JavaScriptにおいてコンピュー...
-
利用者側のMACアドレスを取得し...
-
VBA リストボックス内の値を複...
-
like演算子内に変数って使えな...
-
EXCELのリストボックスを選択し...
-
「Excel VBA」 Webクエリ マク...
-
JavaScriptでWindowsログオンID...
-
gethostbyaddrでのホスト名取得...
-
現在時刻をミリ秒まで取得
-
vbaで、オートシェイプ文字幅と...
おすすめ情報