2013-04-17 27 views
1

我试图从mySQL(运行在Apache上)将时间戳(yyyy-MM-dd HH:mm:ss)传递给iOS。目前,MySQL是设置到这个时区:iOS - 正确格式化MySQL(apache)和iOS(NSDate)之间的时间戳

default-time-zone='+00:00' 

当我下通过这个时间戳到iOS,我使用此代码字符串转换为一个NSDate:

-(NSDate *)formatDateWithString:(NSString *)dateString{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSDate* date = [dateFormatter dateFromString:dateString]; 
    NSLog(@"Formatted Timestamp: %@ - Original Timestamp: %@", date,dateString); 
    return date; 
} 

这是一个输出mySQL时间戳2013-04-17 16:33:56:

Formatted Timestamp: 2013-04-17 23:33:56 +0000 - Original Timestamp: 2013-04-17 16:33:56 

为什么iOS会添加7个小时? (仅供参考 - 我位于加利福尼亚州的旧金山,所以我确信它与我的时区是PDT有关,只是不确定为什么它会在我没有指定的情况下进行转换)。

在我的应用程序中使用最“普遍”的时间戳是非常重要的,因为我可能有全世界的用户,并且不想大量转换。我希望能够将时间戳存储在mySQL中,然后比较存储的服务器时间戳和当前服务器时间戳之间的差异。如果可能,每次需要进行比较时,我宁愿不必使用Web请求来获取“服务器时间”。

UPDATE

通过添加此行代码我dateFormatter,似乎两次,现在匹配正确:

[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

但是,任何人都可以验证它会一直继续匹配,无论一年中的哪个时间? (即夏令时间等)

回答

3

默认情况下,NSDateFormatter设置为localTimeZone。由于dateString没有时区信息,因此它计算了到localTimeZone的时间。如果您知道dateString的时区是UTC,那么您需要将其设置为dateFormatter。

NSDate表示绝对时间,该表示可以改变时区,但它是唯一值,并且不受夏时制的影响。

-(NSDate *)formatDateWithString:(NSString *)dateString{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
    NSDate* date = [dateFormatter dateFromString:dateString]; 
    NSLog(@"Formatted Timestamp: %@ - Original Timestamp: %@", date,dateString); 
    return date; 
} 
+0

是的,这是我发布后不久的结论。你能证实这些时间总是正确匹配吗? (即不会因夏时制等原因而改变) – JimmyJammed

+0

@JamesHickman我不太清楚夏令时。但这一直对我有效。如果您可以控制dateFormat,则可以将datezone格式的信息添加到dateFormat中,例如+0700或+0000,以获得更大的灵活性。这篇文章将是一个很好的指针http://stackoverflow.com/a/6866992/767730 – Anupdas

+0

好吧,从我的收集看来,UTC不受任何夏令时或其他季节变化的影响。幸运的是,我只需要显示我应用中任意两个日期之间的时间差异,因此我不需要为每个时区显示确切的时间。 – JimmyJammed