【问题标题】:Getting the first date of current quarter获取当前季度的第一个日期
【发布时间】:2014-05-15 15:44:59
【问题描述】:

我正在尝试获取当前季度的第一个和最后一个日期,我正在使用它:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitQuarter | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];

components.quarter = 1;

funStartDate = [[NSCalendar currentCalendar] dateFromComponents: components];
NSLog(@"First day of quater: %@", funStartDate);

[components setQuarter:[components quarter]+1];

funEndDate = [[NSCalendar currentCalendar] dateFromComponents: components];
NSLog(@"Last day of quater: %@", [funEndDate descriptionWithLocale:[NSLocale currentLocale]]);

但是在两个控制台打印中我都看到了今天的日期。我做错了什么?

【问题讨论】:

  • 由于您的组件中有日、月和年,因此季度被认为是多余的(并且不一致)并被忽略。 (我只会在月份中添加 3 ——当然,在年底“换行”。)(或者,可能更好,使用 dateByAddingCompoonents。)
  • 记录quarter的值。这个功能还有效吗?不,它不是:stackoverflow.com/questions/11618784/… 所以放弃让你的代码以这种方式工作的所有希望。
  • 其实,@HotLicks,没有必要“包装”年份。将 3 添加到月份组件将正常工作。日期组件(是)进行日历算术的正确方法。
  • 我已经更新了我的答案。如果对您有帮助,请告诉我。

标签: ios nsdate nscalendar


【解决方案1】:

更新:我发现 Apple 在 iOS 7.1 中仍然存在四分之一单位的错误,因此请避免在日期组件中使用此单位。

我在这里为你找到了可行的解决方案:

一个季度的第一天:

    NSDate *date = <whatever>;
    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    NSDate *startOfQuarter;
    [currentCalendar rangeOfUnit: NSQuarterCalendarUnit
                       startDate: &startOfQuarter
                        interval: NULL
                         forDate: date];
    NSLog(@"quarter starts at %@", startOfQuarter);

一个季度的最后一天:

    NSDateComponents* comps = [currentCalendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay)
                                                 fromDate:date];
    NSUInteger quartalNum = (comps.month - 1) / 3 + 1;
    NSUInteger lastQuartalMonthNum = quartalNum * 3;
    NSUInteger nextQuartalFirstMonth = lastQuartalMonthNum + 1
    [comps setMonth: nextQuartalFirstMonth];
    [comps setDay: 0]; // with 0 day we get last day of previous month

    NSLog(@"quarter ends at %@",  [currentCalendar dateFromComponents: comps]);

【讨论】:

  • 它不起作用我有一个错误:Calendar 类型的值没有成员 rangeOfUnit
  • @AdamSmaka 相当于 Swift 3 的是 dateInterval(of: start: interval: for:)
【解决方案2】:

斯威夫特 3.1。季度组件仍然无法正常工作。解决方法:

extension Date {
    public var startOfQuarter: Date {
        let startOfMonth = Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!

        var components = Calendar.current.dateComponents([.month, .day, .year], from: startOfMonth)

        let newMonth: Int
        switch components.month! {
        case 1,2,3: newMonth = 1
        case 4,5,6: newMonth = 4
        case 7,8,9: newMonth = 7
        case 10,11,12: newMonth = 10
        default: newMonth = 1
        }
        components.month = newMonth
        return Calendar.current.date(from: components)!
    }
}

用法:

Date().startOfQuarter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多