xcal

今月を表示してみる

さて、ここまできたらもう一歩。第1週以降を月末まで7日づつ表示すれば今月のカレンダーの出来上がり。

#! /usr/bin/swift
import Foundation
let now: Date = Date()
let cal: Calendar = Calendar(identifier: .gregorian)
let cal_comp: DateComponents = cal.dateComponents([.year, .month, .day, .weekday], from:now)
var cal_seq: [String] = ["日","月","火","水","木","金","土"]
print("      \(cal_comp.month!)月 \(cal_comp.year!)")
var endofmonth: [Int] = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if (cal_comp.year! % 4) == 0 && (cal_comp.year! % 100) != 0 || (cal_comp.year! % 400) == 0 {
    endofmonth[2]+=1
}
for _ in 0..<42 {
    cal_seq.append("  ")
}
var offset: Int = (7 - cal_comp.weekday!) + cal_comp.day!
offset %= 7
if offset != 0 {
    offset = 7 - offset
}
var datestring: String
for i in 1..<endofmonth[cal_comp.month!]+1 {
    if i < 10 {
        datestring = " \(i)"
    } else {
        datestring = "\(i)"
    }
    cal_seq[6 + offset + i] = datestring
}
for i in 0..<7 {
    for j in 0..<7 {
        print("\(cal_seq[i * 7 + j]) ", terminator:"")
    }
    print("")
}

少し振る舞いを変えます。カレンダーのフォーマットを7日6週とし今月以外の日付を空白で埋めます。

すでに今月が何日あるのかも、先月分の空白が何マス必要なのかもわかっていますので、あらかじめ42個の空白を要素に持つ配列を用意しておき、適切な場所から今月の日付分の数列に置き換えてゆきます。

この配列を横に7つ、縦に6行表示すれば、立派なカレンダー。ヘッダに年月と曜日表示を加えれば、calの出力と見分けのつかないものの出来上がり。

thismonth.swift実行結果