ios - Swift 日期格式化程序奇怪的问题
问题描述
开发商。我对 Swift 日期格式化程序有疑问。我正在使用 HorizontalCalendar 在 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 上的示例上进行了测试,它显示了预期的结果。当然,我可能会犯错误,但知道何时发生此类问题会很有帮助。欢迎任何帮助。
谢谢。
解决方案
只是有完全相同的问题。您可能需要更改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
}
推荐阅读
- sql - 如何在有 3 名或更多乘客的预订中与 sql 一起列出预订参考代码和乘客姓名
- git - gitignore 忽略二级目录中除 config.xml 文件之外的所有文件?
- c - 如何在 C 中将文本从一个文件复制到另一个文件?
- angular - 将较旧的 Angular 版本迁移到较新的 Angular 版本
- python - 无法重塑数组
- python - 我们如何使用 python 连接器连接到雪花
- tensorflow - Bazel 使用 tensorflow(或仅使用 tbb)作为外部依赖项具有“Make”Variables not defined 错误
- python - 用于动态变量的列表 - 与第一个和最后一个字符串一起传递的额外字符
- javascript - 节点中的空数组
- python - keras 根据列添加起始权重