質問するログイン新規登録

回答編集履歴

4

setCalendarメソッド

2019/07/08 02:01

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -15,6 +15,25 @@
15
15
  System.out.println("日付:" + dateDownerYYYY01);
16
16
  ```
17
17
 
18
+ 追記:DateFormatクラスに、Calendarの設定を引き渡すsetCalendarというメソッドがありました。
19
+ ```java
20
+ // YYYY表記
21
+ SimpleDateFormat YYYY = new SimpleDateFormat("YYYY年MM月dd日 E曜日");
22
+
23
+ Calendar calDownerYYYY01 = new GregorianCalendar();
24
+ calDownerYYYY01.setFirstDayOfWeek(Calendar.SUNDAY);
25
+ calDownerYYYY01.setMinimalDaysInFirstWeek(4);
26
+ calDownerYYYY01.set(1998, 0, 1);
27
+ // DateFormatにCalendarの設定を渡す
28
+ YYYY.setCalendar(calDownerYYYY01);
29
+ String dateDownerYYYY01 = YYYY.format(calDownerYYYY01.getTime());
30
+ int weekOfYearDownerYYYY01 = calDownerYYYY01.get(Calendar.WEEK_OF_YEAR);
31
+
32
+ System.out.println("週の最初の曜日:" + calDownerYYYY01.getFirstDayOfWeek());
33
+ System.out.println("何日以上あると最初の週と見做すか:" + calDownerYYYY01.getMinimalDaysInFirstWeek());
34
+ System.out.println("日付:" + dateDownerYYYY01 + "/第何週:" + weekOfYearDownerYYYY01);
35
+ ```
36
+
18
37
  ###### 前の回答
19
38
  YYYYの実装が不明ですが推測して、paiza.ioで前半のカレンダー関連のコードを実行して出力してみたところ、普通に「1997年12月31日」と出力されました。
20
39
  何か勘違いされているように思います。1997年は1997年であることに間違いはなく、**あくまで「年の週」を求める上で**、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。

3

原因判明

2019/07/08 02:01

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,3 +1,21 @@
1
+ SimpleDateFormatは、内部にCalendarを持っており、formatメソッドで渡されたDateをそのCalendarに詰めなおすことで年月日などを取得しています。Dateはエポックからのミリ秒しか持っていないため、週の始まりの曜日や年の開始週の日数などの情報は渡りません。SimpleDateFormat側ではそれらの設定が残っていない状態で解釈を進めるので、「1998年1月1日」の時も、「年の開始週の日数が1日以上」というデフォルト設定で解釈するため、開始週が1998年と処理されていたのです。
2
+ 出力時にその設定を適用するのであれば、**SimpleDateFormatの持つCalendarの設定を変更する**必要があります。getCalendar()でCalendarを取得し、それに対して同様の設定をします。逆に、formatを使って出力するだけならば元のCalendarでの設定変更は不要です。
3
+ ```java
4
+ SimpleDateFormat YYYY = new SimpleDateFormat("YYYY年MM月dd日 E曜日");
5
+ Calendar fCal = YYYY.getCalendar();
6
+ fCal.setFirstDayOfWeek(Calendar.SUNDAY);
7
+ fCal.setMinimalDaysInFirstWeek(4);
8
+
9
+ Calendar calDownerYYYY01 = new GregorianCalendar();
10
+ calDownerYYYY01.set(1998, 0, 1);
11
+ String dateDownerYYYY01 = YYYY.format(calDownerYYYY01.getTime());
12
+
13
+ System.out.println("週の最初の曜日:" + fCal.getFirstDayOfWeek());
14
+ System.out.println("何日以上あると最初の週と見做すか:" + fCal.getMinimalDaysInFirstWeek());
15
+ System.out.println("日付:" + dateDownerYYYY01);
16
+ ```
17
+
18
+ ###### 前の回答
1
19
  YYYYの実装が不明ですが推測して、paiza.ioで前半のカレンダー関連のコードを実行して出力してみたところ、普通に「1997年12月31日」と出力されました。
2
20
  何か勘違いされているように思います。1997年は1997年であることに間違いはなく、**あくまで「年の週」を求める上で**、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
3
21
  同様に、後半の条件では1998年1月1日は**1997年の第53週に含まれる**だけの事であり、勝手に年が変わったりはしません。

2

1997年12月31日が1998年扱いなのは、あくまで「年の週」を求める場合においての話

2019/07/07 23:11

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  YYYYの実装が不明ですが推測して、paiza.ioで前半のカレンダー関連のコードを実行して出力してみたところ、普通に「1997年12月31日」と出力されました。
2
- 何か勘違いされているように思います。1997年は1997年であることに間違いはなく、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
2
+ 何か勘違いされているように思います。1997年は1997年であることに間違いはなく、**あくまで「年の週」を求める上で**、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
3
3
  同様に、後半の条件では1998年1月1日は**1997年の第53週に含まれる**だけの事であり、勝手に年が変わったりはしません。
4
4
 
5
5
  [ドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/util/GregorianCalendar.html)にそのまま書いてありますがね。

1

修正

2019/07/07 21:30

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,3 +1,5 @@
1
1
  YYYYの実装が不明ですが推測して、paiza.ioで前半のカレンダー関連のコードを実行して出力してみたところ、普通に「1997年12月31日」と出力されました。
2
- 何か勘違いされているように思います。1997年は1997年であることに間違いはなく、1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
2
+ 何か勘違いされているように思います。1997年は1997年であることに間違いはなく、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
3
- 同様に、1998年1月1日は**1997年の第53週に含まれる**だけの事であり、勝手に年が変わったりはしません。
3
+ 同様に、後半の条件では1998年1月1日は**1997年の第53週に含まれる**だけの事であり、勝手に年が変わったりはしません。
4
+
5
+ [ドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/util/GregorianCalendar.html)にそのまま書いてありますがね。