2015-02-24 128 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

相關問題