DateFormatter 不返回“HH:mm:ss”的日期

Posted

技术标签:

【中文标题】DateFormatter 不返回“HH:mm:ss”的日期【英文标题】:DateFormatter doesn't return date for "HH:mm:ss" 【发布时间】:2016-11-19 11:32:12 【问题描述】:

这里是代码摘录:

func mapping(map: Map) 
    time      <- (map["time"], TransformOf<Date, String>(fromJSON: 
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "HH:mm:ss"
        //dateFormatter.timeZone = TimeZone(abbreviation: "EEST")
        if let argument = $0 
            let date = dateFormatter.date(from: argument)
            return dateFormatter.date(from: argument)
        
        return nil
        

$0 是带有"22:12:00" 的字符串。我放了“让日期”看看它返回了什么,它是零。我在这里查找了格式代码:http://waracle.net/iphone-nsdateformatter-date-formatting-table/

代码应该可以实际工作。我做错了什么?

编辑:添加了整个功能

EDIT2:我刚刚注意到它在 iPhone 7 ios 10.1 模拟器上正常工作,但在我的 iPod 10.1.1 (2016) 上返回 nil。这太奇怪了。

【问题讨论】:

您可能必须将格式化程序区域设置为“en_US_POSIX”,例如参见***.com/a/16706425/1187415 或***.com/a/25671175/1187415。 该应用程序不会在美国使用,即使是这种情况,我也不希望它被本地化为 en_US。我还检查了模拟器和 ipod 的设置,两者都是一样的。 @bymafmaf:如果有影响的话,你至少尝试了吗? 离题:如果我不理解这种语法,我会用谷歌搜索什么:` time @MartinR 我试过了,但返回的值与模拟器通常返回的值不同。 UTC,在 en_US_POSIX 设备中提前 1 小时 【参考方案1】:

来自Technical Q&A QA1480 – NSDateFormatter and Internet Dates(已添加重点):

另一方面,如果您使用的是固定格式的日期,则应首先将日期格式化程序的语言环境设置为适合您的固定格式的设置。在大多数情况下,最好的语言环境选择“en_US_POSIX”,这是一个专门设计用于生成美国英语结果的区域设置,无论用户和系统偏好如何。

这将防止日期被解释为 用户的区域设置:

let dateFormatter = DateFormatter()
// Set the locale first ...
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
// ... and then the date format:
dateFormatter.dateFormat = "HH:mm:ss"

// ...

另见What is the best way to deal with the NSDateFormatter locale "feechur"?。

【讨论】:

以上是关于DateFormatter 不返回“HH:mm:ss”的日期的主要内容,如果未能解决你的问题,请参考以下文章

数据库数据库操作

DateFormatter 不转换特定日期 (Swift)

DateFormatter 返回零

Dateformatter 返回零日期

DateFormatter 返回错误的时间[重复]

Swift:DateFormatter 返回 nil