【问题标题】:How do I find the number of days in given month and year using swift如何使用swift找到给定月份和年份的天数
【发布时间】:2015-07-23 14:28:52
【问题描述】:

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

【问题讨论】:

    标签: swift


    【解决方案1】:

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

    let dateComponents = NSDateComponents()
    dateComponents.year = 2015
    dateComponents.month = 7
    
    let calendar = NSCalendar.currentCalendar()
    let date = calendar.dateFromComponents(dateComponents)!
    

    然后使用rangeOfUnit() 方法,如中所述 Number of days in the current month using 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
    

    【讨论】:

    • 这绝对比我的干净很多。
    • 嗨,马丁可以看看这个stackoverflow.com/questions/31595260/…
    • @ShresthaAshesh:我想我不能帮你解决这个问题,抱歉。
    • 如果我们必须得到月份的所有日期怎么办
    • @MartinR 请问如果没有给出年份,我们只能从月份中获取日期吗?
    【解决方案2】:

    为 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)
    

    【讨论】:

    • 也仅限 iOS 10.0+。
    【解决方案3】:

    在扩展格式中,使用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
    }
    
    }
    

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

      • 它在 swift 1.2 上工作,但在 NScalendarUnit.CalendarUnitDay 上的 swift 2.0 (Xcode 7) 中显示错误。
      • 您应该在以后的问题中添加此类信息。
      • 感谢您的快速帮助 Pops。
      【解决方案5】:

      为了获得给定月份和年份的天数和所有日期,试试这个。

      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
      

      【讨论】:

        【解决方案6】:

        这里是swift 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)
        }
        

        【讨论】:

        • 这是这里唯一返回正确答案的答案。 calendar.range(of: .day, in: .year, for: Date())! 总是返回 31
        • @MikeHay:“...总是返回 31”——我不这么认为。如果您认为其他答案是错误的,那么我建议您对这些答案发表评论,并举一个具体的例子。
        【解决方案7】:

        斯威夫特 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 }
            }
        
        }
        

        【讨论】:

          【解决方案8】:

          那一年呢?

          下面是打印日期所在月份的天数:

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

          ...而不是预期的日期年份中的天数:/

          【讨论】:

          • 你好,也发现了这个bug,它的结果仅在iOS 10上为31,在iOS 11上可以正常工作。
          • 在 iOS 13 中不起作用(我只在 iOS 13 上检查过)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-02
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 2013-06-23
          • 1970-01-01
          相关资源
          最近更新 更多