2

我在服务器的响应中收到这种格式“/Bla(1344433014807)/”的日期。1344433014807 是从 1970 年 1 月 1 日开始的秒数。

我在我使用的网络引擎中也有这个代码:

NSDateFormatter* dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setDateFormat:dateFormat];
NSDate *date = [dateformatter dateFromString:dateString];

问题:如何指定正确的 dateFormat 以从 dateString 中获取日期,例如 @"/Bla(1344433014807)/" 甚至有可能吗?

注意:在引擎中,我无权使用 dateString 进行操作。我只能设置 dateFormat 。

4

2 回答 2

3

Apple 文档为您的查询提供了解决方案

NSDate* date = [NSDate dateWithTimeIntervalSince1970:123456789];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];
NSString *dateString = [dateFormatter stringFromDate:date]);

/Bla 部分是与实际纪元时间一起传递的不必要值,即 1344433014807。Unix 时间是 Unix 纪元是 1970 年 1 月 1 日 00:00:00 UTC 时间(或 1970-01-01T00:00:00Z ISO 8601)。参考这个

于 2012-08-28T14:28:14.810 回答
0

从Apple 文档的此页面NSDateFormatter中,您可以看到遵循Unicode Technical Standard,并且从那里您可以看到指定 unix 时间不是一个选项。

因此,您必须拆分字符串,将数字转换为 NSTimeInterval,然后将其读入 NSDate。

http://unixtimestamp.com对调试非常有帮助。您会注意到1344433014807 实际上是毫秒

这是一个 Swift 实现,因为我最终不得不自己编写它,希望它能正常工作:)

public func dateFromBlaString(string: String) -> NSDate? {
    if let rangeOfDate = string.rangeOfString("^/Bla\\(", options: .RegularExpressionSearch, range: nil, locale: nil)
        where count(string) >= count("/Bla(") { // avoid out of range error
            let startIndex = advance(string.startIndex, count("/Bla(")
            let suffix = string.substringFromIndex(startIndex) // "1344433014807)/"
            if let parenthesisRange = suffix.rangeOfString(")", options: .LiteralSearch, range: nil, locale: nil) {
                let parenthesisIndex = parenthesisRange.startIndex
                let unixTimeInMillisecondsString = suffix.substringToIndex(parenthesisIndex) // "1344433014807"
                if let unixTimeInMillisecondsDouble = NSNumberFormatter().numberFromString(unixTimeInMillisecondsString)?.doubleValue { // 1344433014807.0
                    let unixTime = NSTimeInterval(unixTimeInMillisecondsInt) / 1000
                    return NSDate(timeIntervalSince1970: unixTime)
                }
            }
    }

    return nil
}
于 2015-06-04T13:29:42.270 回答