2013-02-12 23 views
2

下面是我從哪裏可以得到今天的日期作爲字符串代碼:如何在iPhone中使用十天後獲取當天的日期?

NSString *string; 
    NSDateFormatter *formatter; 
    string = [formatter stringFromDate: [NSDate date]]; 
    formatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [formatter setDateFormat: @"yyyy-MM-dd "]; 
    string = [formatter stringFromDate: [NSDate date]]; 

但現在我想這樣的,我會把這個字符串作爲參數和方法,將10後,退還當天的日期這個日期的日子作爲一個字符串。但我找不到任何解決方案。有誰能夠幫助我?

回答

4
NSDate *now = [NSDate date]; 
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*10]; 

這將在10天后返回日期。

+0

在使用夏令時 – Abizern 2013-02-12 08:56:03

+0

@Abizern的國家/地區,這種方法不可靠,這是一個邊緣案例。 – viral 2013-02-12 08:57:09

+0

這是一個你不應忽視的邊緣情況。蘋果開發者網站上有一個關於[日曆計算]的完整指南(https://developer.apple.com/Library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html),它提供了關於正確的方法來做這些事情: – Abizern 2013-02-12 08:59:50

-1

代碼日期::

NSDateFormatter *entryDateFormat; 
entryDateFormat = [[NSDateFormatter alloc]init]; 
[entryDateFormat setDateFormat:@"dd-MM-yyyy HH:mm:ss"]; 

NSString *s = [NSString stringWithFormat:@"%@", [entryDateFormat stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*10]]]; 
NSLog(@" --> %@", s); 
+1

這種方法在使用夏令時的國家不可靠。 – Abizern 2013-02-12 08:55:45

1

您FROM日期字符串轉換爲Date類型,使用下面的功能,並通過天參數爲10後10天:

NSString *fromDateString = @"Your_date_string"; 

// Convert string to date object 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"YOUR_DATE_FORMAT"]; 
NSDate *fromDate = [dateFormat dateFromString:dateStr]; 
[dateFormat release]; 

+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days 
{ 
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
    dateComponents.day = days; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDate *previousDate = [calendar dateByAddingComponents:dateComponents 
                toDate:fromDate 
                options:0]; 
    [dateComponents release]; 
    return previousDate; 
} 
7

我的答案會稍微長一些,可能稍微加一點點,但我認爲最好是提供日期管理中的概念知識,而不是「複製和粘貼」答案。實際上即使直觀是一項相當複雜的任務,日期管理也是如此。爲了與Cocoa正確地做到這一點,你必須瞭解一些基本概念。

「日期」概念本身只是從參考日期開始經過的秒數的數字表示。這是絕對的措施,沒有什麼可以改變它:如果你說現在是時間0,在10秒內它將是時間10,依此類推。它由可可與「NSDate」代表。

現在要將「數字日期」翻譯成「日曆日期」,您需要將此數值日期應用於「日曆」(「NSCalendar」可可課程)。很明顯,周圍有很多類型的日曆,所以你需要做的是選擇你想使用的正確的日曆,然後應用數字日期:有效的結果將是「日曆日期」。請注意,所有日曆都具有相同的「數字日期」,因爲它是絕對度量,它將在不同的日曆上提供不同的結果。日曆完全是一個複雜的算法或表格,它將每一個數字日期映射到特定的「日曆日期」。

創建日曆日期的組件稱爲「日期組件」,由Cocoa類「NSDateComponents」表示。正如您可能已經理解的那樣,您不能直接將「日期組件」與「日期」關聯起來,但您需要通過「日曆」對其進行調解。這就是爲什麼所有與「Date」和「NSDateComponents」類相關的方法都在「NSCalendar」類中定義的原因,這解釋了爲什麼特定的「NSDateComponents」實例與特定的「NSCalendar」實例相關聯。

最後,最後一步是將「日期組件」轉換爲「人類可讀格式」。爲此,請使用「NSDateFormatter」對象。雖然將日期格式化程序鏈接到日期組件更爲合適,但爲了便於從日期到字符串的轉換,反之亦然,NSDateFormatter方法直接使用NSDate對象而不是NSDateComponents進行播放。顯然,NSDateFormatter類必須關聯到特定的日曆(並且要小心:它使用默認日曆進行初始化)。

既然你有這個信息的行李,你可以很容易地理解如何進行。您的任務是在10天后將「字符串格式」中的日期轉換爲相同格式的日期。 所以要完成的任務是:(代碼如下):

1. identify the Calendar you want to use 
2. create a NSDateFormatter that accepts your input string and link the Calendar to it 
3. use NSDateFormatter to import the string to a "NSDate" 
4. use the NSCalendar to convert the date to a NSDateComponents object 
5. add 10 days to the "day" component of NSDateComponents; don't take care of "end of month" or "end of year", because NSDateComponents + NSCalendar know how to do it! 
6. use NSCalendar again to convert the new recalculated NSDateComponents instance to NSDate 
7. use the NSDateFormatter you defined before to convert the new NSDate to a NSString. 

你可能會問:爲什麼我不能只是總結我進口的NSDate 10 * 24 * 60 * 60秒了嗎?儘管在大多數情況下這種解決方案都可以工作,但在某些情況下,此操作會提供不正確的結果。例如。在夏令時開關中,您將時鐘恢復1小時,即60 * 60 = 3600秒。這意味着在日曆中,一個1小時的秒數範圍將映射到兩個不同的日期/時間(開關前1小時和開機後1小時)。這些信息對於NSDate而言是未知的,但它被NSCalendar知道。您可以通過這種方式直觀地看到發生了什麼情況:想象一條無限長的線(時間線),線中的每個「滴答」都是1秒。如果您保留現在的「時間點」,則此刻度將與日曆和時鐘中的特定日期和時間相關聯。現在想象一下,在這個時間線上確定你做夏令時開關的時間點,並假設你當時需要在1小時之前恢復你的時鐘。你所做的是將時間線分成兩部分,然後拿下半部分,並與上半場最後一小時的第一個小時重疊。您將看到時間仍在繼續,但您在此1小時內重疊的日曆將與兩個給定的時間範圍相關聯!這只是你的日曆+語言環境+時區已知的信息,而不是單獨NSDate(順便說一句,我故意跳過了關於「時區」和「區域設置」的討論:它們是相關的,因爲時區需要處理將絕對時間與一天中的有效時間相關聯,而區域設置可以更改某些日曆規則,例如夏令時開關)。

NSString *startDateStr = @"2013-02-25"; 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
dateFormatter.calendar=calendar; 
[dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
NSDate *startDate = [dateFormatter dateFromString:startDateStr]; 
NSDateComponents *startComponents = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:startDate]; 
startComponents.day+=10; 
NSDate *endDate = [calendar dateFromComponents:startComponents]; 
NSString *endDateStr = [dateFormatter stringFromDate:endDate]; 
NSLog(@"Date %@ + 10 days gives %@",startDateStr,endDateStr); 

注意的是,上述計算可以使用已經簡化了NSCalendar的dateByAddingComponents:toDate:options:不過我更願意給你的類之間的相互作用更好的畫面第一種方法。

+0

+1爲一個考慮的解決方案。慚愧,你已經把它添加到一個封閉的問題。我希望你有機會在未來回收它。但是,由於這是一個常見的問題,經常會引發「添加x天秒數」的不正確答案,我相信你會的。 – Abizern 2013-02-12 11:00:09

+0

最佳答案Award :) +1 – BootMaker 2015-01-17 16:26:52

相關問題