【问题标题】:iOS and Objective-C: Repeating an event every quarteriOS 和 Objective-C:每季度重复一个事件
【发布时间】:2012-07-26 20:01:48
【问题描述】:

我需要每“季度”重复一次事件(我认为这意味着大约提前 3 个月)。所以我可以期待这会改变日期(但它不会):

    NSDateComponents *component = [[NSDateComponents alloc] init]; // quarter
    component.quarter = 1;

    self.todoStartDate = [[NSCalendar currentCalendar] dateByAddingComponents: component toDate:self.todoStartDate options: 0];

在日期中添加“季度”有什么问题吗?添加一天或一周时效果很好,但不适用于“季度”。

【问题讨论】:

  • 也许您可以简单地使用四个不同月份的第一天,例如一月、四月、七月和十月(取决于您是否专门使用公历等)
  • 谢谢。就是这样:我不想假设用户设置了哪个日历。我宁愿让基础类来处理这个计算。但它似乎没有这样做,我找不到更多关于它的文档。

标签: objective-c nsdate foundation


【解决方案1】:

(我希望我可以将其添加为对 applefreak 答案的格式化评论,这是一个非常好的评论。但是 SO 不允许在 cmets 中进行标记。)

Apple's documentation for NSCalendar 说:

此 API 表示的某些日历可能必须映射其基本 单位概念转化为年/月/周/日/……命名法。例如,一个 日历由一年中的 4 个季度而不是 12 个月组成 代表季度的月份单位。

现在,这可能更清楚了,但我认为 Apple 所说的是普通日历根本没有“季度”;它们只有年、月(其中 12 个)和日。但是你可以继承NSCalendar(或者创建一个NSCalendar的新实例?)这样一年只有4个月,然后把这些月份称为“季度”,为了这些子类的利益,Apple预先定义了quarter 财产。这非常令人困惑;我敢打赌,Apple 的 WTFery 背后有一个好故事。

无论如何,我同意 applefreak 的观点,即无论如何你都应该处理年/月/日日期,而不是与神话中的“季度”混为一谈。毕竟,考虑到第三季度比第一季度短,“添加”(比方说,到 3 月 31 日的两个季度)甚至 意味着 是什么意思? (答案是否取决于这是否是闰年?)

如果您真正想要的是“每年 1 月 1 日、4 月 1 日、7 月 1 日和 10 月 1 日重复发生的事件”,那么您应该写 that。更别提“加三个月”了,这和“加四分之一”有同样的问题。

顺便说一句,这里的其他人也注意到了quarter WTF。例如:I want to get a quarter value in NSDateComponents class

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,不知道为什么季度不起作用,所以通过逐月替换 * 3 来解决问题。以下演示如何将四分之三倒退:

            NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
            NSCalendar *theCalendar = [NSCalendar currentCalendar];
    
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            dateFormatter.dateFormat = @"QQQ yyyy";
            NSDate *currentDate = [NSDate date];
    
            for (int i = -2; i <= 0; i++) {
                //dayComponent.quarter = i;
                dayComponent.month = i*3;
    
                NSDate *date = [theCalendar dateByAddingComponents:dayComponent toDate:currentDate options:0];
    
                NSString *dateString = [dateFormatter stringFromDate:date];
    
                NSLog(@"date = %@", dateString);
            }
    

    我希望这一切都会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 2017-03-28
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多