回答編集履歴

4

setCalendarメソッド

2019/07/08 02:01

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -32,6 +32,44 @@
32
32
 
33
33
 
34
34
 
35
+ 追記:DateFormatクラスに、Calendarの設定を引き渡すsetCalendarというメソッドがありました。
36
+
37
+ ```java
38
+
39
+ // YYYY表記
40
+
41
+ SimpleDateFormat YYYY = new SimpleDateFormat("YYYY年MM月dd日 E曜日");
42
+
43
+
44
+
45
+ Calendar calDownerYYYY01 = new GregorianCalendar();
46
+
47
+ calDownerYYYY01.setFirstDayOfWeek(Calendar.SUNDAY);
48
+
49
+ calDownerYYYY01.setMinimalDaysInFirstWeek(4);
50
+
51
+ calDownerYYYY01.set(1998, 0, 1);
52
+
53
+ // DateFormatにCalendarの設定を渡す
54
+
55
+ YYYY.setCalendar(calDownerYYYY01);
56
+
57
+ String dateDownerYYYY01 = YYYY.format(calDownerYYYY01.getTime());
58
+
59
+ int weekOfYearDownerYYYY01 = calDownerYYYY01.get(Calendar.WEEK_OF_YEAR);
60
+
61
+
62
+
63
+ System.out.println("週の最初の曜日:" + calDownerYYYY01.getFirstDayOfWeek());
64
+
65
+ System.out.println("何日以上あると最初の週と見做すか:" + calDownerYYYY01.getMinimalDaysInFirstWeek());
66
+
67
+ System.out.println("日付:" + dateDownerYYYY01 + "/第何週:" + weekOfYearDownerYYYY01);
68
+
69
+ ```
70
+
71
+
72
+
35
73
  ###### 前の回答
36
74
 
37
75
  YYYYの実装が不明ですが推測して、paiza.ioで前半のカレンダー関連のコードを実行して出力してみたところ、普通に「1997年12月31日」と出力されました。

3

原因判明

2019/07/08 02:01

投稿

swordone
swordone

スコア20651

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

2

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

2019/07/07 23:11

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -1,6 +1,6 @@
1
1
  YYYYの実装が不明ですが推測して、paiza.ioで前半のカレンダー関連のコードを実行して出力してみたところ、普通に「1997年12月31日」と出力されました。
2
2
 
3
- 何か勘違いされているように思います。1997年は1997年であることに間違いはなく、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
3
+ 何か勘違いされているように思います。1997年は1997年であることに間違いはなく、**あくまで「年の週」を求める上で**、前半の条件では1997年12月31日は**1998年の第1週に含まれる**というだけの話です。
4
4
 
5
5
  同様に、後半の条件では1998年1月1日は**1997年の第53週に含まれる**だけの事であり、勝手に年が変わったりはしません。
6
6
 

1

修正

2019/07/07 21:30

投稿

swordone
swordone

スコア20651

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