【问题标题】:How to get all days in current week in swift如何快速获取本周的所有天数
【发布时间】:2017-03-23 16:22:24
【问题描述】:

我正在申请,我需要获取当前一周中所有日子的一年中的哪一天。 为此,我正在寻找类似于以下的结果(今天是 3 月 23 日星期四)

Monday = 79
Tuesday = 80
Wednesday = 81
Thursday = 82
Friday = 83

可以包括周六和周日,但是我的申请只需要工作日而不是周末。今天是第82天

【问题讨论】:

  • 您还没有编写任何您尝试过的代码。因此,这不是最好的问题,但请查看NSDateFormatter Info。此外,如果您想知道的话,二月份还有 year % 4 == 0 ? year % 100 == 0 ? year % 200 == 0 ? 29 : 28 : 29 : 28 天。
  • 我感觉这篇wiki 文章也会有所帮助。我不想为它编写任何代码,但你让我研究了不同的方式。我相信 Calendar 有一些简单的方法可以实现这一点,而无需深入挖掘。

标签: swift date calendar


【解决方案1】:

要获得一周的工作日,它是:

let calendar = Calendar.current
let today = calendar.startOfDay(for: Date())
let dayOfWeek = calendar.component(.weekday, from: today)
let days = calendar.range(of: .weekday, in: .weekOfYear, for: today)!
    .compactMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) }
    .filter { !calendar.isDateInWeekend($0) }

要将其显示为“Thursday = 82”,则为

let formatter = DateFormatter()
formatter.dateFormat = "eeee' = 'D"
for date in days {
    print(formatter.string(from: date))
}

或者

let strings = days.map { formatter.string(from: $0) }

【讨论】:

  • 所以如果我想把它作为一个变量,我会的。一定要获取日历组件?
  • 如果你想要一个包含这些字符串的数组,你会失去for 循环而只需要let strings = days.map { formatter.string(from: $0) }
  • 我将如何在当月的所有日子里这样做?
  • @Rob 为什么不只是weekdays.compactMap?遍历 Range 时,无论如何都不包括上限。
  • 或者像上面一样完全退休weekdays
【解决方案2】:

我在调整 Rob 的解决方案以适应星期一开始的一周时遇到了问题。此解决方案适用于您的 calendar.firstWeekday 设置。

var calendar = Calendar.autoupdatingCurrent
calendar.firstWeekday = 2 // Start on Monday (or 1 for Sunday)
let today = calendar.startOfDay(for: Date())
var week = [Date]()
if let weekInterval = calendar.dateInterval(of: .weekOfYear, for: today) {
    for i in 0...6 {
        if let day = calendar.date(byAdding: .day, value: i, to: weekInterval.start) {
            week += [day]
        }
    }
}
return week

【讨论】:

  • 我相信 firstWeekday 根据设置的区域返回正确的数字。这就是为什么你要使用Calendar.currentCalendar.autoupdatingCurrent
  • calendar.local = Locale(identifier: "ES") 为例。
【解决方案3】:

你也可以像这样使用 enumerateDates:

func getAllDaysOfTheCurrentWeek() -> [Date] {
    var dates: [Date] = []
    guard let dateInterval = Calendar.current.dateInterval(of: .weekOfYear,
                                                           for: Date()) else {
        return dates
    }
    
    Calendar.current.enumerateDates(startingAfter: dateInterval.start,
                                    matching: DateComponents(hour:0),
                                    matchingPolicy: .nextTime) { date, _, stop in
            guard let date = date else {
                return
            }
            if date <= dateInterval.end {
                dates.append(date)
            } else {
                stop = true
            }
    }
    
    return dates
}

【讨论】:

  • 它每周返回 6 天。
  • @ShourobDatta 已修复。
【解决方案4】:

我在日历上做了一个小扩展,这可能对其他寻求更实用解决方案的人有所帮助。

import Foundation

extension Calendar {
  func intervalOfWeek(for date: Date) -> DateInterval? {
    dateInterval(of: .weekOfYear, for: date)
  }

  func startOfWeek(for date: Date) -> Date? {
    intervalOfWeek(for: date)?.start
  }

  func daysWithSameWeekOfYear(as date: Date) -> [Date] {
    guard let startOfWeek = startOfWeek(for: date) else {
      return []
    }

    return (0 ... 6).reduce(into: []) { result, daysToAdd in
      result.append(Calendar.current.date(byAdding: .day, value: daysToAdd, to: startOfWeek))
    }
    .compactMap { $0 }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 2016-01-28
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2017-04-15
    • 2013-06-21
    相关资源
    最近更新 更多