繁体   English   中英

如何使用任何月份和周数 swift 3 获取周开始日期和结束日期?

[英]How to get week start date and end date by using any Month and week number swift 3?

如果我要传递日期对象和周数,我必须实现图形,以便我需要获取周开始日期和周末日期。

我怎样才能做到我尝试过但没有完全得到?

下面是我的代码:-

工作日:-

//Day of week
func getDayOfWeek(today:String)->Int? {
    let formatter  = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    if let todayDate = formatter.date(from: today) {
        let myCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
        let myComponents = myCalendar.components(.weekday, from: todayDate)
        let weekDay = myComponents.weekday
        return weekDay
    } else {
        return nil
    }
}. 

extension Date {
  var millisecondsSince1970:Int {
      return Int((self.timeIntervalSince1970 * 1000.0).rounded())
  }

  init(milliseconds:Int) {
      self = Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000))
  }

  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))!
   }
}

  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
  }
}

这将返回给定周数和日期的开始和结束日期

func dayRangeOf(weekOfYear: Int, for date: Date) -> Range<Date>
{
    let calendar = Calendar.current
    let year = calendar.component(.yearForWeekOfYear, from: date)
    let startComponents = DateComponents(weekOfYear: weekOfYear, yearForWeekOfYear: year)
    let startDate = calendar.date(from: startComponents)!
    let endComponents = DateComponents(day:7, second: -1)
    let endDate = calendar.date(byAdding: endComponents, to: startDate)!
    return startDate..<endDate
}

print(dayRangeOf(weekOfYear: 12, for: Date()))

考虑到print以 UTC 显示日期,并且开始日期取决于当前语言环境的first weekday设置。

编辑

确定月份中给定周范围的版本

func dayRangeOf(weekOfMonth: Int, year: Int, month: Int) -> Range<Date>? {
    let calendar = Calendar.current
    guard let startOfMonth = calendar.date(from: DateComponents(year:year, month:month)) else { return nil }
    var startDate = Date()
    if weekOfMonth == 1 {
        var interval = TimeInterval()
        guard calendar.dateInterval(of: .weekOfMonth, start: &startDate, interval: &interval, for: startOfMonth) else { return nil }
    } else {
        let nextComponents = DateComponents(year: year, month: month, weekOfMonth: weekOfMonth)
        guard let weekStartDate = calendar.nextDate(after: startOfMonth, matching: nextComponents, matchingPolicy: .nextTime) else {
            return nil
        }
        startDate = weekStartDate
    }
    let endComponents = DateComponents(day:7, second: -1)
    let endDate = calendar.date(byAdding: endComponents, to: startDate)!
    return startDate..<endDate
}

print(dayRangeOf(weekOfMonth: 5, year: 2017, month: 6))

第二个版本的结果类型是可选的,因为有一些计算可能会失败,例如,如果特定月份的周数超出范围。

对于对此感兴趣的任何人,看起来 OP 混淆了 weekOfMonth 和 weekOfYear ......

//: Playground - noun: a place where people can play

import UIKit

var str = "Hello, playground"

let cal = Calendar.current


let dateComponents = DateComponents(year: 2018, month: 3, day: 15)
let date = cal.date(from: dateComponents)!

func weekOfMonthStart(forDate date: Date) -> Date {
    var compsToWeekOfMonth = cal.dateComponents([.year, .month, .weekOfYear], from: date)
    compsToWeekOfMonth.day = cal.range(of: .day, in: .weekOfMonth, for: date)?.lowerBound
    return cal.date(from: compsToWeekOfMonth)!
}

有人提到了一个会失败的答案,所以包含了一个测试;)

for i in 0...5000 {
    let newDate = cal.date(byAdding: DateComponents(day:i), to: date)!
    weekOfMonthStart(forDate: newDate)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM