2015-02-24 62 views
0

我想根据当前日期计算NSDate对象。如果当前日期为2015年4月1日,则需要生成日期2014年12月31日。如果当前日期为2015年4月30日,则仍需要生成日期2014年12月31日。但是,如果它是2015年5月1日,我需要生成2015年1月31日。换句话说,无论我在哪个月,我都需要从四个月前开始的月底的日期,而不管我在当月的位置。鉴于NSDate,找到第四个前个月的最后一天

我迄今的代码是:

NSCalendar *theCalendar = [NSCalendar currentCalendar]; 
    NSDateComponents *dayComponent = [[NSDateComponents alloc] init]; 
    [dayComponent setDay:-90]; 
    NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0]; 

    NSLog(@"The date I am getting is: %@", nextDate); 

上面的代码给了我之前的当前日期正好是90天的日期值,但我需要的日期始终是月底那是4个月前。

+2

你检查出[YLMoment](https://github.com/yannickl/YLMoment)?我敢打赌,它会帮助你做你需要的。 – brandonscript 2015-02-24 21:11:27

+1

你知道,月底是下个月开始的前一天。除了天以外还有其他组件。而NSCalendar'rangeOfUnit'可以提供一些有用的信息。 – 2015-02-24 21:50:16

回答

2

正如你已经发现了,你需要开始日期和日历:

NSDate *startingDate = [NSDate date]; 
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar]; 

你需要的当前日期仅下降到目前的一个月组件,但,因为你不关心当月的具体日期:

NSDateComponents *components = [calendar 
    components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth 
    fromDate:startingDate]; 

你说你想要上个月的第四个月的最后一天。由于月份有不同的天数,所以最后一天会因月份而异。但所有月份有第一天,那些最初的日子总是编号为1。所以这是最简单的,首先要回三个月计算“第四个前一个月的最后一天”:

components.month -= 3; 

然后,走一一天在这之前一个月:

components.day = -1; 

最后,你需要在你的脑袋,以获得清晰,一个NSDate表示时间瞬间,但一天(如“2015年4月1日”)是一个间隔的时间,在特定的时刻开始和结束。如果你打算使用NSDate代表整整一天,那么你将在该时间间隔内存储一个瞬间。你不要想要存储第一个或最后一个瞬间(这将是中午); that causes problems for some days in some time zones。相反,使用中午为您瞬间:

components.hour = 12; 

现在,你可以要求一个新NSDate日历:

NSDate *lastDayOfFourthPriorMonth = [calendar dateFromComponents:components]; 
1

您想熟悉NSCalendarNSDateComponents。如果您阅读了这两个API文档,您将能够收集答案。

从概念上讲,您希望使用NSCalendarcomponents:fromDate:来获取当前日期的组件(日,月,年)。

然后你会走那个月的价值回4个月。现在如果包裹在1月份之后,你知道你需要确定多少,以便你调整并保持在几个月内[1..12]。此外,您还需要在这一点上减少一年。

了解当月,您可以通过多种方式找到当月的最后一天;其中最粗糙的是维护你自己的枚举......但是使用NSCalendar可能会更好一些,它也将在闰年中占据2月份。

最后,您可以使用NSCalendar方法dateFromComponents:从您组装的组件生成结果日期。

查看@rob mayoff的优秀答案,这是该理论和IMO更为具体的实现,是正确的答案。

+1

NSCalendar'rangeOfUnit'会告诉你本月的最后一天,考虑月份,闰年和任何其他可能出现的怪异情况。 – 2015-02-25 01:39:07

相关问题