首页 > 解决方案 > iOS 和 watchOS 上的本地化希伯来语日期不正确

问题描述

我正在开发一个日期/时间应用程序,该应用程序执行 Apple 没有内置到其操作系统和捆绑应用程序中的事情。

我正在利用内置类,例如DateDateFormatter对于某些部分,并且我在希伯来语本地化的希伯来日历上的日期得到了一些奇怪的结果。

如果我要求标准full、、、和格式long,一切都很好。但是当我提供一个模板供 DateFormatter 使用时,会发生一些奇怪的事情。mediumshort

三日期并发症(包含公历、希伯来和穆斯林日历上的日期)的中间行是错误的。

应该是יום א׳, ז׳ בחשון תשפ״א,因为约定是希伯来语中的希伯来日期使用希伯来数字。

产生希伯来日期的相关代码:

我们首先从设置专门的希伯来语和伊斯兰日历类的日期格式化程序的语言环境和时区开始。

    if localeIdentifier == "" {
        self.dateFormatter.locale = Locale.current
    } else {
        self.dateFormatter.locale = Locale(identifier: localeIdentifier)
    }
    self.dateFormatter.timeZone = timeZone

在处理生成正确时间的一些代码之后(实际上并未用于复杂化),我们DateFormatter根据枚举值(“majorDateFormat”)设置 's dateStyle 或日期格式;如果我们应该使用模板(case .localizedLDML),我们使用特定的字符串(“dateGeekFormat”)作为模板。

在这种情况下,我指定了一个包含工作日、日、月和年的格式,其范围足够窄,可以在不丢失信息的情况下挤入 watchOS 复杂功能。然后我们为 Date fixedNow 生成日期字符串。

   switch majorDateFormat {
    case .localizedLDML:
        let dateFormat = DateFormatter.dateFormat(fromTemplate:dateGeekFormat, options: 0, locale: self.dateFormatter.locale)!
        self.dateFormatter.setLocalizedDateFormatFromTemplate(dateFormat)

    case .none:
        self.dateFormatter.dateStyle = .none

    case .full:
        self.dateFormatter.dateStyle = .full

    case .long:
        self.dateFormatter.dateStyle = .long

    case .medium:
        self.dateFormatter.dateStyle = .medium

    case .short:
        self.dateFormatter.dateStyle = .short

    default:
        self.dateFormatter.dateStyle = .full
    } // switch majorDateFormat

    let dateString = self.dateFormatter.string(from: fixedNow)

现在奇怪的是:

  1. 对于阿拉伯伊斯兰历法,阿拉伯数字是正确产生的。

  2. 此代码实际上用于正确地用于希伯来语中的希伯来日历。

我在旧系列 0 Apple Watch 上对此没有任何问题watchOS 5,但我最近升级到运行 Apple Watch SEwatchOS 7并发现了这个问题。

有没有其他人见过这样的问题?这是Apple的一个错误,还是我错过了什么?

提前感谢任何人都可以提供的任何帮助。

标签: iosswiftlocalizationwatchoshebrew

解决方案


以下是制作“יום א׳,ז׳ בחשון תשפ״א”的方法

let formatter = DateFormatter()

formatter.calendar = Calendar(identifier: .hebrew)
formatter.locale = Locale(identifier: "he")
formatter.dateStyle = .short // must come before date format below         
formatter.setLocalizedDateFormatFromTemplate("c dd MMMM yyyy")

print(formatter.string(from: Date())) // יום א׳, ז׳ בחשון תשפ״א

推荐阅读