LoginSignup
1
2

More than 5 years have passed since last update.

[Swift]weekdaySymbols・shortWeekdaySymbolsから曜日を表示する際の注意点

Posted at

DateFormattershortWeekdaySymbolsから曜日を表示するコードを書いているときに意図する曜日が取得できず「あれ?」となったので備忘のために記事を書きました。

概要

  1. Calendarcomponent(_:from:).weekdayを渡した戻り値(Int)をそのままshortWeekdaySymbolsのindexとして利用
  2. 意図しない曜日が取れたり、落ちたりした
  3. weekdayは1始まりなので-1しないとweekdaySymbolsshortWeekdaySymbolsのindexとして使えない

以下詳しく書いていきます。

現象

  • 意図する曜日が取得できない
  • 落ちることもある

上手くいかなかったのは下記コードです。

意図する曜日が取得できない or 落ちる例

/// 引数から日時の文字列を返す
func createDateString(date: Date, calendar: Calendar) -> String {

    let dateFormater = DateFormatter()
    dateFormater.locale = Locale(identifier: "ja_JP")
    let weekdayIndex = calendar.component(.weekday, from: date)
    dateFormater.dateFormat = "M月d日 \(dateFormater.shortWeekdaySymbols[weekdayIndex]) H:mm"

    return dateFormater.string(from: date)
}

原因

  • Calendarcomponent(_:from:).weekdayを渡した戻り値(Int)をそのままshortWeekdaySymbolsのindexとして利用していたこと

weekdayは1始まりなのでした。
そのためcomponent(_:from:)で取得した値をそのままindexとして使うと0始まりの配列であるweekdaySymbolsshortWeekdaySymbolsとズレが生じてしまいます。

  • 意図する曜日が取得できない
    • 1始まりと0始まりのズレが原因
  • 落ちることもある
    • 配列の範囲を超えた値が渡される可能性があるため(7が渡されると落ちる)

対応

原因がわかれば対応は簡単ですね。
weekdayの値を-1してあげればズレがなくなります。

修正例

/// 引数から日時の文字列を返す
func createDateString(date: Date, calendar: Calendar) -> String {

    let dateFormater = DateFormatter()
    dateFormater.locale = Locale(identifier: "ja_JP")

    // .weekdayは1から始まるので、indexとして利用するために - 1 する
    let weekdayIndex = calendar.component(.weekday, from: date) - 1
    dateFormater.dateFormat = "M月d日 \(dateFormater.shortWeekdaySymbols[weekdayIndex]) H:mm"

    return dateFormater.string(from: date)
}

サンプルコード

サンプルコードをGitHubにあげたので、実際に触りたい方はこちらからどうぞ。
https://github.com/taguchi-k/ios-weekday-from-datepicker

開発環境

category Version
Swift 3.1
XCode 8.3.2

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2