使用 weekOfYear 从日期格式化程序中获取意外日期

Getting unexpected date from day formatter using weekOfYear

我正在尝试使用当前周开始一周,而我的 return 值是休息一周。例如,如果我输入 weekNumber 17,我预计 4 月 25 日会根据 this 进行 returned,但我会在 4 月 17 日返回。

我确实检查了以下 post,这就是我得到下面函数的地方。

func getFirstDay(WeekNumber weekNumber:Int, CurrentYear currentYear: Int)->String?{
    let Calendar = NSCalendar(calendarIdentifier: .gregorian)!
    var dayComponent = DateComponents()
    dayComponent.weekOfYear = weekNumber
    dayComponent.weekday = 1
    dayComponent.year = currentYear
    var date = Calendar.date(from: dayComponent)

    if(weekNumber == 1 && Calendar.components(.month, from: date!).month != 1){
        dayComponent.year = currentYear - 1
        date = Calendar.date(from: dayComponent)
    }
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy/MM/dd"
    return String(dateFormatter.string(from: date!))
}

有几个问题

  • 对于周数,始终使用 ISO8601 日历。
  • 对于周数,正确的年份 属性 是 yearForWeekOfYear
  • 在您的代码中,一周从星期日 (1) 开始,链接站点指的是星期一。
  • 在 Swift 中使用原生 Calendar
  • 在最后一行中,字符串初始值设定项是多余的。
  • 不要强制展开日期。

func getFirstDay(weekNumber:Int, currentYear: Int) -> String? {
    let calendar = Calendar(identifier: .iso8601)
    var dayComponent = DateComponents()
    dayComponent.weekOfYear = weekNumber
    dayComponent.yearForWeekOfYear = currentYear
    guard let date = calendar.date(from: dayComponent) else { return nil }
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy/MM/dd"
    return dateFormatter.string(from: date)
}