疑問: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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/25 05:32