【问题标题】:NSCalendar dateFromComponents returns wrong value when using weeksNSCalendar dateFromComponents 在使用周时返回错误值
【发布时间】:2013-05-21 15:21:22
【问题描述】:

所以我尝试获取这周的日期范围。

当我得到当前日期组件(只有年份和日期)时,这些是值:

我注意到在一周前写了“Obsolescent”。尝试搜索苹果文档,但一无所获。

然后我尝试使用当前日历(或公历,相同的值)获取 NSDate,但我得到的值是:

所以几周被忽略了。所以我在我的组件中增加了几个月零一周的时间,并且有了这样的组件:

然后我试图摆脱我的约会,这就是我得到的:

现在显然周组件在这里被忽略了。为什么呢?是否已弃用?还是有什么BUG?

【问题讨论】:

  • 插入代码,而不是图像。帖子上的{} 按钮将很好地格式化代码。对于值,请执行po endDate,例如,在控制台中以文本形式列出值。
  • 好的,从现在开始就这样做。我只是用图像来证明值是准确的(我确实看到很多人回答“你真的得到了正确的值吗?”)。

标签: iphone ios xcode nsdate


【解决方案1】:

所以我终于找到了解决办法。

如果您只是设置工作日,似乎一切都解决了(开始工作):

[startDate setWeekday:1];

然后正确返回带有星期的日期。

不知道在没有设置weekday的情况下忽略week组件是否仍然是一个bug。

【讨论】:

    【解决方案2】:

    要计算一周的开始结束日期,NSCalendarrangeOfUnit:startDate:interval:forDate: 方法非常有用:

    NSDate *now = [NSDate date];
    
    NSDate *startOfWeek;
    NSTimeInterval length;
    [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit
                                    startDate:&startOfWeek
                                     interval:&length
                                      forDate:now];
    NSDate *endOfWeek = [startOfWeek dateByAddingTimeInterval:length];
    NSLog(@"%@", startOfWeek);
    NSLog(@"%@", endOfWeek);
    

    要计算一周前的同一日期,请使用dateByAddingComponents

    NSDate *now = [NSDate date];
    NSDateComponents *comp = [[NSDateComponents alloc] init];
    [comp setWeek:-1]; // One week back in time
    NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:now options:0];
    NSLog(@"%@", now);
    NSLog(@"%@", date);
    

    【讨论】:

    • 是的,您的解决方案有效。所以我看到 datebyAddingComponents with week 工作但 dateFromComponents with week 不起作用。这对我来说听起来像是一个错误。
    【解决方案3】:

    即使我的问题没有答案,我也会发布我使用的这个问题的解决方案。

    所以我花了几周时间将它们乘以 7。这给了我当前的周末结束日期。我知道这不好,因为几周可以设置不同的日期等。但是对于我最默认的问题(公历日历,每周 7 天),这个解决方案是现有日期时间计算器中的快速解决方法。

    [components setDay:components.week * 7 - 7];                                //Start of week
            startDate = [[NSCalendar currentCalendar] dateFromComponents:components];
            [components setDay:components.day + 7];                                     //End of week
            endDate = [[NSCalendar currentCalendar] dateFromComponents:components];
            [components setDay:0];                                                      //I am using this not just here so i am setting back my changes
    

    【讨论】:

    • 所以你的任务是计算本周的开始和结束时间?
    • 我的任务是生成两个日期,这将定义“今天”、“昨天”或“一周前的同一天”的含义。所以答案是±是的
    • 也许您可以发布一个完整的代码示例,其中包含输入和输出。然后我们也许可以指出是否有“更好”的解决方案。
    • 好吧,我不能向您发布代码本身(严格的政策),但我只能说输入是一个字符串,它定义了一些“移动日期”,例如“昨天”、“SameDayWeekBefore”、“LastWeek” , "SameWeekYearBefore" 等,如果您要在 5 月 17 日计算“昨天”,则输出是表示字符串的日期,例如 May 2013 16 00:00 - 23:59。检测、计算,一切正常。我处理半年,季度(NSQuarterCalendarUnit 不起作用,苹果错误)等等。一周是这里唯一的问题。我测试了它,它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多