繁体   English   中英

获取带有日期名称、日期和月份名称的日期

[英]Get date with day name, date and month name

我正在尝试创建一个带有日期名称和日期的周历。 我怎么能得到同样的东西。 我知道之前多次问过类似的问题,但我没有找到准确的答案。 目前只能获得一周的日期。 如何获取日期名称和日期。 下面是我的代码:

extension Calendar {
static let gregorian = Calendar(identifier: .gregorian)
}
extension Date {
var startingDayOfWeek: Date {
    return Calendar.gregorian.date(from: Calendar.gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
}
var daysOfWeek: [Date] {
    let startOfWeek = self.startingDayOfWeek
    return (0...6).compactMap{ Calendar.current.date(byAdding: .day, value: $0, to: startOfWeek)}
}
}

print(Date().daysOfWeek)

Output:

2021-05-29 18:30:00 +0000, 2021-05-30 18:30:00 +0000, 2021-05-31 18:30:00 +0000, 2021-06-01 18:30:00 +0000, 2021-06-02 18:30:00 +0000, 2021-06-03 18:30:00 +0000, 2021-06-04 18:30:00 +0000

修复了它,在上述评论的帮助下

 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) }
    
    let formatter = DateFormatter()
    formatter.dateFormat = "EEEE, MMM d, yyyy"//"eeee' = 'D"
    let strings = days.map { formatter.string(from: $0) }
    print(strings)

Output:

["Monday, May 31, 2021", "Tuesday, Jun 1, 2021", "Wednesday, Jun 2, 2021", "Thursday, Jun 3, 2021", "Friday, Jun 4, 2021"]

代码

public extension Calendar {
    
    struct Weekday: CustomStringConvertible {
        let date: Date
        let name: String?
        
        public var description: String {
            "\(name ?? "UNKNOWN") \(date)"
        }
    }
    
    var currentWeekDateInterval: DateInterval? {
        self.dateInterval(of: .weekOfYear, for: Date())
    }
    
    var currentWeekdays: [Weekday] {
        var weekdays: [Weekday] = []
        
        if let week = self.currentWeekDateInterval {
            let start = week.start
            let comps = self.dateComponents([.hour, .minute, .second], from: start)
            let weekdaySymbols = self.weekdaySymbols
            
            self.enumerateDates(startingAfter: start, matching: comps, matchingPolicy: .strict, using: { (nextDate, _, shouldStop) in
                
                if let nextDate = nextDate {
                    var dayName: String?
                    if var dayIndex = self.ordinality(of: .weekday, in: .weekOfYear, for: nextDate) {
                        dayIndex -= 1
                        if dayIndex >= 0, dayIndex < weekdaySymbols.count {
                            dayName = weekdaySymbols[dayIndex]
                        }
                    }
                    
                    weekdays.append(Weekday(date: nextDate, name: dayName))
                    
                    if nextDate >= week.end {
                        shouldStop = true
                    }
                }
            })
        }
        
        return weekdays
    }
    
}

用法

let weekdays = Calendar.current.currentWeekdays

Output

(lldb) po weekdays.map({ $0.description })
▿ 7 elements
  - 0 : "Monday 2021-05-30 18:30:00 +0000"
  - 1 : "Tuesday 2021-05-31 18:30:00 +0000"
  - 2 : "Wednesday 2021-06-01 18:30:00 +0000"
  - 3 : "Thursday 2021-06-02 18:30:00 +0000"
  - 4 : "Friday 2021-06-03 18:30:00 +0000"
  - 5 : "Saturday 2021-06-04 18:30:00 +0000"
  - 6 : "Sunday 2021-06-05 18:30:00 +0000"

暂无
暂无

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

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