从字符串,nsdate,objective c解析日期

时间:2013-03-14 19:16:38

标签: objective-c nsdate nsdateformatter

下面是一个代表日期的字符串

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为结果

如果你以前经历过

,请提供帮助

2 个答案:

答案 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小时。

通常,在不指定时区的情况下解析日期是不安全的。