如何通过使用任何月份和星期数swift 3获取星期开始日期和结束日期? [英] How to get week start date and end date by using any Month and week number swift 3?

查看:172
本文介绍了如何通过使用任何月份和星期数swift 3获取星期开始日期和结束日期?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have to implement graph so that I need to get week start date and weekend date if I will pass the date object and week number.

如何获得尝试过但未完全了解的信息?

How can I achieve that I tried it but didn't get exactly?

以下是我的代码:-

工作日:-

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

推荐答案

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

This returns start- and end date for a given week number and date

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设置.

Consider that print displays the dates in UTC and the start date depends on the first weekday setting of the current locale.

修改

一种用于确定每月给定星期范围的版本

A version to determine the range of a given week of month

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

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

The result type of the second version is an optional because there are a few calculations which could fail for example if the number of week in the particular month is out of range.

这篇关于如何通过使用任何月份和星期数swift 3获取星期开始日期和结束日期?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆