0

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

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

如果您之前经历过,请帮助

4

2 回答 2

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

格式化程序还将根据当前日历考虑闰日、闰月(是的——那些退出)、夏令时、闰秒……等“奇怪”。


很棒的 WWDC 2011 视频:执行日历计算- 每个可可开发人员都必须看到。


顺便说一句:要使用 NSLog 打印对象,您不需要调用-description它来传递字符串。NSLog 将在内部执行此操作。

NSLog(@"tmp  is %@", tmp);

很好。

于 2013-03-14T19:32:27.260 回答
1

答案很简单,NSLog只需使用带有 GMT(零)时区的格式化程序将其转换NSDate为 a 。NSString

您的格式化程序默认设置为您的默认时区,可能是-4:00. 当您打印出来时,NSLog将其转换为0:00,增加 4 小时。

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

于 2013-03-14T19:44:08.003 回答