首页 > 解决方案 > Swift 日期格式化程序奇怪的问题

问题描述

开发商。我对 Swift 日期格式化程序有疑问。我正在使用 Horizo​​ntalCalendar 在 iOS 应用程序上显示日历。这就是我使用的代码。

private lazy var calendar = Calendar(identifier: .gregorian)
    private lazy var dayDateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.calendar = calendar
        dateFormatter.dateFormat = DateFormatter.dateFormat(
            fromTemplate: "EEEE, MMM d, yyyy",
            options: 0,
            locale: calendar.locale ?? Locale.current)
        return dateFormatter
    }()
    
    private func makeContent() -> CalendarViewContent {
        let calendar = Calendar(identifier: .gregorian)
        
        let startDate = calendar.date(from: DateComponents(year: Date.currentYear ?? 1, month: Date.currentMonth ?? 1, day: Date.currentDay ?? 1))!
        let endDate = calendar.date(from: DateComponents(year: (Date.currentYear ?? 1) + 1, month: 12, day: 31))!
        
        return CalendarViewContent(
            calendar: calendar,
            visibleDateRange: startDate...endDate,
            monthsLayout: .vertical(options: VerticalMonthsLayoutOptions()))
            
            .withInterMonthSpacing(24)
            .withVerticalDayMargin(8)
            .withHorizontalDayMargin(8)
            
            .withDayItemModelProvider { [weak self] day in
                let textColor: UIColor
                if #available(iOS 13.0, *) {
                    textColor = .label
                } else {
                    textColor = .black
                }
                
                let dayAccessibilityText: String?
                if let date = self?.calendar.date(from: day.components) {
                    dayAccessibilityText = self?.dayDateFormatter.string(from: date)
                } else {
                    dayAccessibilityText = nil
                }
                
                return CalendarItemModel<DayView>(
                    invariantViewProperties: .init(textColor: textColor, isSelectedStyle: self?.containsBookDate(day: day) ?? false),
                    viewModel: .init(dayText: "\(day.day)", dayAccessibilityText: dayAccessibilityText))
                
            }
    }

奇怪的是日历视图的月份字符串是“2020 M01”,“2020 M02”,......我预计会得到“2020 January”,......上面的代码只是用于自定义日视图,月份是使用格式化后的库按原样提供。

let monthHeaderDateFormatter = DateFormatter()
    monthHeaderDateFormatter.calendar = calendar
    monthHeaderDateFormatter.locale = calendar.locale
    monthHeaderDateFormatter.dateFormat = DateFormatter.dateFormat(
      fromTemplate: "MMMM yyyy",
      options: 0,
      locale: calendar.locale ?? Locale.current)

这是库的月份格式的默认代码。我已经比较了我的代码和库的示例,但没有发现差异,并在我的 iPhone 上的示例上进行了测试,它显示了预期的结果。当然,我可能会犯错误,但知道何时发生此类问题会很有帮助。欢迎任何帮助。

谢谢。

标签: iosswiftnsdateformatterdate-formatting

解决方案


只是有完全相同的问题。您可能需要更改Calendar为要使用的库创建输入的方式(此代码):

private lazy var calendar = Calendar(identifier: .gregorian)

我不能确切地说它是什么时候开始的,但是新创建的日历现在有"fixed"区域设置而不是当前的。对于这个奇怪的语言环境,日期格式错误。因此,如果您手动分配正确的语言环境,它就可以工作:

private lazy var calendar: Calendar = {
    var calendar = Calendar(identifier: .gregorian)
    calendar.locale = .current // or whatever locale you need
    return calendar
}

推荐阅读