回答編集履歴
4
setCalendarメソッド
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
原因判明
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年扱いなのは、あくまで「年の週」を求める場合においての話
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
修正
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)にそのまま書いてありますがね。
|