今月の第1週を表示してみる

投稿者: | 2015年5月10日

さて、calと同じ表示をするために月の第1週中に何日分先月の日付があるのかを調べましょう。

次のように計算します。

  1. 今日の日付と曜日から今週の土曜日が何日かを調べる
  2. その日を7で割ったときの余りが第1週の土曜日の日付である
  3. ただし0日は存在しないので割り切れたときは7日とする
  4. 1週間は7日間なので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.year!)年\(cal_comp.month!)月\(cal_comp.day!)日\(cal_seq[cal_comp.weekday! - 1])曜日")
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
}
print("今月は\(endofmonth[cal_comp.month!])日まであるよ!")
print("今年の2月は\(endofmonth[2])日まであるよ!")
var sat: Int = (7 - cal_comp.weekday!) + cal_comp.day!
sat %= 7
if sat != 0 {
    for _ in 0..<7-sat {
    cal_seq.append("  ")
    }
} else {
    sat = 7
}
for i in 0..<sat {
    cal_seq.append(" \(i + 1)")
}
for i in 0..<2 {
    for j in 0..<7 {
        print("\(cal_seq[i * 7 + j]) ", terminator:"")
    }
    print("")
}

曜日の配列を定数から変数に変えました。配列に後から要素を追加するためです。また用途が変わってしまったので名称も変えました。

$ ./firstweek.swift 
今日は2015年5月10日日曜日
今月は31日まであるよ!
今年の2月は28日まであるよ!
日 月 火 水 木 金 土 
              1  2 

実行結果はこのとおり。