如何获取两个日期之间的月份和年份的名称

时间:2011-03-02 15:34:40

标签: objective-c ios4

我想在两个日期之间取几个月和几年的名字。假设我的开始日期是01-23-2010,结束日期是02-25-2011,因此我想获得相关年份的月份列表,例如2010年1月,2010年2月----- 2011年2月。

2 个答案:

答案 0 :(得分:10)

以下是关于我的做法(警告:在浏览器中输入,yadda yadda):

NSDate *startDate = ...; // your start date
NSDate *endDate = ...; // your end date
NSDateComponents *monthDifference = [[NSDateComponents alloc] init];

NSMutableArray *dates = [NSMutableArray arrayWithObject:startDate];
NSUInteger monthOffset = 0;
NSDate *nextDate = startDate;
do {
    [dates addObject:nextDate];

    [monthDifference setMonth:monthOffset++];
    NSDate *d = [[NSCalendar currentCalendar] dateByAddingComponents:monthDifference toDate:startDate options:0];
    nextDate = d;
} while([nextDate compare:endDate] == NSOrderedAscending);

这应该会为您提供一系列NSDate个对象,这些对象代表相隔约一个月的日期,从您的开始日期开始到结束日期或结束日期结束。

如果您想以可读的方式显示它们,您将使用NSDateFormatter

NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"MMMM yyyy"];
for (NSDate *date in dates) {
  NSLog(@"%@", [f stringFromDate:date]);
}

[f release];

当我在计算机上运行时,我得到:

EmptyFoundation[3327:a0f] January 2010
EmptyFoundation[3327:a0f] February 2010
EmptyFoundation[3327:a0f] March 2010
EmptyFoundation[3327:a0f] April 2010
EmptyFoundation[3327:a0f] May 2010
EmptyFoundation[3327:a0f] June 2010
EmptyFoundation[3327:a0f] July 2010
EmptyFoundation[3327:a0f] August 2010
EmptyFoundation[3327:a0f] September 2010
EmptyFoundation[3327:a0f] October 2010
EmptyFoundation[3327:a0f] November 2010
EmptyFoundation[3327:a0f] December 2010
EmptyFoundation[3327:a0f] January 2011
EmptyFoundation[3327:a0f] February 2011

这可能看起来有点复杂,但它有一些优点:

  • 无论您正在使用什么日历系统,都可以正常工作。只需将[NSCalendar currentCalendar]电话更改为另一个日历,它就可以在那个日历中工作(希伯来语,伊斯兰教等)
  • 它占了几个月的奇怪天数(28天对29天,或闰月的日历[是的,它们存在])

答案 1 :(得分:1)

您想要使用的是NSDateFormatter。文档说:

  

NSDateFormatter的实例创建   NSDate的字符串表示(和   NSCalendarDate)对象和转换   日期和日期的文字表示   进入NSDate对象的时间。您可以   表达日期的表示   和时间灵活地使用预设   格式样式或自定义格式   字符串。

如果您需要确定两个日期之间的实际月份,您可以使用NSCalendar。