来月を表示してみる

投稿者: | 2015年5月31日

NSDateComponentsの処理がわかると、thismonth.swiftにちょっと手を入れると来月のカレンダーも表示できそうです。

今月の処理ではNSDateComponentsを使って今日の日付(というか今の時刻)からカレンダーを生成できたので、来月の1日を使えば来月のカレンダーが表示できるはず。

#! /usr/bin/swift
import Foundation
let now: Date = Date()
let cal: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
var cal_comp: DateComponents = cal.components([.year, .month, .day, .weekday], from:now)
cal_comp.month!+=1
cal_comp.day! = 1
let next: Date = Calendar.current.date(from:cal_comp)!
cal_comp = cal.components([.year, .month, .day, .weekday], from:next)
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 var i 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 var i in 1..<endofmonth[cal_comp.month!]+1 {
    if i < 10 {
        datestring = " \(i)"
    } else {
        datestring = "\(i)"
    }
    cal_seq[6 + offset + i] = datestring
}
for var i in 0..<7 {
    for var j in 0..<7 {
        print("\(cal_seq[i * 7 + j]) ", terminator:"")
    }
    print("")
}

やや力技ではありますが、nextmonth.swiftを実行してみます。

nextmonth.swift実行結果

5行目のcal_compを定数から変数に変えました。一旦今の時刻から今日の年月日情報を生成するのですが、8行目で生成した来月1日の情報から9行目でcal_compを書き換えるためです。

6,7行目で強制的に来月1日情報に書き換えたcal_compから来月1日の時刻情報を生成しているのが8行目。

Calendar.current.date(from:)

を使うことでDateComponents型のデータをDate型に変換することができます。この変換結果を使って9行目で来月1日の年月日と曜日情報を取得します。その後の処理はthismonth.swiftと全く同じです。

今月が12月の場合はエラーになるかと思いきや、うまく処理してくれるみたいです。