【问题标题】:Missing Month Name between two dates两个日期之间缺少月份名称
【发布时间】:2013-01-13 08:56:00
【问题描述】:

我正在使用此代码

int unitFlags =  NSMonthCalendarUnit;   
NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0];    
int months = [comps month];

我实际上想要缺少任何想法的月份的名称?

【问题讨论】:

  • 你到底想做什么?从 int 月中获取一月、二月还是什么?
  • 两个日期之间的月份名称?如果startDate2012-07-01 并且endDate2012-09-01,你期望结果是什么?
  • 我希望两个日期之间缺少月份,假设日期是 2012 年 6 月 23 日,2012 年 8 月 23 日,那么缺少的月份是 7 月。
  • 如果startDate2012-07-01endDate2013-04-01 怎么办?如果startDate1994-07-01endDate2013-04-01 会怎样?
  • 结束日期将比开始日期晚。如果 startdate 是 1994-07-01 并且 end date 是 2013-04-01 则所有缺失月份的名称,但这种差异很少见。

标签: iphone ios nsdate nscalendar


【解决方案1】:

我已经通过两种方式解决了这个问题,我不知道哪个更好:(我期待人们对我的答案发表评论)

由于您想要开始和结束日期之间的所有月份名称,您可以这样做:

方法一:

NSString *startString=@"23 Jun 2012";
NSString *endString=@"23 Dec 2013";

NSDateFormatter *dateFormatterDDMMMYYYY=[NSDateFormatter new];
[dateFormatterDDMMMYYYY setDateFormat:@"dd MMM yyyy"];

NSDate *startDate=[dateFormatterDDMMMYYYY dateFromString:startString];
NSDate *endDate=[dateFormatterDDMMMYYYY dateFromString:endString];

NSMutableArray *betweenMonths=[NSMutableArray new];
NSDate *tempDate=startDate;
while (tempDate<endDate) {
    NSDateFormatter *dateFormatterMMM=[NSDateFormatter new];
    [dateFormatterMMM setDateFormat:@"MMM"];
    NSString *monthName=[dateFormatterMMM stringFromDate:tempDate];
    [betweenMonths addObject:monthName];

    //tempDate is calculted after storing because you not need the last month.
    NSCalendar *calendar=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components=[NSDateComponents new];
    components.month=1;
    tempDate=[calendar dateByAddingComponents:components toDate:tempDate options:0];
}
NSLog(@"Month Name : %@",betweenMonths);

方法二:

NSString *startString=@"23 Jun 2012";
NSString *endString=@"23 Dec 2013";

NSDateFormatter *dateFormatterDDMMMYYYY=[NSDateFormatter new];
[dateFormatterDDMMMYYYY setDateFormat:@"dd MMM yyyy"];

NSDate *startDate=[dateFormatterDDMMMYYYY dateFromString:startString];
NSDate *endDate=[dateFormatterDDMMMYYYY dateFromString:endString];

NSInteger month = [[[NSCalendar currentCalendar] components: NSMonthCalendarUnit
                                                   fromDate: startDate
                                                     toDate: endDate
                                                    options: 0] month];

NSDateFormatter *dateFormatterMMM=[NSDateFormatter new];
[dateFormatterMMM setDateFormat:@"MMM"];
NSString *startMonth=[dateFormatterMMM stringFromDate:startDate];

NSArray *months=@[@"Jan",@"Feb",@"Mar",@"Apr",@"May",@"Jun",@"Jul",@"Aug",@"Sep",@"Oct",@"Nov",@"Dec"];

NSInteger startDateMonth=[months indexOfObject:startMonth];

for (NSInteger i=startDateMonth+1; i<startDateMonth+month; i++) {
    NSLog(@"Moths : %@",months[i%12]); //%12 for checking if i goes beyond 11, as endDate may be more then one year span long

}

【讨论】:

  • 实际上我的开始日期是 2012 年 1 月 1 日,结束日期是 2013 年 1 月 13 日。使用上面的代码得到的答案是 11 我如何使用它来获取月份的名称,例如二月,三月等到 12 月,开始日期和结束日期可能会有所不同
  • 为了简单地查找月份名称,为什么要使用组件,使用我回答的内容。是不是很简单?
  • 我可以从日期中获取月份名称,但我希望在两个日期之间缺少月份,假设日期是 2012 年 6 月 23 日、2012 年 8 月 23 日,那么缺少的月份就是 7 月。
猜你喜欢
  • 2016-02-29
  • 2019-03-28
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多