【问题标题】:List days in calendar year列出日历年中的天数
【发布时间】:2013-01-31 16:14:45
【问题描述】:

我想列出 (NSLog) 格鲁吉亚日历年 (2013) 的所有日期。我已经设法使用以下方法获取当前日期:

    NSCalendar*       calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* components = [calendar components:NSDayCalendarUnit
                                               fromDate:currDate];
    NSInteger  day = [components day];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    NSString *dateString = [dateFormatter stringFromDate:currDate];
    NSLog(@"%@", dateString);

如何打印出 2013 年的所有日期?

【问题讨论】:

  • 当前日期 + 1 以此类推......根据月份
  • 我已经完成了,但是我该如何计算这个月呢?
  • simple for month add until 31,(28/29),31,30,31,30,31..... if month%2==0 apply this logic

标签: iphone ios objective-c nscalendar


【解决方案1】:
NSDateFormatter* dateFormatter = [NSDateFormatter new] ;
dateFormatter.dateStyle = NSDateFormatterLongStyle ;

NSDate* today = [NSDate date] ;
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] ;
NSDateComponents* thisYearComponents = [calendar components:NSYearCalendarUnit fromDate:today] ;
NSDate* firstDateInThisYear = [calendar dateFromComponents:thisYearComponents] ;

NSDateComponents* addDaysComponents = [NSDateComponents new] ;
addDaysComponents.day = 0 ;

while ( TRUE ) {
    NSDate* nextDateInThisYear = [calendar dateByAddingComponents:addDaysComponents toDate:firstDateInThisYear options:0] ;
    NSDateComponents* yearOfNextDateComponents = [calendar components:NSYearCalendarUnit fromDate:nextDateInThisYear] ;
    if ( yearOfNextDateComponents.year == thisYearComponents.year )
        NSLog(@"%@", [dateFormatter stringFromDate:nextDateInThisYear]) ;
    else
        break ;
    addDaysComponents.day += 1 ;
}

WWDC 2011 session 117 - Performing Calendar Calculations 是一个很好的信息来源。它介绍了为什么最好在循环中将 n 天添加到固定参考日期,而不是重复地将 1 天添加到最近使用的日期。

它还建议在您不关心时间的 NSDate 中使用中午(中午 12 点)而不是午夜(上午 12 点),因为夏令时会导致某些地方的某些日期不存在午夜。但在我的示例中,我并没有费心去做。

【讨论】:

    【解决方案2】:
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = [dateFormatter dateFromString:@"2013-01-01"];
    
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    NSDateComponents *components = [calendar components:kCFCalendarUnitYear fromDate:date];
    
    while ([components year] < 2014) {
        NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
        [dateFormatter1 setDateStyle:NSDateFormatterLongStyle];
        NSString *dateString = [dateFormatter1 stringFromDate:date];
        NSLog(@"%@", dateString);
        date = [NSDate dateWithTimeInterval:60*60*24 sinceDate:date];
        components = [calendar components:kCFCalendarUnitYear fromDate:date];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 2012-12-31
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多