Swift 中的月份和星期名称

Name of month and week of in Swift

在 Swift 中,我需要获取月份名称和星期:

示例:6 月 2 日 - 8 日

我已经为 Date() 创建了一个扩展 class 并且我确实得到了月份名称,但它是缩写的并且星期是用 Optional() 打印出来的。

所以我这周需要这个。 2 - 8。我知道 - 可以是字符串文字,所以我不担心。

extension Date {
    func monthAsString() -> String {
        let df = DateFormatter()
        df.setLocalizedDateFormatFromTemplate("MMM")
        return df.string(from: self)
    }

    func startOfWeek() -> String? {
        let gregorian = Calendar(identifier: .gregorian)
        let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
        return String(describing: gregorian.date(byAdding: .day, value: 1, to: sunday))
    }

    func endOfWeek() -> String? {
        let gregorian = Calendar(identifier: .gregorian)
        let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))!
        return String(describing: gregorian.date(byAdding: .day, value: 7, to: sunday))

    }
}

在 UILabel 中,我需要显示如下内容:

6 月 2 日至 8 日或 9 月 22 日至 28 日

就这样。

首先,使用 "MMMM",而不是 "MMM" 来获取完整的月份名称。

接下来,除了调试之外,永远不要使用 String(describing:)

更好的解决方案是生成一周的开始和结束这两个日期。然后使用 DateIntervalFormatter 从两个日期生成一个字符串。

这是更新后的日期扩展,用于生成日期而不是字符串:

extension Date {
    func startOfWeek() -> Date? {
        let gregorian = Calendar(identifier: .gregorian)
        if let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) {
            return gregorian.date(byAdding: .day, value: 1, to: sunday)
        } else {
            return nil;
        }
    }

    func endOfWeek() -> Date? {
        let gregorian = Calendar(identifier: .gregorian)
        if let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) {
            return gregorian.date(byAdding: .day, value: 7, to: sunday)
        } else {
            return nil
        }
    }
}

下面是一个示例,展示了如何使用 DateIntervalFormatter 来获得所需的结果:

let aDate = Date()
if let sow = aDate.startOfWeek(), let eow = aDate.endOfWeek() {
    let formatter = DateIntervalFormatter()
    formatter.dateTemplate = "MMMMd"
    print(formatter.string(from: sow, to: eow))
}

输出:

September 9 - 15