【问题标题】:Generate NSDate from day, month, and year从日、月、年生成 NSDate
【发布时间】:2011-12-01 15:53:36
【问题描述】:

我正在尝试从月日和年生成 NSDate(全部为整数格式)。

现在我的尝试是这样的:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
NSNumber *day = [dataSource valueForKey:@"day"];
NSNumber *month = [dataSource valueForKey:@"month"];
NSNumber *year = [dataSource valueForKey:@"year"];
[components setDay:[day intValue]];
[components setMonth:[month intValue]];
[components setMonth:[year intValue]];
NSDate *_date = [calendar dateFromComponents:components];

但是,当日 = 24、月 = 8、年 = 2011 时,_date 会输出以下内容:

0168-07-25 04:56:02 +0000

我一定做错了什么,但我不知道是什么。有人知道会发生什么吗?

【问题讨论】:

  • 2016 年底来到这里,这个问题仍然很有帮助。鉴于对此有 30 票有用的投票,如果可能,我会投票重新开放。此外,在查看他们的个人资料的顶部标签中,没有一个密切的选民在他们的顶部标签中使用 Objective-c、iOS、cocoa-touch、cocoa、nsdate。

标签: objective-c ios cocoa-touch cocoa nsdate


【解决方案1】:

您的代码中有错字:(最后一行应该是setYear:

 [components setDay:[day intValue]];
 [components setMonth:[month intValue]];
 [components setYear:[year intValue]];

【讨论】:

  • 是的,当你把事情分开时,它几乎可以解决——虽然不清楚为什么一年是 168 对 167,或者为什么一天是 25 对 24。但是可怜的 NSDateComponents 对象毫无疑问非常困惑。
  • (由于未能将 timeZone 设置为 GMT,这一天可能会关闭。)
  • 谢谢!绝对需要另一双眼睛(或另一壶咖啡):)
  • 日期已取消,因为当您使用古代年份时,事情会变得很奇怪。在 Apple 框架中使用的日历的整个使用过程中进行了许多细微的更正。有兴趣的可以看看here
【解决方案2】:

您调用 setMonth 两次,第二次使用 year 的值。应该是:

[components setDay:[day intValue]];
[components setMonth:[month intValue]];
[components setYear:[year intValue]];

【讨论】:

    【解决方案3】:

    一个明显的故障是:

    [components setMonth:[year intValue]];    //setting month with year!
    

    【讨论】:

      【解决方案4】:

      除了现在的拼写错误(2019 年)之外,还有一种更方便的语法可以通过键订阅和点符号访问字典值

      NSCalendar *calendar = [NSCalendar currentCalendar];
      NSDateComponents *components = [[NSDateComponents alloc] init];
      NSNumber *day = dataSource[@"day"];
      NSNumber *month = dataSource[@"month"];
      NSNumber *year = dataSource[@"year"];
      components.day = day.integerValue;
      components.month = month.integerValue;
      components.year = year.integerValue;
      NSDate *_date = [calendar dateFromComponents:components];
      

      还有另一个没有日期组件的 API

      NSCalendar *calendar = [NSCalendar currentCalendar];
      NSNumber *day = dataSource[@"day"];
      NSNumber *month = dataSource[@"month"];
      NSNumber *year = dataSource[@"year"];
      NSDate *_date = [calendar dateWithEra:1 year:year.integerValue month:month.integerValue day:day.integerValue hour:0 minute:0 second:0 nanosecond:0];
      

      【讨论】:

        猜你喜欢
        • 2011-04-11
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多