// // Date+Extension.swift // O2Platform // // Created by FancyLou on 2018/7/26. // Copyright © 2018 zoneland. All rights reserved. // import Foundation extension Date { func add(component: Calendar.Component, value: Int) -> Date { return Calendar.current.date(byAdding: component, value: value, to: self)! } var startOfDay: Date { return Calendar.current.startOfDay(for: self) } func getDateWithDay() -> Int { return NSCalendar.current.component(.day, from: self) } func getDateWithMonth() -> Int { return NSCalendar.current.component(.month, from: self) } func getDateWithYear() -> Int { return NSCalendar.current.component(.year, from: self) } /// 判断当前日期是否为今年 // func isThisYear() -> Bool { // // 获取当前日历 // let calender = Calendar.current // // 获取日期的年份 // let yearComps = calender.component(.year, from: self) // // 获取现在的年份 // let nowComps = calender.component(.year, from: Date()) // // return yearComps == nowComps // } /// 是否是昨天 // func isYesterday() -> Bool { // // 获取当前日历 // let calender = Calendar.current // // 获取日期的年份 // let comps = calender.dateComponents([.year, .month, .day], from: self, to: Date()) // // 根据头条显示时间 ,我觉得可能有问题 如果comps.day == 0 显示相同,如果是 comps.day == 1 显示时间不同 // // 但是 comps.day == 1 才是昨天 comps.day == 2 是前天 // // return comps.year == 0 && comps.month == 0 && comps.day == 1 // return comps.year == 0 && comps.month == 0 && comps.day == 0 // } /// 是否是前天 func isBeforeYesterday() -> Bool { // 获取当前日历 let calender = Calendar.current // 获取日期的年份 let comps = calender.dateComponents([.year, .month, .day], from: self, to: Date()) // // return comps.year == 0 && comps.month == 0 && comps.day == 2 return comps.year == 0 && comps.month == 0 && comps.day == 1 } /// 判断是否是今天 // func isToday() -> Bool { // // 日期格式化 // let formatter = DateFormatter() // // 设置日期格式 // formatter.dateFormat = "yyyy-MM-dd" // // let dateStr = formatter.string(from: self) // let nowStr = formatter.string(from: Date()) // return dateStr == nowStr // } } extension Date { /// String -> Date /// /// - Parameters: /// - dateStr: date string /// - formatter: date formatter /// - Returns: Date static func date(_ dateStr: String, formatter: String = "yyyy-MM-dd HH:mm:ss") -> Date? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = formatter dateFormatter.locale = Locale.current return dateFormatter.date(from: dateStr) } /// Date -> String /// /// - Parameter formatter: date formatter /// - Returns: date string func toString(_ formatter: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = formatter dateFormatter.locale = Locale.current return dateFormatter.string(from: self) } } extension Date { static func currentCalendar() -> Calendar { var sharedCalendar = Calendar(identifier: .gregorian) sharedCalendar.locale = Locale.current return sharedCalendar } /// Example: 2000/1/2 03:04:05 return 2000 var year: Int { get { return Date.currentCalendar().component(.year, from: self) } } /// Example: 2000/1/2 03:04:05 return 1 var month: Int { get { return Date.currentCalendar().component(.month, from: self) } } /// Example: 2000/1/2 03:04:05 return 2 var day: Int { get { return Date.currentCalendar().component(.day, from: self) } } /// Example: 2000/1/2 03:04:05 return 3 var hour: Int { get { return Date.currentCalendar().component(.hour, from: self) } } /// Example: 2000/1/2 03:04:05 return 4 var minute: Int { get { return Date.currentCalendar().component(.minute, from: self) } } /// Example: 2000/1/2 03:04:05 return 5 var second: Int { get { return Date.currentCalendar().component(.second, from: self) } } /// 当前时间的月份的第一天是周几 var firstWeekDayInThisMonth: Int { var calendar = Calendar.current let componentsSet = Set([.year, .month, .day]) var components = calendar.dateComponents(componentsSet, from: self) calendar.firstWeekday = 1 components.day = 1 let first = calendar.date(from: components) let firstWeekDay = calendar.ordinality(of: .weekday, in: .weekOfMonth, for: first!) return firstWeekDay! - 1 } /// 当前时间的月份共有多少天 var totalDaysInThisMonth: Int { let totalDays = Calendar.current.range(of: .day, in: .month, for: self) return (totalDays?.count)! } /// 上个月份的此刻日期时间 var lastMonth: Date { var dateComponents = DateComponents() dateComponents.month = -1 let newData = Calendar.current.date(byAdding: dateComponents, to: self) return newData! } /// 下个月份的此刻日期时间 var nextMonth: Date { var dateComponents = DateComponents() dateComponents.month = +1 let newData = Calendar.current.date(byAdding: dateComponents, to: self) return newData! } } extension Date { /// the same year /// /// - Parameter date: contrast time /// - Returns: true: equal; false: not equal func haveSameYear(_ date: Date) -> Bool { return self.year == date.year } /**间隔天数 */ func betweenDays(_ date: Date) -> Int { let components = Calendar.current.dateComponents([.day], from: self, to: date) return abs(components.day ?? 0) } func haveSameYearAndMonth(_ date: Date) -> Bool { return self.haveSameYear(date) && self.month == date.month } func haveSameYearMonthAndDay(_ date: Date) -> Bool { let components1 = Date.currentCalendar().dateComponents([.year, .month, .day], from: self) let components2 = Date.currentCalendar().dateComponents([.year, .month, .day], from: date) return components1 == components2 } func haveSameYearMonthDayAndHour(_ date: Date) -> Bool { let components1 = Date.currentCalendar().dateComponents([.year, .month, .day, .hour], from: self) let components2 = Date.currentCalendar().dateComponents([.year, .month, .day, .hour], from: date) return components1 == components2 } func haveSameYearMonthDayHourAndMinute(_ date: Date) -> Bool { let components1 = Date.currentCalendar().dateComponents([.year, .month, .day, .hour, .minute], from: self) let components2 = Date.currentCalendar().dateComponents([.year, .month, .day, .hour, .minute], from: date) return components1 == components2 } func haveSameYearMonthDayHourMinuteAndSecond(_ date: Date) -> Bool { let components1 = Date.currentCalendar().dateComponents([.year, .month, .day, .hour, .minute, .second], from: self) let components2 = Date.currentCalendar().dateComponents([.year, .month, .day, .hour, .minute, .second], from: date) return components1 == components2 } } extension Date { /// the number of days in the month /// /// - Returns: number of day func numberOfDaysInMonth() -> Int { if let range = Date.currentCalendar().range(of: .day, in: .month, for: self) { return range.count } return 0 } /// 格式化时间 /// /// - Parameters: /// - formatter: 格式 yyyy-MM-dd/YYYY-MM-dd/HH:mm:ss/yyyy-MM-dd HH:mm:ss /// - Returns: 格式化后的时间 String func formatterDate(formatter: String) -> String { let dateformatter = DateFormatter() dateformatter.dateFormat = formatter let dateString = dateformatter.string(from: self) return dateString } func friendlyTime() -> String { var returnTimeString = "" let now = Date() let millisecond = CLongLong(round(self.timeIntervalSince1970*1000)) let nowMillisecond = CLongLong(round(now.timeIntervalSince1970*1000)) let lt = millisecond / 86400000 let ct = nowMillisecond / 86400000 let days = Int(ct - lt); if (days == 0) { let hour = Int((nowMillisecond - millisecond) / 3600000) if (hour == 0) { let minuts = Int((nowMillisecond - millisecond) / 60000) if minuts > 1 { returnTimeString = "\(minuts)分钟前" }else { returnTimeString = "刚刚" } }else { returnTimeString = "\(hour)小时前" } }else if (days == 1) { returnTimeString = "昨天"; } else if (days == 2) { returnTimeString = "前天 "; } else if (days > 2 && days < 31) { returnTimeString = "\(days)天前"; } else if (days >= 31 && days <= 2 * 31) { returnTimeString = "一个月前"; } else if (days > 2 * 31 && days <= 3 * 31) { returnTimeString = "2个月前"; } else if (days > 3 * 31 && days <= 4 * 31) { returnTimeString = "3个月前"; } else { returnTimeString = self.formatterDate(formatter: "yyyy-MM-dd") } return returnTimeString } }