【问题标题】:Getting the last day of a month获取一个月的最后一天
【发布时间】:2010-05-05 10:28:06
【问题描述】:

如何以NSDate 获取当月的最后一天?

【问题讨论】:

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


【解决方案1】:
NSDate *curDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:curDate]; // Get necessary date components

// set last of month
[comps setMonth:[comps month]+1];
[comps setDay:0];
NSDate *tDateMonth = [calendar dateFromComponents:comps];
NSLog(@"%@", tDateMonth);

应该也可以。

【讨论】:

  • 但是为什么 day = 0 会给出上个月的最后日期?
  • 这就是为什么月份 + 1 存在的原因,Raj
【解决方案2】:
// Adapted from running code in my app

NSDate *curDate = [NSDate date];
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSRange daysRange = 
[currentCalendar 
 rangeOfUnit:NSDayCalendarUnit 
 inUnit:NSMonthCalendarUnit 
 forDate:curDate];

// daysRange.length will contain the number of the last day
// of the month containing curDate

NSLog(@"%i", daysRange.length);

【讨论】:

  • 对于那些痴迷于单线的人:P days = [NSCalendar.currentCalendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:myDate].length
【解决方案3】:

把它放在一个类别中:

-(NSDate*)lastDayOfMonth
{
    NSInteger dayCount = [self numberOfDaysInMonthCount];

    NSDateComponents *comp = [[self calendar] components:
                              NSCalendarUnitYear |
                              NSCalendarUnitMonth |
                              NSCalendarUnitDay fromDate:self];

    [comp setDay:dayCount];

    return [[self calendar] dateFromComponents:comp];
}

-(NSInteger)numberOfDaysInMonthCount
{
    NSRange dayRange = [[self calendar] rangeOfUnit:NSCalendarUnitDay
                                             inUnit:NSCalendarUnitMonth
                                            forDate:self];

    return dayRange.length;
}

-(NSCalendar*)calendar
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
    [calendar setTimeZone:[NSTimeZone timeZoneWithName:TIMEZONE]];
    return calendar;
}

【讨论】:

  • 我正在使用与此类似的东西,谢谢,但是您为什么使用 NSGregorianCalendar 而不是 [NSCalendar currentCalendar]
  • 当前日历可能不是 NSGregorian 日历,当时我想明确表示一下。
  • 如果你想要当月最后一天的最后一秒,只需添加 comp.hour = 24; comp.minute = 0; comp.second = 0;
【解决方案4】:

斯威夫特版本

extension NSDate {
    func lastDayOfMonth() -> NSDate {
        let calendar = NSCalendar.currentCalendar()
        let dayRange = calendar.rangeOfUnit(.Day, inUnit: .Month, forDate: self)
        let dayCount = dayRange.length
        let comp = calendar.components([.Year, .Month, .Day], fromDate: self)

        comp.day = dayCount

        return calendar.dateFromComponents(comp)!
    }
}

【讨论】:

    【解决方案5】:

    iOS 7 版本

    只是为了摆脱弃用......在一天的最后一秒添加了一点点。

        // current date
        NSDate *now = [NSDate new];
    
        // get last day of the current month
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        [calendar setTimeZone:[NSTimeZone systemTimeZone]];
    
        NSRange dayRange = [ calendar rangeOfUnit:NSCalendarUnitDay
                                           inUnit:NSCalendarUnitMonth
                                          forDate:now];
    
        NSInteger numberOfDaysInCurrentMonth = dayRange.length;
    
        NSDateComponents *comp = [calendar components:
                                  NSCalendarUnitYear |
                                  NSCalendarUnitMonth |
                                  NSCalendarUnitDay fromDate:now];
    
        comp.day = numberOfDaysInCurrentMonth;
        comp.hour = 24;
        comp.minute = 0;
        comp.second = 0;
    
        NSDate *endOfMonth = [calendar dateFromComponents:comp];
    

    【讨论】:

      【解决方案6】:

      Swift 3.0.1 版本

      extension Date {
      func lastDayOfMonth() -> Date {
          let calendar = NSCalendar.current
          let dayRange = calendar.range(of: .day, in: .month, for: self)
          let dayCount = dayRange?.count
          var comp = calendar.dateComponents([.year, .month, .day], from: self)
          comp.day = dayCount
          return calendar.date(from: comp)!
          }
      }
      

      【讨论】:

        【解决方案7】:

        使用 Swift 3 和 iOS 10,我发现最简单的方法是 Calendar's dateInterval(of:for:)

        func monthInterval() -> DateInterval? {
            let calendar = Calendar.current
            guard let interval = calendar.dateInterval(of: .month, for: Date()) else { return nil }
            let duration = interval.duration
            // Subtract one second because dateInterval(of:for:)'s end date returns the beginning of the following month
            return DateInterval(start: interval.start, duration: duration - 1)
        }
        
        guard let interval = monthInterval() else { return }
        

        然后您可以使用interval.startinterval.end 来获取您需要的日期。

        【讨论】:

          【解决方案8】:
          NSDate *curDate = [NSDate date];
                  NSCalendar *currentCalendar = [NSCalendar currentCalendar];
                  NSRange daysRange = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth
                   forDate:curDate];
                  NSDateComponents* comps = [currentCalendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:curDate];
                  [comps setDay:daysRange.length];
                  NSDate *maximumDate = [[NSCalendar currentCalendar] dateFromComponents:comps];
          

          【讨论】:

            【解决方案9】:

            变通功能:

            -(int)GetLastDayOfMonth:(NSDate *)date
            {
                int last_day = 27;
                NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
                NSDateComponents *compsMonth = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date];
                [compsMonth setDay:last_day];
                int month = [compsMonth month]; 
                while(TRUE){
                    [compsMonth setDay:last_day+1];
                    NSDate *dateFuture = [cal dateFromComponents:compsMonth];
                    NSDateComponents *futureComps = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:dateFuture];
                    if(month != [futureComps month]){
                        return last_day;
                    }
                    last_day+=1;
                }
                return last_day;
            }
            

            【讨论】:

            • 不需要循环
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-22
            • 2021-07-30
            • 2015-04-03
            • 2013-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多