我如何找到天数在给定的月份和年使用迅速

我想找出给定月份和年份的总天数。 示例: 我想查找 year = 2015,month = 7的总天数

44709 次浏览

Swift 5.0

func getDaysInMonth(month: Int, year: Int) -> Int? {
let calendar = Calendar.current


var startComps = DateComponents()
startComps.day = 1
startComps.month = month
startComps.year = year


var endComps = DateComponents()
endComps.day = 1
endComps.month = month == 12 ? 1 : month + 1
endComps.year = month == 12 ? year + 1 : year


        

let startDate = calendar.date(from: startComps)!
let endDate = calendar.date(from:endComps)!


        

let diff = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)


return diff.day
}
if let numberOfDays = getDaysInMonth(month: 1, year: 2015) {
print(numberOfDays)


}

Swift 2.0

func getDaysInMonth(month: Int, year: Int) -> Int
{
let calendar = NSCalendar.currentCalendar()


let startComps = NSDateComponents()
startComps.day = 1
startComps.month = month
startComps.year = year


let endComps = NSDateComponents()
endComps.day = 1
endComps.month = month == 12 ? 1 : month + 1
endComps.year = month == 12 ? year + 1 : year


let startDate = calendar.dateFromComponents(startComps)!
let endDate = calendar.dateFromComponents(endComps)!


let diff = calendar.components(NSCalendarUnit.Day, fromDate: startDate, toDate: endDate, options: NSCalendarOptions.MatchFirst)


return diff.day
}


let days = getDaysInMonth(4, year: 2015) // April 2015 has 30 days
print(days) // Prints 30

Swift 1.2

func getDaysInMonth(month: Int, year: Int) -> Int
{
let calendar = NSCalendar.currentCalendar()


let startComps = NSDateComponents()
startComps.day = 1
startComps.month = month
startComps.year = year


let endComps = NSDateComponents()
endComps.day = 1
endComps.month = month == 12 ? 1 : month + 1
endComps.year = month == 12 ? year + 1 : year


let startDate = calendar.dateFromComponents(startComps)!
let endDate = calendar.dateFromComponents(endComps)!


let diff = calendar.components(NSCalendarUnit.CalendarUnitDay, fromDate: startDate, toDate: endDate, options: NSCalendarOptions.allZeros)


return diff.day
}


let days = getDaysInMonth(4, 2015) // There were 30 days in April 2015
println(days) // Prints 30

首先为给定的年份和月份创建一个 NSDate:

let dateComponents = NSDateComponents()
dateComponents.year = 2015
dateComponents.month = 7


let calendar = NSCalendar.currentCalendar()
let date = calendar.dateFromComponents(dateComponents)!

然后使用 rangeOfUnit()方法,如 当月使用 iPhone SDK 的天数? :

// Swift 2:
let range = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: date)
// Swift 1.2:
let range = calendar.rangeOfUnit(.CalendarUnitDay, inUnit: .CalendarUnitMonth, forDate: date)


let numDays = range.length
print(numDays) // 31

Swift 3的更新(Xcode 8) :

let dateComponents = DateComponents(year: 2015, month: 7)
let calendar = Calendar.current
let date = calendar.date(from: dateComponents)!


let range = calendar.range(of: .day, in: .month, for: date)!
let numDays = range.count
print(numDays) // 31

给定一年怎么样?

以下是该日期当月的天数:

let range = userCalendar.range(of: .day, in: .year, for: Date())!
print("Days In Year: \(range.count)") // prints 31

... 而不是日期的天数,在一年中的预期:/

在扩展格式中,使用 self可以更动态地返回天数(Swift 3)。

extension Date {


func getDaysInMonth() -> Int{
let calendar = Calendar.current


let dateComponents = DateComponents(year: calendar.component(.year, from: self), month: calendar.component(.month, from: self))
let date = calendar.date(from: dateComponents)!


let range = calendar.range(of: .day, in: .month, for: date)!
let numDays = range.count


return numDays
}


}

更新为 Swift 3.1,Xcode 8 + ,iOS 10 +

let calendar = Calendar.current
let date = Date()


// Calculate start and end of the current year (or month with `.month`):
let interval = calendar.dateInterval(of: .year, for: date)! //change year it will no of days in a year , change it to month it will give no of days in a current month


// Compute difference in days:
let days = calendar.dateComponents([.day], from: interval.start, to: interval.end).day!
print(days)

为了得到给定月份和年份的天数和所有日期,请尝试这样做。

func getAllDates(month: Int, year: Int) -> [Date] {
let dateComponents = DateComponents(year: year, month: month)
let calendar = Calendar.current
let date = calendar.date(from: dateComponents)!


let range = calendar.range(of: .day, in: .month, for: date)!
let numDays = range.count
let formatter = DateFormatter()
formatter.dateFormat = "yyyy MM dd"
formatter.timeZone = TimeZone(abbreviation: "GMT+0:00")
var arrDates = [Date]()
for day in 1...numDays {
let dateString = "\(year) \(month) \(day)"
if let date = formatter.date(from: dateString) {
arrDates.append(date)
}
}


return arrDates
}

用法:

let arrDatesInGivenMonthYear = getAllDates(month: 1, year: 2018)
debugPrint(arrDatesInGivenMonthYear)
//Output: [2018-01-01 00:00:00 +0000, 2018-01-02 00:00:00 +0000, ... , 2018-01-31 00:00:00 +0000]


let numberOfDays = arrDatesInGivenMonthYear.count
debugPrint(numberOfDays)
//Output: 31

这是迅捷4.0版本

func getTotalDate(){
// choose the month and year you want to look
var dateComponents = DateComponents()
dateComponents.year = 2018
dateComponents.month = 10


let calendar = Calendar.current
let datez = calendar.date(from: dateComponents)
// change .month into .year to see the days available in the year
let interval = calendar.dateInterval(of: .month, for: datez!)!


let days = calendar.dateComponents([.day], from: interval.start, to: interval.end).day!
print(days)
}

Swift 5

另一种方法是:

extension Date {
    

func daysInMonth(_ monthNumber: Int? = nil, _ year: Int? = nil) -> Int {
var dateComponents = DateComponents()
dateComponents.year = year ?? Calendar.current.component(.year,  from: self)
dateComponents.month = monthNumber ?? Calendar.current.component(.month,  from: self)
if
let d = Calendar.current.date(from: dateComponents),
let interval = Calendar.current.dateInterval(of: .month, for: d),
let days = Calendar.current.dateComponents([.day], from: interval.start, to: interval.end).day
{ return days } else { return -1 }
}


}