【问题标题】:Convert timestamp string with epochal time and timezone into NSDate将带有纪元时间和时区的时间戳字符串转换为 NSDate
【发布时间】:2025-12-29 01:35:12
【问题描述】:

我有一个以下格式的字符串

"/Date(573465600000-0800)/"

如何将其转换为常规 NSDate 对象?

【问题讨论】:

  • 类似的问题(有答案)在这里:*.com/questions/27908219/parsing-json-date-to-swift,只是没有时区部分。
  • @Duaan:我没有给我任何错误(结果是“1988-03-04 08:00:00 +0000”)。但是,正如我所说,该代码不支持时区部分“-0800”,因此您必须添加它。
  • 错误不在 -800 部分,它在 jsonData 行中,表示在 IF 内。它没有识别那部分。我想我把扩展放在错误的地方,我试试,

标签: swift timestamp date-parsing


【解决方案1】:

斯威夫特 4

let date = Date(timeIntervalSince1970: TimeInterval(1463689800000.0))

【讨论】:

    【解决方案2】:

    第一部分“573465600000”是自 Unix 纪元以来的时间 以毫秒为单位,第二部分“-0800”是时区 规范。

    这里对Parsing JSON (date) to Swift稍作修改 这也涵盖了时区部分:

    extension NSDate {
        convenience init?(jsonDate: String) {
            let prefix = "/Date("
            let suffix = ")/"
            let scanner = NSScanner(string: jsonDate)
    
            // Check prefix:
            if scanner.scanString(prefix, intoString: nil) {
    
                // Read milliseconds part:
                var milliseconds : Int64 = 0
                if scanner.scanLongLong(&milliseconds) {
                    // Milliseconds to seconds:
                    var timeStamp = NSTimeInterval(milliseconds)/1000.0
    
                    // Read optional timezone part:
                    var timeZoneOffset : Int = 0
                    if scanner.scanInteger(&timeZoneOffset) {
                        let hours = timeZoneOffset / 100
                        let minutes = timeZoneOffset % 100
                        // Adjust timestamp according to timezone:
                        timeStamp += NSTimeInterval(3600 * hours + 60 * minutes)
                    }
    
                    // Check suffix:
                    if scanner.scanString(suffix, intoString: nil) {
                        // Success! Create NSDate and return.
                        self.init(timeIntervalSince1970: timeStamp)
                        return
                    }
                }
            }
    
            // Wrong format, return nil. (The compiler requires us to
            // do an initialization first.)
            self.init(timeIntervalSince1970: 0)
            return nil
        }
    }
    

    例子:

    if let theDate = NSDate(jsonDate: "/Date(573465600000-0800)/") {
        println(theDate)
    } else {
        println("wrong format")
    }
    

    输出:

    1988-03-04 00:00:00 +0000
    

    Swift 3 (Xcode 8) 更新:

    extension Date {
        init?(jsonDate: String) {
            let prefix = "/Date("
            let suffix = ")/"
            let scanner = Scanner(string: jsonDate)
    
            // Check prefix:
            guard scanner.scanString(prefix, into: nil)  else { return nil }
    
            // Read milliseconds part:
            var milliseconds : Int64 = 0
            guard scanner.scanInt64(&milliseconds) else { return nil }
            // Milliseconds to seconds:
            var timeStamp = TimeInterval(milliseconds)/1000.0
    
            // Read optional timezone part:
            var timeZoneOffset : Int = 0
            if scanner.scanInt(&timeZoneOffset) {
                let hours = timeZoneOffset / 100
                let minutes = timeZoneOffset % 100
                // Adjust timestamp according to timezone:
                timeStamp += TimeInterval(3600 * hours + 60 * minutes)
            }
    
            // Check suffix:
            guard scanner.scanString(suffix, into: nil) else { return nil }
    
            // Success! Create NSDate and return.
            self.init(timeIntervalSince1970: timeStamp)
        }
    }
    

    例子:

    if let theDate = Date(jsonDate: "/Date(573465600000-0800)/") {
        print(theDate)
    } else {
        print("wrong format")
    }
    

    【讨论】:

    • 非常感谢,我之前看到了您的回答,但错误是我没有将扩展程序放在正确的位置;)问题已解决。
    • let timeStampToDate = (String(describing: obj?["departTimestamp"] as!NSNumber)) as String var time = Date(jsonDate:"/Date(timeStampToDate)/") 我的时间是来零
    • @RahulGupta:那是因为字符串timeStampToDate 包含单词“可选”。您应该避免使用String(describing:...) 并正确解开选项。
    • @MartinR thnx 亲爱的,但我改变了格式,它的工作原理让 timeSt = Date(jsonDate:"/Date((timeStampToDate))/")
    【解决方案3】:
    var date:NSDate = NSDate(timeIntervalSince1970: timeInterval)
    

    【讨论】:

    • var range = str.rangeOfString( "(" )!.endIndex..
    • 请编辑您的答案,如果可行,我可以尝试正式接受它
    【解决方案4】:

    让 myTimeStamp = "1463689800000.0"

        let dateTimeStamp = NSDate(timeIntervalSince1970:Double(myTimeStamp)!/1000)  //UTC time
    
        let dateFormatter = NSDateFormatter()
        dateFormatter.timeZone = NSTimeZone.localTimeZone() //Edit
        dateFormatter.dateFormat = "yyyy-MM-dd"
        dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle
        dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
    
    
        let strDateSelect = dateFormatter.stringFromDate(dateTimeStamp)
        print(strDateSelect) //Local time
        let dateFormatter2 = NSDateFormatter()
        dateFormatter2.timeZone = NSTimeZone.localTimeZone()
        dateFormatter2.dateFormat = "yyyy-MM-dd"
    
        let date3 = dateFormatter.dateFromString(strDateSelect)
    
        datepicker.date = date3!
    

    【讨论】:

      最近更新 更多