NSDate在月份的第一天返回错误的日期

Sam*_*hah 5 date nsdate ios

我的应用程序使用[NSDate date]函数来获取当前日期.除了AM,每个月的第一天除外,其他工作都很好.即遵循以下步骤:

  1. 将系统日期设置为2011年6月1日至2011年6月5日至上午5点59分.
  2. 使用以下代码:
    NSLog(@"Current Date :: %@",[NSDate date]);

O/P是:: Current Date :: 2011-05-31 19:40:21 +0000

期望的O/P是::当前日期:: 2011-06-01 00:00:0(设定的时间)+0000

早上6点起,它工作正常.

这是什么原因?

实际上我不想要字符串格式的NSDate,但我想要的是与当月第一个日期对应的NSDate日期对象.为此我使用以下代码片段:

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;
Run Code Online (Sandbox Code Playgroud)

由于[NSDate date]返回错误的日期,因此组件也包含错误的日期.以上代码适用于所有senario,除了我在此主题开头发布的senario.我该怎么办?

BP.*_*BP. 0

您运行的是 iOS 版本 4.2 吗?如果是这样,则日期方法存在某种问题,它似乎不尊重您当地的时区。例如,如果我在 iOS 4.0 模拟器中运行您的代码,我会得到以下输出:

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

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

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

这是另一篇 SO 帖子,更详细地描述了这一点:

NSDate 等人在 iOS 4.2 上遭遇困境

如果您只是在 NSString 中查找当前日期和时间,我使用如下所示的代码来完成该任务:

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);
Run Code Online (Sandbox Code Playgroud)