日期格式化器不能返回"HH:mm:ss"格式的日期

22

以下是代码节选:

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"。我用 "let date" 查看它的返回值,结果是空值。我在这里查找了格式代码:http://waracle.net/iphone-nsdateformatter-date-formatting-table/

实际上,代码应该是可以正常工作的。我做错了什么?

编辑:添加了整个函数

编辑2:我刚刚注意到它在 iPhone 7 iOS 10.1 模拟器上可以正常工作,但在我的 iPod 10.1.1 (2016) 上返回空值。这真的很奇怪。


2
你可能需要将格式化程序的区域设置为“en_US_POSIX”,例如请参见https://dev59.com/-nLYa4cB1Zd3GeqPX3Fj#16706425或https://dev59.com/QoPba4cB1Zd3GeqPnhUA#25671175。 - Martin R
该应用程序不会在美国使用,即使是这种情况,我也不希望它本地化为en_US。此外,我已经检查了模拟器和iPod的设置,两者都是相同的。 - muvaf
@bymafmaf:你至少尝试过它是否有所不同了吗? - Martin R
离题:如果我不理解这个语法,我该搜索什么关键词:time <- (... - shallowThought
@MartinR 我试过了,它可以工作,但返回的值与模拟器通常返回的不同。两者都是UTC,在使用en_US_POSIX的设备上向前推进1小时。 - muvaf
显示剩余5条评论
2个回答

39

引自技术问答 QA1480 - NSDateFormatter和互联网日期(强调添加):

另一方面,如果您正在处理固定格式的日期,则应先将日期格式化程序的区域设置为适合您的固定格式的内容。在大多数情况下,最好选择的语言环境是“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"

// ...

另请参阅如何处理NSDateFormatter本地化特性的最佳方法?


-1

使用示例:

let a = Date.now

let b = a.asString("yyyy-MM-dd")
let c = Date.fromString(strDate: "2023-05-30", "yyyy-MM-dd")

返回代码:

extension DateFormatter {
    static var shared = getSharedDateFormatter()
    
    fileprivate static func getSharedDateFormatter(template: String? = nil) -> DateFormatter {
        let df = DateFormatter()
        df.timeZone = .current
        df.dateFormat = template ?? "HH:mm:ss"
        
        df.amSymbol = "AM"
        df.pmSymbol = "PM"
        
        return df
    }
}

public extension Date {
    func asString(_ template: String?) -> String {
        DateFormatter.shared.dateFormat = template
        return DateFormatter.shared.string(from: self)
    }
    
    static func fromString(strDate: String, _ template: String) -> Date? {
        DateFormatter.shared.dateFormat = template
        
        return DateFormatter.shared.date(from: strDate)
    }
}

重要的事情: 这段代码不会创建很多DateFormatter实例,因此它运行非常快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接