天天看点

NSDate转换NSString时间误差

今天尝试把一个NSDate类型的对象转换成NSString时,遇到两个小麻烦。记录下来和大家分享。

最初的代码如下:

//错误版本1.0
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:];
[formatter setDateFormat:@"yyyy-MM-dd HH:MM"];
NSString *time = [formatter stringFromDate:date];
NSLog(@"time = %@",time);
           

转换之后发现和当前系统时间总是差了八小时,查阅资料后发现,NSDate类型的对象从时间戳获取到数据后,自动使用标准时区,所以和北京时间有误差。

设置本地时区后,问题得到初步解决。

//错误版本2.0
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:];
[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:MM"];
NSString *time = [formatter stringFromDate:date];
NSLog(@"time = %@",time);
           

打印出来time之后发现分钟数总是不对,仔细检查后发现,MM表示的是月份数,mm才是分钟,所以之前的时间格式内,其实分钟数显示的是月数。只能说自己太粗心。

//最终完美版本
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:];
[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSString *time = [formatter stringFromDate:date];
NSLog(@"time = %@",time);