【问题标题】:Preferred hour format for locale in date format template日期格式模板中区域设置的首选小时格式
【发布时间】:2019-04-20 15:37:12
【问题描述】:

当使用 Foundation 的 DateFormatter 为区域设置“de”从模板生成日期格式时,如下所示:

let locale: Locale = Locale(identifier: "de")
let format = DateFormatter.dateFormat(fromTemplate: "dMMMyGhhmmss",
                                      options: 0,
                                      locale: locale)

我总是得到这种格式:

d. MMM y G, h:mm:ss a

渲染

17. Nov. 2018 n. Chr., 8:30:20 PM

'PM' 部分对于区域设置“de”来说是不寻常的,但据我了解,此方法还考虑了用户偏好。对吗?

我玩过系统偏好设置中的设置,例如切换到 24 小时制,但我所做的任何更改都没有任何效果。是否必须重新启动某些内容才能使更改生效?

谁能给我解释一下这是怎么回事?

【问题讨论】:

  • 在您的模板中将h 更改为H
  • @rmaddy 然后它还使用 24 小时格式的区域设置“en”。但是,您的评论提示我再次检查规范,我发现我可以将 h 替换为 j,这会导致格式生成器根据语言环境选择 hH
  • 很好的发现。我总是忘记j。这应该与这样的模板一起使用。您应该发布自己的答案,解释为什么 j 是正确的解决方案。

标签: swift date foundation


【解决方案1】:

如果您在模板中使用 hH,格式将包含指定的小时格式(12 小时或 24 小时),无论区域设置如何。请改用j。此符号请求区域设置的首选小时格式。

例如,给定模板dMMMyGjjmmss,我得到:

  • MMM d, y G, h:mm:ss a(12 小时格式)用于区域设置“en”
  • d. MMM y G, HH:mm:ss(24 小时格式)用于区域设置“de”

Apple's documentation 状态:

格式字符串使用 Unicode 技术标准 #35 中的格式模式。

Unicode Technical Standard #35 对符号 j 有这样的说法:

这是一个特殊用途的符号。它不得出现在模式或骨架数据中。相反,它保留用于传递给执行灵活日期模式生成的 API 的骨架中。在这种情况下,它会请求区域设置的首选小时格式(h、H、K 或 k),这取决于是否在区域设置的标准短时间格式中使用了 h、H、K 或 k。在此类 API 的实现中,在开始与 availableFormats 数据进行匹配之前,必须将“j”替换为 h、H、K 或 k。请注意,在传递给 API 的框架中使用“j”是让框架请求区域设置的首选时间周期类型(12 小时或 24 小时)的唯一方法。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2011-01-22
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多