【问题标题】:NSDate returns wrong date on the first of monthNSDate 在第一个月的第一天返回错误的日期
【发布时间】:2011-09-29 14:26:50
【问题描述】:

我的应用程序使用 [NSDate date ] 函数来获取当前日期。除了每个月的第一天上午之外,它的其他日子都可以正常工作。即按照以下步骤:

  1. 将系统日期设置为 2011 年 6 月 1 日和午夜 00:00 到凌晨 5.59 之间的时间。
  2. 使用以下代码:
    NSLog(@"Current Date :: %@",[NSDate date]);

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

Desired O/P is :: 当前日期 :: 2011-06-01 00:00:0(即设置的时间)+0000

早上 6 点开始 也可以正常工作。

这是什么原因?

实际上我不希望 NSDate 采用字符串格式,但我想要的是与当前月份的第一个日期相对应的 NSDate 日期对象。为此,我使用以下 sn-p 代码:

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;

由于 [NSDate date] 返回错误的日期,组件也包含错误的日期。上面的代码适用于所有 senario,除了我在这个线程开头发布的 senario。我该怎么办?

【问题讨论】:

  • 鉴于这些信息,我想不出为什么会这样。也许它是一个错误?

标签: ios date nsdate


【解决方案1】:

终于找到解决办法了:

关键是,NSDate 对象没有与它们相关联的时区,并且在一些版本中,Apple 中的某个人决定应该使用 NSDate 的 -description 方法,也就是 NSLog 使用的方法GMT+0 而不是输出的本地时区。 (我假设有人有一个错误,他们破坏了他们的语言环境设置,导致 NSDate 的 -description 方法崩溃,因此提交了错误报告......)

简短版:使用 NSDateFormatter 输出日期。不要使用 -description

【讨论】:

  • ... 或继承 NSDate 并编写您自己的描述方法。
  • 这就是描述中出现“+0000”的原因。
【解决方案2】:

您运行的是 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 et al woes on 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);

【讨论】:

  • 但我想要 NSDate 对象或 NSDateComponents Obj 而不是字符串。我该怎么办?
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2020-01-30
相关资源
最近更新 更多