【iOS,Swift3】Extension晒す〜Date編〜

表題の通りです。ご査収ください。

import Foundation

extension Date {
    
    // MARK: - public property
    
    /// 週あたりの日数
    public var daysPerWeek: Int {
        get {
            return 7
        }
    }
    
    /// 月の初めの日
    public var firstDateOfMonth: Date {
        get {
            let calendar = NSCalendar.current
            var components = calendar.dateComponents([.year, .month, .day], from: self)
            components.day = 1;
            return calendar.date(from: components)!
        }
    }
    
    /// 月の週数
    public var numberOfWeeksForMonth: Int {
        get {
            let rangeOfWeeks = NSCalendar.current.range(of: Calendar.Component.weekOfMonth,
                                                        in: Calendar.Component.month,
                                                        for: firstDateOfMonth)
            return (rangeOfWeeks?.count)!
        }
    }
    
    /// 月の日数
    public var numberOfDaysForMonth: Int {
        get {
            let rangeOfDays = NSCalendar.current.range(of: Calendar.Component.day,
                                                       in: Calendar.Component.month,
                                                       for: firstDateOfMonth)
            return (rangeOfDays?.count)!
        }
    }

    // MARK: - public method

    /// toString()
    ///
    /// - Parameter format: フォーマット
    /// - Parameter calendarIdntifier: カレンダーIdentifier
    /// - Returns: 文字列
    public func toString(format: String, calendarIdentifier: Calendar.Identifier = .gregorian) -> String {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: calendarIdentifier)
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
    
    /// fromString()
    ///
    /// - Parameters:
    ///   - string: 文字列
    ///   - format: フォーマット
    /// - Parameter calendarIdntifier: カレンダーIdentifier
    /// - Returns: Date
    public static func fromString(_ string: String, format: String, calendarIdentifier: Calendar.Identifier = .gregorian) -> Date? {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: calendarIdentifier)
        formatter.dateFormat = format
        return formatter.date(from: string)
    }
}