2011-01-18 27 views
5

我正在嘗試做一些對我而言有點困難的事情。但我相信有人有一些洞察力。NSDate - 一年前,進退兩難

給定一個日期,比如January 17, 2011,我試圖找出一年前對應這個日期的那一天。所以January 17, 2011是一個星期一,一年前,這一天下降了January 18, 2010(星期一)。事實證明,January 18, 2010January 17, 2011之前的354天。我原本以爲只是簡單地減去非閏年的365天和閏年的366天,但如果你在這種情況下這樣做,你會得到January 17, 2010,這是一個星期天,而不是一個星期一。

所以,在Objective-C與NSDateNSCalendar,我怎麼能實現的功能,例如:

-(NSDate *)logicalOneYearAgo:(NSDate *)from { 
} 

換句話說,第n個月的第n個「工作日」(其中「工作日」是週一或週二或週三等)

+3

你將不得不更好地確定你的期望是什麼;從2011年1月17日起的一年是2010年1月17日。您是否想要(例如)第n個月的第n個星期一? – 2011-01-18 22:38:43

+0

是,第n個月的第n個「週日」。 – CodeGuy 2011-01-18 23:12:51

+0

本月有五個星期一,而2010年一月只有四個。在這個日期計劃中,2011年1月31日前一年的日期是多少? – Chuck 2011-01-18 23:37:19

回答

-8

答案竟然是非常簡單的。它從試錯中變成了現實。這是答案。

如果年份是閏年,減去365天。

如果年份不是閏年,減去364天。

3

我不能保證這是最有效的方式,但你可以使用NSCalendarNSDateComponents。將您的NSDate實例傳入[yourCalendar components:yourComponents fromDate:yourDate],從組件中減去一年,然後使用[yourCalendar dateFromComponents:yourComp]

對不起,沒有提供完整的代碼,但它已經有一段時間,因爲我已經與這些方法,我不想給你的代碼不起作用。

22

您使用NSDateComponents像這樣:

- (NSDate *)logicalOneYearAgo:(NSDate *)from { 

    NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 

    NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease]; 
    [offsetComponents setYear:-1]; 

    return [gregorian dateByAddingComponents:offsetComponents toDate:from options:0]; 

} 
0

摘要1年。然後減去1天,直到最後達到所需的同一周。

每年「星期幾」都會返回1天,除非中間有一位二十九,他們會回去兩天。

這是因爲一年是52周+ 1天(閏年+2)。

所以,如果你無限期地運用這個邏輯,你會在多年後終於在5月16日的6月16日。

如果您不希望發生這種情況,您必須在某個地方記住參考年份並根據它計算基準。例如,如果「新」星期一是4天前(因爲3年過去了),那麼您可能希望提前3天選擇星期一,以免無限制地減少幾年後的日子。

希望它有幫助。

11

這是覆蓋在上曆法計算的Date and Time Programming Guide部,Adding Components to a Date

具體而言,感興趣的方法dateByAddingComponents:toDate:options

使用蘋果的例子爲基礎,從當前日期減去一年,你會做到以下幾點:

NSDate *today = [[NSDate alloc] init]; 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

/* 
    Create a date components to represent the number of years to add to the current date. 
    In this case, we add -1 to subtract one year.  
*/ 

NSDateComponents *addComponents = [[NSDateComponents alloc] init]; 
addComponents.year = - 1; 

return [calendar dateByAddingComponents:addComponents toDate:today options:0];