【问题标题】:Get date with day name, date and month name获取带有日期名称、日期和月份名称的日期
【发布时间】:2021-08-21 19:20:57
【问题描述】:

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

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)

输出:

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

【问题讨论】:

  • 您是否查看过 DateFormatter 以按照您想要的方式格式化日期?
  • this 在使用 DateFormatter 时是一个有用的网站

标签: ios swift calendar dayofweek


【解决方案1】:

在上面的 cmets 的帮助下修复了它

 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)

输出:

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

【讨论】:

    【解决方案2】:

    代码

    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
    

    输出

    (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"
    

    【讨论】:

    • 打印出原始的Date 值非常危险,因为它以 UTC 格式打印日期,而不是您想要的时区。如果您想将日期转换为字符串,您必须使用带有适当时区的DateFormatter,否则您将在您的应用中引入各种错误。
    • @AdamPro13 UTC 部分从描述中的“+0000”清晰可见,这并不意味着在 UI 上显示日期。这只是为了显示您在调试器中看到的日期值。
    • 1.我不认为+0000 代表UTC 是常识。 2. OP 没有说明他们试图将这些日期用于什么目的。 3.其他不熟悉日期的人会遇到这个答案并犯这个错误。
    • 谢谢@TarunTyagi
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2011-05-28
    相关资源
    最近更新 更多