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