iOS – 正确格式化mySQL(apache)和iOS(NSDate)之间的时间戳

我正在尝试从mySQL(在apache上运行)将时间戳(yyyy-MM-dd HH:mm:ss)传递到iOS。 目前,mysql被设置为这个时区:

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

当我将这个时间戳传递给iOS时,我使用这段代码将string转换为一个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; } 

这是2013年4月17日16:33:56 mySQL时间戳的输出:

 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]]; 

然而,不pipe每年的哪个时间,任何人都可以validation它会一直保持相匹配吗? (即夏令时间等)

默认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; }