【问题标题】:Get every days from given month of particular Year从特定年份的给定月份获取每一天
【发布时间】:2017-12-04 09:22:40
【问题描述】:

是否可以从日历组件(Swift 3)中获取给定月份和年份的每一天的日期数组

目前我只是找到一种方法来计算天数,仅此而已。

目的是开发我的自定义日历,但我被困在这个阶段......

我正在尝试编写的扩展将如下所示:

extension Date 
{
    func getAllDays() -> [Date]
}

或者类似的方法:

func getAllDays(month: Int, year: Int) -> [Date]

【问题讨论】:

    标签: ios swift date calendar


    【解决方案1】:

    终于找到了办法:

    extension Date
    {    
        mutating func addDays(n: Int)
        {
            let cal = Calendar.current
            self = cal.date(byAdding: .day, value: n, to: self)!
        }
    
        func firstDayOfTheMonth() -> Date {
            return Calendar.current.date(from:
                Calendar.current.dateComponents([.year,.month], from: self))!
        }
    
        func getAllDays() -> [Date]
        {
            var days = [Date]()
    
            let calendar = Calendar.current
    
            let range = calendar.range(of: .day, in: .month, for: self)!
    
            var day = firstDayOfTheMonth()
    
            for _ in 1...range.count
            {
                days.append(day)
                day.addDays(n: 1)
            }
    
            return days
        }
    }
    

    使用示例:

    let allDays = Date().getAllDays()
    

    输出:

    2017-06-01 22:00:00 +0000

    2017-06-02 22:00:00 +0000

    2017-06-03 22:00:00 +0000

    2017-06-04 22:00:00 +0000

    ...

    ...

    2017-06-30 22:00:00 +0000

    【讨论】:

      【解决方案2】:

      这里有更好的代码来做同样的事情

      extension Date {
      
          var startOfMonth: Date {
                  return Calendar.iso8601.date(from: Calendar.iso8601.dateComponents([.year, .month], from: self))!
              }
      
          var daysOfMonth: [Date] {
              let startOfMonth = self.startOfMonth
              let calendar = Calendar.current
              let range = calendar.range(of: .day, in: .month, for: self)!
              return range.compactMap{ calendar.date(byAdding: .day, value: $0, to: startOfMonth)}
          }
      }
      
      
      extension Calendar {
          static let iso8601 = Calendar(identifier: .iso8601)
      }
      

      【讨论】:

      • 这将从该月的第二天开始,因为范围值从 1 开始,因此您将在该月的第一天添加一天 value: $0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2019-05-03
      • 2014-11-21
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多