【问题标题】:Inconsistent Date format [duplicate]日期格式不一致[重复]
【发布时间】:2017-10-26 06:58:23
【问题描述】:

Xcode 9.0.1 · Swift 4 · iPhone 5s

为了重现我在应用程序中遇到的问题,我创建了一个单视图应用程序,并将以下三行代码添加到 ViewController.viewDidLoad()

    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm"
    print(formatter.string(from: Date()))

该应用程序随后在我的 iPhone 上运行,我得到以下结果:

如果手机设置为 24 小时制(设置 > 日期和时间 > 24 小时制),代码会在控制台中打印“07:45”。

如果在设置中关闭了 24 小时制,那么控制台中将打印“7:45 am”。

问题:如何使输出与格式化程序而不是手机设置保持一致?

【问题讨论】:

    标签: ios swift date xcode9 swift4


    【解决方案1】:

    DateFormatter 默认使用系统的区域设置,但您可以自己设置以覆盖默认设置。您可以像这样设置格式化程序的语言环境:

    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm"
    formatter.locale = Locale(identifier: "en_US_POSIX") // This uses am/pm, use a different locale for 24-hour
    print(formatter.string(from: Date())) // Prints "12:23"
    

    您可以像这样强制时间格式:

    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm"
    formatter.setLocalizedDateFormatFromTemplate("HH:mm")
    print(formatter.string(from: Date())) // Prints "09:47"
    
    formatter.setLocalizedDateFormatFromTemplate("hh:mm")
    print(formatter.string(from: Date())) // Prints "9:47 AM"
    

    【讨论】:

    • 这似乎有效。尽管“en_US”语言环境支持 12 小时格式,但将其放入似乎可以使格式化程序按预期工作。 (因此,评论似乎是错误的。)我认为任何语言环境都可能使格式化程序工作。需要一些实验。谢谢。
    • 我看到将语言环境设置为任何值(有效、无效甚至是空字符串)似乎都可以解决问题。
    • @VinceO'Sullivan 在设置自定义 dateFormat 而不是 "en_US" 或其他任何内容时,您应该使用系统区域设置 "en_US_POSIX"(英语(美国,计算机))。
    • 我在答案中添加了setLocalizedDateFormatFromTemplate 的使用,我认为这就是要走的路。
    【解决方案2】:

    将 dateFormat 更改为 HH:mm aa

    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm aa"
    print(formatter.string(from: Date()))
    

    输出:(24 小时制开/关)

    上午 11:14

    【讨论】:

    • 谢谢,但我不想要那种格式。根据我的问题,我想要“HH:mm”。
    • @VinceO'Sullivan 你会得到相同的时间格式,除了你会得到上午/下午的时间。你问的是一致性,这是一个与 24 小时格式无关的开/关。为什么要投反对票?
    猜你喜欢
    • 2020-11-05
    • 2018-02-16
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多