在第一个月,NSDate返回错误的date

我的应用程序使用[NSDatedate]函数获取当前date。 上午除了每个月的第一天外其他日子的工作都很好。 即遵循以下步骤:

  1. 将系统date设置为01 – 2011年6月和00.00午夜至5.59 AM之间的时间。
  2. 使用以下代码:
    NSLog(@"Current Date :: %@",[NSDate date]);

O / P是::当前date:: 2011-05-31 19:40:21 +0000

所需的O / P是::当前date:: 2011-06-01 00:00:00(即所设定的时间)+0000

也从6上午它工作正常。

这是什么原因?

其实我不希望string格式的NSDate,但我想要的是NSDatedate对象对应于当前月份的第一个date。 为此,我使用下面的代码片段:

 NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; [gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDatedate]]; [comp setDay:1]; NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp]; [gregorian release]; return firstDayOfMonthDate; 

由于[NSDatedate]返回错误的date,组件也包含错误的date。 上面的代码适用于所有senario,除了我在本主题开始处发布的senario之外。 我该怎么办?

终于得到了解决办法:

问题是, NSDate对象没有与它们相关联的时区 ,并且在苹果公司发布的一些人认为NSDate的-description方法是NSLog使用的,应该使用GMT + 0而不是本地时区输出。 (我认为有人有一个错误,他们损坏了他们的语言环境设置,并导致NSDate的-description方法崩溃,所以错误报告被提交…)

短版本: 使用NSDateFormatter输出date。 不要使用-description

你正在运行的iOS版本4.2? 如果是这样,date方法有一些问题,它似乎并不尊重你的本地时区。 例如,如果我在iOS 4.0模拟器中运行你的代码,我得到这个输出:

Current Date :: 2011-07-06 10:43:38 -0400

但是,如果我在iOS 4.2模拟器中运行它,我得到这个:

Current Date :: 2011-07-06 14:44:18 +0000

这是另一个SOpost,更详细地描述了这一点:

NSDate等人在iOS 4.2上遇到困难

如果您只是在NSString中查找当前的date和时间,我使用这样的代码来完成这个任务:

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; [formatter setDateStyle:NSDateFormatterShortStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; NSString *result = [formatter stringFromDate:[NSDate date]]; [formatter release]; NSLog(@"Current Date v2 :: %@",result);