質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1089閲覧

FSCalendarの曜日計算の際、ツェラーの公式は使われているのか?

So0622

総合スコア8

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/08/25 02:26

疑問:FSCalendarの曜日計算の際、ツェラーの公式は使われているのか?

一般的なカレンダーアプリで、曜日計算の際には、ツェラーの公式が使われることが多いらしいのですが、
(https://qiita.com/ynakaDream/items/78c0c5ad9d1162de25f1)
FSCalendarではどのように曜日計算が行われているのでしょうか?
以下は、FSCalendarのviewcontrollerのソースコードです。おそらくこの部分に該当部分があるのではないかと思います。
丸投げの質問で申し訳ありません。。よろしくお願いします

FSCalendarのソースコード

swift

1import UIKit 2import FSCalendar 3import CalculateCalendarLogic 4import RealmSwift 5 6//ディスプレイサイズ取得 7let w = UIScreen.main.bounds.size.width 8let h = UIScreen.main.bounds.size.height 9 10class ViewController: UIViewController, FSCalendarDelegate, FSCalendarDataSource, FSCalendarDelegateAppearance { 11 //スケジュール内容 12 let labelDate = UILabel(frame: CGRect(x: 5, y: 475, width: 400, height: 50)) 13 //「主なスケジュール」の表示 14 let labelTitle = UILabel(frame: CGRect(x: 0, y: 420, width: 180, height: 50)) 15 //カレンダー部分 16 let dateView = FSCalendar(frame: CGRect(x: 0, y: 15, width: w, height: 350)) 17 //日付の表示 18 let Date = UILabel(frame: CGRect(x: 5, y: 330, width: 200, height: 100)) 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 //カレンダー設定 22 self.dateView.dataSource = self 23 self.dateView.delegate = self 24 self.dateView.today = nil 25 self.dateView.tintColor = .red 26 self.view.backgroundColor = .white 27 dateView.backgroundColor = .white 28 view.addSubview(dateView) 29 30 //日付表示設定 31 Date.text = "" 32 Date.font = UIFont.systemFont(ofSize: 60.0) 33 Date.textColor = .black 34 view.addSubview(Date) 35 36 //「主なスケジュール」表示設定 37 labelTitle.text = "" 38 labelTitle.textAlignment = .center 39 labelTitle.font = UIFont.systemFont(ofSize: 20.0) 40 view.addSubview(labelTitle) 41 42 //スケジュール内容表示設定 43 labelDate.text = "" 44 labelDate.font = UIFont.systemFont(ofSize: 18.0) 45 view.addSubview(labelDate) 46 47 //スケジュール追加ボタン 48 let addBtn = UIButton(frame: CGRect(x: w - 70, y: h - 70, width: 60, height: 60)) 49 addBtn.setTitle("+", for: UIControl.State()) 50 addBtn.setTitleColor(.white, for: UIControl.State()) 51 addBtn.backgroundColor = .orange 52 addBtn.layer.cornerRadius = 30.0 53 addBtn.addTarget(self, action: #selector(onClick(_:)), for: .touchUpInside) 54 view.addSubview(addBtn) 55 56 57 } 58 59 fileprivate let gregorian: Calendar = Calendar(identifier: .gregorian) 60 fileprivate lazy var dateFormatter: DateFormatter = { 61 let formatter = DateFormatter() 62 formatter.dateFormat = "yyyy-MM-dd" 63 return formatter 64 }() 65 66 // 祝日判定を行い結果を返すメソッド 67 func judgeHoliday(_ date : Date) -> Bool { 68 //祝日判定用のカレンダークラスのインスタンス 69 let tmpCalendar = Calendar(identifier: .gregorian) 70 71 // 祝日判定を行う日にちの年、月、日を取得 72 let year = tmpCalendar.component(.year, from: date) 73 let month = tmpCalendar.component(.month, from: date) 74 let day = tmpCalendar.component(.day, from: date) 75 76 let holiday = CalculateCalendarLogic() 77 78 return holiday.judgeJapaneseHoliday(year: year, month: month, day: day) 79 } 80 81 // date型 -> 年月日をIntで取得 82 func getDay(_ date:Date) -> (Int,Int,Int){ 83 let tmpCalendar = Calendar(identifier: .gregorian) 84 let year = tmpCalendar.component(.year, from: date) 85 let month = tmpCalendar.component(.month, from: date) 86 let day = tmpCalendar.component(.day, from: date) 87 return (year,month,day) 88 } 89 90 //曜日判定 91 func getWeekIdx(_ date: Date) -> Int{ 92 let tmpCalendar = Calendar(identifier: .gregorian) 93 return tmpCalendar.component(.weekday, from: date) 94 } 95 96 // 土日や祝日の日の文字色を変える 97 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? { 98 //祝日判定をする 99 if self.judgeHoliday(date){ 100 return UIColor.red 101 } 102 103 //土日の判定 104 let weekday = self.getWeekIdx(date) 105 if weekday == 1 { 106 return UIColor.red 107 } 108 else if weekday == 7 { 109 return UIColor.blue 110 } 111 112 return nil 113 } 114 //画面遷移(スケジュール登録ページ) 115 @objc func onClick(_: UIButton) { 116 let storyboard = UIStoryboard(name: "Main", bundle: nil) 117 let SecondController = storyboard.instantiateViewController(withIdentifier: "Insert") 118 present(SecondController, animated: true, completion: nil) 119 } 120 121func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition){ 122 123 labelTitle.text = "主なスケジュール" 124 labelTitle.backgroundColor = .orange 125 view.addSubview(labelTitle) 126 127 //予定がある場合、スケジュールをDBから取得・表示する。 128 //無い場合、「スケジュールはありません」と表示。 129 labelDate.text = "スケジュールはありません" 130 labelDate.textColor = .lightGray 131 view.addSubview(labelDate) 132 133 let tmpDate = Calendar(identifier: .gregorian) 134 let year = tmpDate.component(.year, from: date) 135 let month = tmpDate.component(.month, from: date) 136 let day = tmpDate.component(.day, from: date) 137 let m = String(format: "%02d", month) 138 let d = String(format: "%02d", day) 139 140 let da = "(year)/(m)/(d)" 141 142 //クリックしたら、日付が表示される。 143 Date.text = "(m)/(d)" 144 view.addSubview(Date) 145 146 //スケジュール取得 147 let realm = try! Realm() 148 var result = realm.objects(Event.self) 149 result = result.filter("date = '(da)'") 150 print(result) 151 for ev in result { 152 if ev.date == da { 153 labelDate.text = ev.event 154 labelDate.textColor = .black 155 view.addSubview(labelDate) 156 } 157 } 158 159 160 161}} 162

###カレンダーアプリで曜日計算の際に使われるツェラーの公式のコード

swift

1let zellerCongruence = { (year: Int, month: Int, day: Int) in (year + year/4 - year/100 + year/400 + (13 * month + 8)/5 + day) % 7 }

###最終的に実現したいこと
曜日がずれているカレンダー(木曜日が一番左にあるカレンダー)の作成

補足情報(FW/ツールのバージョンなど)

このウェブサイトを参考に、FSCalendarを使ってカレンダーを作成しています。
https://qiita.com/yanashi222/items/121b549852bedf391377

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

FSCalendar で任意の曜日で開始するために自分で曜日計算する必要はありません。

例えば、木曜開始にするには次のようにするだけで実現できます(日曜日を1としてカウント。0は指定できない)。

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 //カレンダー設定 4 self.dateView.firstWeekday = 5 5 self.dateView.dataSource = self 6 // 以下略 7 }

ちなみに、オンラインヘルプは次のような感じです。

Summary

The index of the first weekday of the calendar. Give a '2' to make Monday in the first column.

投稿2020/08/25 05:20

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

So0622

2020/08/25 05:32

ご回答ありがとうございます。無事FSCalendarでも、曜日をずらした表示ができるようになりました 今後もよろしくお願いします
guest

0

Calendar構造体でグレゴリオ暦を指定し、dateのweekdayプロパティを返しているだけ。

Swift

1 func getWeekIdx(_ date: Date) -> Int{ 2 let tmpCalendar = Calendar(identifier: .gregorian) 3 return tmpCalendar.component(.weekday, from: date) 4 }

投稿2020/08/25 02:40

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

So0622

2020/08/25 05:31

ご回答ありがとうございます。理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問