iPr*_*ram 3 calendar date swift
我正在申请,我需要在本周的所有日子里获得当天的一天.为实现这一目标,我正在寻找类似于下面的结果(今天是3月23日星期四)
Monday = 79
Tuesday = 80
Wednesday = 81
Thursday = 82
Friday = 83
Run Code Online (Sandbox Code Playgroud)
可以包括周六和周日,但我的应用程序只需要工作日而不是周末.今天是第82天
Rob*_*Rob 13
要获得一周的工作日,它是:
let calendar = Calendar.current
let today = calendar.startOfDay(for: Date())
let dayOfWeek = calendar.component(.weekday, from: today)
let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: today)!
let days = (weekdays.lowerBound ..< weekdays.upperBound)
.compactMap { calendar.date(byAdding: .day, value: $0 - dayOfWeek, to: today) } // use `flatMap` in Xcode versions before 9.3
.filter { !calendar.isDateInWeekend($0) }
Run Code Online (Sandbox Code Playgroud)
要显示为"星期四= 82",它就是
let formatter = DateFormatter()
formatter.dateFormat = "eeee' = 'D"
for date in days {
print(formatter.string(from: date))
}
Run Code Online (Sandbox Code Playgroud)
要么
let strings = days.map { formatter.string(from: $0) }
Run Code Online (Sandbox Code Playgroud)
我在调整 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
Run Code Online (Sandbox Code Playgroud)
您还可以像这样使用 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
}
Run Code Online (Sandbox Code Playgroud)
我在 Calendar 上做了一个小扩展,这可能对其他寻找更多功能解决方案的人有所帮助。
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 }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4646 次 |
| 最近记录: |