【问题标题】:Swift - Start day and end day of the week before previous weekSwift - 前一周的开始日和结束日
【发布时间】:2015-03-06 15:05:05
【问题描述】:

今天是 3 月 6 日星期五。如何找到 2 月 16 日是开始日,2 月 22 日是前一周的结束日。 16 是我的国家保加利亚在美国将是 15 和 21 我使用 .currentCalendar()

【问题讨论】:

    标签: swift calendar


    【解决方案1】:

    这样的事情应该可以工作:

    let cal = NSCalendar.currentCalendar()
    
    let components = NSDateComponents()
    components.weekOfYear -= 1
    
    if let date = cal.dateByAddingComponents(components, toDate: NSDate(), options: NSCalendarOptions(0)) {
        var beginningOfWeek: NSDate?
        var weekDuration = NSTimeInterval()
        if cal.rangeOfUnit(.CalendarUnitWeekOfYear, startDate: &beginningOfWeek, interval: &weekDuration, forDate: date) {
            let endOfWeek = beginningOfWeek?.dateByAddingTimeInterval(weekDuration)
            print(beginningOfWeek) // Optional(2015-02-15 05:00:00 +0000)
            print(endOfWeek) // Optional(2015-02-22 05:00:00 +0000)
        }
    }
    

    【讨论】:

    • weekOfYear -1 在一年的第一周会有问题。
    【解决方案2】:

    作为扩展的更简单的 Swift 2 替代方案,源自 Martin R's answer for getting the end of the month

    extension: NSDate {
        func startOfWeek(weekday: Int?) -> NSDate? {
            guard
                let cal: NSCalendar = NSCalendar.currentCalendar(),
                let comp: NSDateComponents = cal.components([.YearForWeekOfYear, .WeekOfYear], fromDate: self) else { return nil }
            comp.to12pm()
            cal.firstWeekday = weekday ?? 1
            return cal.dateFromComponents(comp)!
        }
    
        func endOfWeek(weekday: Int) -> NSDate? {
            guard
                let cal: NSCalendar = NSCalendar.currentCalendar(),
                let comp: NSDateComponents = cal.components([.WeekOfYear], fromDate: self) else { return nil }
            comp.weekOfYear = 1
            comp.day -= 1
            comp.to12pm()
            return cal.dateByAddingComponents(comp, toDate: self.startOfWeek(weekday)!, options: [])!
        }
    }
    

    用法:

    // Use 2 for Monday, 1 for Sunday:
    print(NSDate().startOfWeek(1)!) // "2016-01-24 08:00:00 +0000\n"
    print(NSDate().endOfWeek(1)!) // "2016-01-30 08:00:00 +0000\n"
    

    为了防止 DST 等,您还应该实施一个扩展以将时间强制为下午 12 点:

    internal extension NSDateComponents {
        func to12pm() {
            self.hour = 12
            self.minute = 0
            self.second = 0
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果有人在寻找 swift 3 答案:

      func startOfWeek(weekday: Int?) -> Date {
          var cal = Calendar.current
          var component = cal.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
          component.to12am()
          cal.firstWeekday = weekday ?? 1
          return cal.date(from: component)!
      }
      
      func endOfWeek(weekday: Int) -> Date {
          let cal = Calendar.current
          var component = DateComponents()
          component.weekOfYear = 1
          component.day = -1
          component.to12pm()
          return cal.date(byAdding: component, to: startOfWeek(weekday: weekday))!
      }
      

      我设置为当天的 00:00:00

       internal extension DateComponents {
          mutating func to12am() {
              self.hour = 0
              self.minute = 0
              self.second = 0
          }
      
          mutating func to12pm(){
              self.hour = 23
              self.minute = 59
              self.second = 59
          }
      }
      

      【讨论】:

      • endOfWeek 不应该也包括component.second = 86399吗?
      • 是的。我更改了答案以将时间设置为一天结束的 23:59:59
      • 太棒了!你能帮我弄清楚格式,所以它是“Apr 16 - Apr 23”吗?然后不是周日 - 周六,而是周一 - 周日(我可以通过给每个都添加一个“+1”来破解它,但想知道是否有更好的方法)?
      • 将 func to12am 的“self.hour”更改为 = 0 + 24,并将 to12pm 的所有设置更改为 0,以使开始/结束日期为 Mon - Sun,与 Sun 通过星期六。现在我只需要将其格式化为“Apr 17 - Apr 23”?
      • 好的,所以我将它添加到日期扩展中:func monthDay() -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MMM dd" return dateFormatter.string(from: self) } 然后将用法改为:"(String(describing: (Date().startOfWeek(weekday: 1))。 monthDay()!)) - ((Date().endOfWeek(weekday: 1)).monthDay()!)"
      【解决方案4】:

      斯威夫特 4+:

      DateComponents的帮助下主要使用Calendar的非常简单的方法:

      1. 获取Date
      2. 转到上一周
        • Calendar.current.date(byAdding: .weekdayOrdinal, value: -1, to: aDate)
      3. 获取当前工作日
        • Calendar.current.component(.weekday, from: bDate)
      4. 计算从这个工作日开始的偏移量
        • 到一周开始的负偏移量
        • 到周末到达的正偏移量
      5. 使用偏移量转到所需日期
        • Calendar.current.date(byAdding: .day, value: offset, to: bDate)

      解决方案:

      extension Date {
          var firstWeekdayOfLastWeek: Date? {
              guard let previousWeek = Calendar.current.date(byAdding: .weekdayOrdinal,
                                                             value: -1, to: self)
              else { return nil }
              
              let offsetToFirstWeekday: Int = {
                  let currentWeekday = Calendar.current.component(.weekday, from: previousWeek)
                  guard currentWeekday > 0 else { return 0 }
                  return 1 - currentWeekday
              }()
              
              let result = Calendar.current.date(byAdding: .day,
                                                 value: offsetToFirstWeekday,
                                                 to: previousWeek)
              return result
          }
          
          var lastWeekdayOfLastWeek: Date? {
              guard let previousWeek = Calendar.current.date(byAdding: .weekdayOrdinal,
                                                             value: -1, to: self)
              else { return nil }
              
              let offsetToLastWeekday: Int = {
                  let currentWeekday = Calendar.current.component(.weekday, from: previousWeek)
                  return 7 - currentWeekday
              }()
              
              let result = Calendar.current.date(byAdding: .day,
                                                 value: offsetToLastWeekday,
                                                 to: previousWeek)
              return result
          }
      }
      

      使用示例:

      let formatter = DateFormatter()
      formatter.dateStyle = .long
      
      let date = Date()
      
      //My current system date (as of time of writing)
      print(formatter.string(from: currentDate))                  //December 11, 2020
      
      //Results (my system has Sunday as the start of the week)
      print(formatter.string(from: date.firstWeekdayOfLastWeek!)) //November 29, 2020
      print(formatter.string(from: date.lastWeekdayOfLastWeek!))  //December 5, 2020
      

      强制展开仅用于示例目的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 1970-01-01
        • 2012-07-23
        相关资源
        最近更新 更多