前提
Swift5
わからないこと
「<言語設定が「西暦」の場合>」の「label2Text」のString from Date:の出力が2000/08/24である事の理由
詳細
下記のような検証用の実装を実行します。
swift
1 // 検証対象の日付String 2 let dateString = "2000/8/24" 3 4 /// stringからlocaleを指定せずにDateを生成し使用 5 func stringFromDate2() { 6 // Dateの生成 7 let formatter = DateFormatter() 8 formatter.dateFormat = "yyyy/MM/dd" 9 10 print("2 locale: (formatter.locale!)") 11 print("2 calender:(formatter.calendar!)") 12 print("\n") 13 let date = formatter.date(from: dateString) 14 15 // "yyyy/MM/dd"として表示 16 let f = DateFormatter() 17 f.dateFormat = "yyyy/MM/dd" 18 19 print("2.2 locale: (f.locale!)") 20 print("2.2 calender:(f.calendar!)") 21 print("\n") 22 let label2Text = "date: (date!)\n String from Date: (f.string(from: date!))" 23 } 24 25 /// stringからlocaleをja_JP指定にしてDateを生成し使用 26 func stringFromDate3() { 27 // Dateの生成 28 let formatter = DateFormatter() 29 formatter.locale = Locale(identifier: "ja_JP") 30 formatter.dateFormat = "yyyy/MM/dd" 31 32 print("3 locale: (formatter.locale!)") 33 print("3 calender:(formatter.calendar!)") 34 print("\n") 35 let date = formatter.date(from: dateString) 36 37 // "yyyy/MM/dd"として表示 38 let f = DateFormatter() 39 f.dateFormat = "yyyy/MM/dd" 40 41 print("3.2 locale: (f.locale!)") 42 print("3.2 calender:(f.calendar!)") 43 print("\n") 44 let label3Text = "date: (date!)\n String from Date: (f.string(from: date!))" 45 } 46 47 /// stringからlocaleをen_US_POSIX指定してDateを生成し使用 48 func stringFromDate4() { 49 // Dateの生成 50 let formatter = DateFormatter() 51 formatter.locale = Locale(identifier: "en_US_POSIX") 52 formatter.dateFormat = "yyyy/MM/dd" 53 54 print("4 locale: (formatter.locale!)") 55 print("4 calender:(formatter.calendar!)") 56 print("\n") 57 let date = formatter.date(from: dateString) 58 59 // "yyyy/MM/dd"として表示 60 let f = DateFormatter() 61 f.dateFormat = "yyyy/MM/dd" 62 63 print("4.2 locale: (f.locale!)") 64 print("4.2 calender:(f.calendar!)") 65 print("\n") 66 let label4Text = "date: (date!)\n String from Date: (f.string(from: date!))" 67 } 68
この時、
<言語設定が「西暦」の場合>
label2Text
→
date:2000-08-23 15:00:00:00 +0000 String from Date: 2000/08/24
label3Text
→
date:2000-08-23 15:00:00:00 +0000 String from Date: 2000/08/24
label4Text
→
date:2000-08-23 15:00:00:00 +0000 String from Date: 2000/08/24
<言語設定が「和暦」の場合>
label2Text
→
date:3988-08-23 15:00:00:00 +0000 String from Date: 2000/08/24
label3Text
→
date:2000-08-23 15:00:00:00 +0000 String from Date: 0012/08/24
label4Text
→
date:2000-08-23 15:00:00:00 +0000 String from Date: 0012/08/24
となります。
この際、「<言語設定が「西暦」の場合>」の「label2Text」のString from Date:
の出力が2000/08/24
である事の理由がわかりません。
stringFromDate2
, stringFromDate3
, stringFromDate4
において、Date
から String
を生成する際にはどれもDateFormatter
を生成しそれを用いてString
に変換する、というやり方は同じですが、和暦において出力の差異が生じていることが分からなかったです。
フォーマッターのlocale
等を指定していないので、String from Date: 0012/08/24
が出力される想定でした。
これはその前の処理である、String
からDate
を生成する際のCalendar
設定が影響しているという事なのでしょうか?
参考
回答1件
あなたの回答
tips
プレビュー