首页 > 代码库 > iOS 的时间总是比真实时间慢8小时

iOS 的时间总是比真实时间慢8小时

例如,一个北京时间"2014-4-4 22:00"(字符串),需要转换成 NSDate。字符串转换成 NSDate 一般是通过 NSDateFormatter 进行的。而在 iOS 上 NSDate 以 GMT 时间存储,因此NSDateFormatter会自动将字符串当前时区的本地时间处理,即将被转换的北京时间(字符串"2014-4-4 22:00")换成 GMT 时间("2014-4-4 14:00")。如果直接把这个 NSDate(longlong,1970以来的秒数或毫秒数)传给服务器,服务器会把这个时间当成北京时间使用(实际上它却是GMT时间),这就导致时间差了8小时。

正确的做法是在这个 NSDate 的基础上加上时差。而时差的计算需要知道当前时区。[NSTimeZonesystemTimeZone]可以得到当前时区(东8区),然后用 secondsFromGMTForDate: 方法可获得这个时区(东8区)的时差(以秒计)。代码如下:

NSDateFormatter* df=[NSDateFormatter new];//        [dfsetLocale:[NSLocale  currentLocale]];       df.dateFormat=@"yyyy-MM-dd HH:mm";        NSDate* date=[dfdateFromString:@"2014-4-4 22:00"];        NSTimeZone *zone =[NSTimeZone systemTimeZone];        NSInteger interval = [zonesecondsFromGMTForDate: date];        NSDate *localeDate =[date  dateByAddingTimeInterval:interval];       NSLog(@"%@",localeDate);

 

iOS 的时间总是比真实时间慢8小时