下面是一个代表日期的字符串
NSString *dateStr = @"2011-07-06";
当我尝试通过执行以下操作将其转换为 NSDate 时:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd"];
NSDate *tmp = [format dateFromString:dateStr];
NSLog(@"tmp is %@",[tmp description]);
我从控制台获得的是
tmp is 2011-07-06 04:00:00 +0000
我不明白为什么我得到额外的信息:04:00:00 +0000
为结果
如果你以前经历过
,请提供帮助答案 0 :(得分:2)
您的代码
NSString *dateStr = @"2011-07-06";
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd"];
NSDate *tmp = [format dateFromString:dateStr]
将生成一个NSDate对象,它表示当地时间0:00 - 当天的开始。
但是如果你打印一个普通的日期对象,它将产生一个表示GMT时区时间的字符串,因为内部所有日期都标准化为该时区。
由于您的字符串提前4个小时,我们可以说,您很可能在东欧,也许是莫斯科。
因此,如果您想在时区中看到字符串,则需要使用NSDateFormatter从日期对象创建它。
NSLog(@"tmp is %@",[formatter stringFromDate:tmp]);
检查,如果它是正确的,我所说的,改变格式以包含时间组件。
formatter.format = [@"yyyy-MM-dd HH:mm"];
NSLog(@"tmp is %@",[formatter stringFromDate:tmp]);
格式化程序也会像闰日,Leap Month(是的 - 那些退出),夏令时,Leap Seconds ...在帐户中 - 按照当前日历采取“奇怪”。
伟大的WWDC 2011视频:Performing Calendar Calculations - 每个可可开发者都必须看到。
BTW:要使用NSLog打印对象,您不需要在其上调用-description
来传入字符串。 NSLog将在内部完成此任务。
NSLog(@"tmp is %@", tmp);
很好。
答案 1 :(得分:1)
答案很简单,NSLog
只需将NSDate
转换为NSString
,使用格式化程序和GMT(零)时区。
默认情况下,您的格式化程序设置为默认时区,可能是-4:00
。打印出来后,NSLog
会将其转换为0:00
,然后再加上4小时。
通常,在不指定时区的情况下解析日期是不安全的。