地域によって変わる開始曜日
WikiPediaによると、
週が始まる日は、日曜日とすることもあり、また月曜日からとするところもある。アメリカ製のカレンダー、ヘブライ語、ポルトガル語、アラビア語、ペルシア語、ベトナム語などは前者、フランス製のカレンダーなどは後者である。イスラム圏では金曜日が公休日になっていて、カレンダーも土曜日から始まるところがある。
ということです。
西暦で表すグレゴリオ暦は、もともとユダヤ暦由来で、ユダヤ暦は日曜日始まりだったため、日曜日始まりが通例だった。
だが、標準規格 ISO 8061 で、月曜日始まりと制定されてからヨーロッパ圏を中心に月曜始まりに変わっていったという経緯があるようです。
日本では、カレンダーは日曜日始まりが多いけど、手帳では月曜日始まりが結構合ったりします。
土日がお休みの人が多いので、土日がつながっている方が予定も書きやすいというのがあるのかと。
結論、開始曜日は固定にするのは難しいということですね。
週番号
週番号というのはご存知でしょうか。年のはじめをWeek1として、週ごとに番号が振られていきます。
日本では馴染みはあまりないのですが、海外の人とやり取りしていると、「○週目の○曜日」という表現で日付指定されることもあるようです。
日本では、月単位で見ることが慣れている気がしますが、海外では週単位で見ることが多いと聞いたことがあります。
さて、これも、 ISO 8061 で規定されていて、
最初の木曜日を含む週が、その年の第1週である。月曜日始まりの場合、木曜日がちょうど真ん中の曜日だからですね、きっと。
今年2016年は、最初の木曜日は1月7日になります。
つまり1月1日は、2015年の最後の週になる。
ここで、週番号をさらにややこしくしているのが月曜日始まり以外での地域での週番号になります。
アメリカや日本など日曜日が週始まりの場合は、1月1日がWeek1になる。
イスラム圏では最初の金曜日を含む週がWeek1になる。
と、計算方法が違うのです。なんとまぁー!
結果、今年2016年の場合、イギリスの週番号と、アメリカ/日本の週番号にはズレが生じています。
iOSでの扱い
iOSでは日曜日1〜土曜日7 までの番号が振られます。
厳密には、カレンダーに依存するようです。
NSDateComponentsリファレンスより
Weekday units are the numbers 1 through n, where n is the number of days in the week. For example, in the Gregorian calendar, n is 7 and Sunday is represented by 1.グレゴリオ暦を指定している場合は、週の開始は日曜日であるので、日曜日=1とする。という方針なんですね。
グレゴリオ暦、和暦、インド暦のカレンダーで見てみても、全て" 7 and Sunday is represented by 1." となっていました。
なので、週は7日前提で考えていてもまずは問題なさそうですが、週が7日でないカレンダーが導入される可能性もあるかも?ということは理解しておく必要がありそうです。
そして、曜日の表記
Calendar.current.weekdaySymbols
についても日曜始まりの配列になっています。
["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
このルールをベースに、地域毎の週の開始曜日の差は
Calendar.current.firstWeekday
Locale.current.calendar.firstWeekday
で週の開始曜日の値を別途取得出来るようになっています。
地域毎の差は、Settings > Language & Region > Region の設定に依存しており、Regionを変えると以下のようにfirstWeekdayに差が出てくるのがわかります。で週の開始曜日の値を別途取得出来るようになっています。
日本、アメリカ | 1 (日曜日始まり) |
---|---|
イギリス | 2 (月曜日始まり) |
イラク | 7 (土曜日始まり) |
バングラデッシュ | 6 (金曜日始まり) |
iOSアプリで、週の表示をする場合、
デフォルトはこのfirstWeekdayを元に決めると良さそうです。
週番号(weekOfYear)もRegionに合わせた番号が取得できます。
標準の「カレンダー」アプリでは、週番号を表示できるオプションがあります。
そして、週の開始曜日を変更出来るオプションがあります。
日本の地域設定で、週の開始曜日を日曜日以外にしてみても....週番号の値は変わらず日曜日始まりルールで表示されていました。
この場合、正確にいうと土曜日の週番号が違うことになると思うのですが、まぁよし としているのかな。
ちなみに、標準の「カレンダー」アプリの開始曜日を変更出来る設定内容はサードパーティのアプリからは参照できないようです。残念。
iOSで週の始めの日付を取得する
設定されているRegion,カレンダーなどを考慮して、週の初めの日を取得するのは次のような感じになるでしょうか
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private func firstDayOfWeek(date:Date) -> Date { | |
let cal = Calendar.current | |
let firstWeekDay = cal.firstWeekday | |
let thisWeekDay = cal.dateComponents([.weekday], from: date).weekday! | |
var diff = thisWeekDay - firstWeekDay | |
if thisWeekDay < firstWeekDay { | |
diff += cal.weekdaySymbols.count | |
} | |
diff = -1 * diff | |
let firstDay = cal.date(byAdding: .day, value: diff, to: date)! | |
return firstDay | |
} |
週の表示についても、各地域によって色々差があって世界は広いなー