如何在Swift 2.0中获得几分钟的时差

时间:2016-06-22 01:59:27

标签: ios swift asynchronous closures

虽然这个问题与时差有关,但我想我可能有一个异步/闭包相关的问题。

所以我通过Alamofire从iOS应用程序上的网络服务器获得了dateTime。我做了如下比较:

 let recordedDate = obj[0]["time"].stringValue //TIME FROM SERVER

 let dateFormatter = NSDateFormatter()
 dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
 let date = dateFormatter.dateFromString(recordedDate)
 let elapsedTime = (Int(NSDate().timeIntervalSinceDate(date!)) / 60 / 60) 
 //THE PROBLEM IS THAT date IS NIL. 

 if elapsedTime > 1{
    self.isActiveLabel.text = "Offline"
 }else{
   self.isActiveLabel.text = "Active"
 }

因此,根据我的故障排除,看起来日期没有完成处理,因为计算时间因此返回“发现无”问题。

在模拟器上不会发生此问题,因此排除日期真正为空的可能性。只有在设备上部署后才会出现问题。如何在日期准备好后运行epalsedTime?或者有更好的实践来实现这一目标。

感谢任何智慧或指导。

谢谢

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那基本上就是:

dateFormatter.dateFromString("2016-06-22 01:03:06 +0000")

返回nil

如果是这种情况,那是因为日期格式不匹配:

yyyy-MM-dd HH:mm:ss Z  => 2016-06-22 01:03:06 +0000
yyyy-MM-dd HH:mm:ss    => 2016-06-22 01:03:06

尝试以下代码来处理两种可能的格式:

+ (NSDate *)dateFromDateString:(NSString *)dateString {

    NSDate *date = nil;

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setLocale:[NSLocale currentLocale]];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; // or something else
    [dateFormat setTimeZone:timeZone];

    // Try two ways to cover the web server return
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    date = [dateFormat dateFromString:dateString];

    if (date == nil) {
        [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        date = [dateFormat dateFromString:dateString];
    }

    return date;
}

答案 1 :(得分:0)

好的,对于我的问题,我所要做的就是添加以下内容:

dateFormatter.locale = NSLocale(localeIdentifier: "us")

之后它完美地运作了。这是尝试和错误。如果有人能解释为什么?我很乐意将其标记为已接受的答案。

谢谢大家的指导。

参考:NSDateFormatter returns nil in swift and iOS SDK 8.0