2009-12-11 83 views
79

我想要做的是今天獲取NSDate,昨天,本週,上週,本月,上個月變量就緒上的UITableView的titleForHeaderInSection添加頁眉比較今天得到NSDate,昨天,本週,上週,本月,上個月...變量

我想要的是在代碼中手工完成以下​​日期2009-12-11

NSDate *today = [NSDate dateWithString:@"2009-12-11 00:00:00 +0000"]; 
NSDate *yesterday = [NSDate dateWithString:@"2009-12-10 00:00:00 +0000"]; 
NSDate *thisWeek = [NSDate dateWithString:@"2009-12-06 00:00:00 +0000"]; 
NSDate *lastWeek = [NSDate dateWithString:@"2009-11-30 00:00:00 +0000"]; 
NSDate *thisMonth = [NSDate dateWithString:@"2009-12-01 00:00:00 +0000"]; 
NSDate *lastMonth = [NSDate dateWithString:@"2009-11-01 00:00:00 +0000"]; 

回答

79

可能是一個更好的方式來寫這一點,但在這裏我想出了在Ben的NSCalendar建議和工作從那裏NSDateComponents

NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:[[NSDate alloc] init]]; 

[components setHour:-[components hour]]; 
[components setMinute:-[components minute]]; 
[components setSecond:-[components second]]; 
NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0]; //This variable should now be pointing at a date object that is the start of today (midnight); 

[components setHour:-24]; 
[components setMinute:0]; 
[components setSecond:0]; 
NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0]; 

components = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[[NSDate alloc] init]]; 

[components setDay:([components day] - ([components weekday] - 1))]; 
NSDate *thisWeek = [cal dateFromComponents:components]; 

[components setDay:([components day] - 7)]; 
NSDate *lastWeek = [cal dateFromComponents:components]; 

[components setDay:([components day] - ([components day] -1))]; 
NSDate *thisMonth = [cal dateFromComponents:components]; 

[components setMonth:([components month] - 1)]; 
NSDate *lastMonth = [cal dateFromComponents:components]; 

NSLog(@"today=%@",today); 
NSLog(@"yesterday=%@",yesterday); 
NSLog(@"thisWeek=%@",thisWeek); 
NSLog(@"lastWeek=%@",lastWeek); 
NSLog(@"thisMonth=%@",thisMonth); 
NSLog(@"lastMonth=%@",lastMonth); 
+13

你正在使用'fromDate:[[NSDate alloc] init]'位全部泄漏內存。 – 2009-12-23 06:53:36

+20

@Shaggy Frog:我想他假設ARC已啓用...;) – orj 2012-03-13 05:30:35

+3

此代碼無法正常工作。它沒有考慮到輸入日期的一小部分。也就是說,日期可能有30.1234秒,而NSDateComponents只有30秒作爲秒數,因此從NSDate減去30秒會使您在午夜過後0.1234秒。此外,有些日子有更多(或少於)24小時(夏令時),因此獲取昨天的日期實際上應該使用[組件setDay:-1]而不是[組件setHour:-24]。 – orj 2012-03-13 05:33:51

88

Date and Time Programming Guide改編:

// Right now, you can remove the seconds into the day if you want 
NSDate *today = [NSDate date]; 

// All intervals taken from Google 
NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0]; 
NSDate *thisWeek = [today dateByAddingTimeInterval: -604800.0]; 
NSDate *lastWeek = [today dateByAddingTimeInterval: -1209600.0]; 

// To get the correct number of seconds in each month use NSCalendar 
NSDate *thisMonth = [today dateByAddingTimeInterval: -2629743.83]; 
NSDate *lastMonth = [today dateByAddingTimeInterval: -5259487.66]; 

如果您想要根據月份得到正確的確切天數,則應使用NSCalendar

+0

對不起,如果你不明白 你在thisWeek 這話說的方式是正確的給予了最近7天,但我想實際星期 感謝NSCalendar建議 – hasnat 2009-12-11 18:17:17

+0

是的,如果你想從星期六開始的實際一週,那麼你需要使用'NSCalendar'。 – 2009-12-11 18:27:53

+74

固定的時間常量是壞BAD壞。閏日或閏秒呢?使用NSDateComponents或者當你的日期戳開始不匹配時,你會遭受一些非常討厭和難以調試的問題。 – 2009-12-11 21:22:13

0

我真的很喜歡包含在此項目中的THCalendarInfo對象:

http://github.com/jaredholdcroft/kcalendar

我不能完全找到原文。使用這個對象,你可以移動到前一天,一週的開始,一個月的開始,一週的某一天,一個月的某一天......等等等等。

40

NSDateComponents很適合今天得到:

NSCalendar *cal = [NSCalendar currentCalendar]; 

NSDate *date = [NSDate date]; 
NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
                  fromDate:date]; 
NSDate *today = [cal dateFromComponents:comps]; 

這隻有年,月,日創建的NSDate:

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:-1]; 
NSDate *yesterday = [cal dateByAddingComponents:components toDate:today options:0]; 

(gdb) po today 
2010-06-22 00:00:00 +0200 

要獲取昨天,等等。你可以使用NSDateComponents計算它

+0

你不需要包含時代組件嗎? – 2011-10-23 09:48:02

+0

不錯。用它來計算過去8年的日期,它很好地工作。只需要在這裏修復泄漏:[[NSDateComponents alloc] init]; – 2011-11-14 00:45:23

+0

@CraigB謝謝。這並不是一個完整的例子。將明顯的內存管理排除在讀者面前作爲挑戰;) – 2011-11-14 11:13:12

0
NSDate *today = [[NSDate alloc] initWithTimeIntervalSinceNow:0]; 
+14

爲什麼不''[NSDate date]'? – joshpaul 2011-01-06 21:21:33

+0

由於兩者都有效以獲取當前日期,所以都包含時間。所以這不是問題的正確解決方案! – 2011-11-14 11:14:53

19
+ (NSDate*)dateFor:(enum DateType)dateType { 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *comps = 
    [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit 
       fromDate:[NSDate date]]; 

    if(dateType == DateYesterday) { 

     comps.day--; 
    } 
    else if(dateType == DateThisWeek) { 

     comps.weekday = 1; 
    } 
    else if(dateType == DateLastWeek) { 

     comps.weekday = 1; 
     comps.week--; 
    } 
    else if(dateType == DateThisMonth) { 

     comps.day = 1; 
    } 
    else if(dateType == DateLastMonth) { 

     comps.day = 1; 
     comps.month--; 
    } 
    else if(dateType != DateToday) 
     return nil; 

    return [calendar dateFromComponents:comps]; 
} 
+0

你不需要包含時代組件嗎? – 2011-10-23 09:46:54

+0

我在計算DateLastWeek時必須刪除NSDayCalendarUnit並添加NSWeekdayCalendarUnit。 – jessecurry 2011-12-01 15:40:19

+0

這對我很好用。 – 2013-04-02 09:58:43

1
NSDate *today = [NSDate date]; // Today's date 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents =[gregorian componentsNSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; 
NSInteger day = [weekdayComponents day]; 
4

其他的答案只是沒有爲我工作(也許是因爲我的時區)。這就是我要做的事:

- (BOOL)isOnThisWeek:(NSDate *)dateToCompare 
{ 
    NSCalendar * calendar = [NSCalendar currentCalendar]; 
    NSDate  * today = [NSDate date]; 

    int todaysWeek  = [[calendar components: NSWeekCalendarUnit fromDate:today] week]; 
    int dateToCompareWeek = [[calendar components: NSWeekCalendarUnit fromDate:dateToCompare] week]; 

    int todaysYear   = [[calendar components:NSYearCalendarUnit fromDate:today] year]; 
    int dateToCompareYear = [[calendar components:NSYearCalendarUnit fromDate:dateToCompare] year]; 

    if (todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear) { 
     return YES; 
    } 

    return NO; 
} 
8

斯威夫特2

let today = NSDate() 

let yesterday = today.dateByAddingTimeInterval(-86400.0) 
let thisWeek = today.dateByAddingTimeInterval(-604800.0) 
let lastWeek = today.dateByAddingTimeInterval(-1209600.0) 

let thisMonth = today.dateByAddingTimeInterval(-2629743.83) 
let lastMonth = today.dateByAddingTimeInterval(-5259487.66) 

// components of the date 
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian) 
let components = calendar.components([.Year, .Month, .Day], fromDate: today) 
let (year, month, day) = (components.year, components.month, components.day) 

斯威夫特3

let today = Date() 
let yesterday = today.addingTimeInterval(-86400.0) 
let thisWeek = today.addingTimeInterval(-604800.0) 
let lastWeek = today.addingTimeInterval(-1209600.0) 

let thisMonth = today.addingTimeInterval(-2629743.83) 
let lastMonth = today.addingTimeInterval(-5259487.66) 

// components of the date 
var calendar = Calendar(identifier: Calendar.Identifier.gregorian) 
let components = calendar.dateComponents([.year, .month, .day], from: today) 
let (year, month, day) = (components.year, components.month, components.day) 

斯威夫特3,請注意日期組件是可選的。

+0

@fengd好,今天2016年6月27日凌晨1點將是2016年6月28日,如果我減去24小時,日期將是6月27日凌晨1點。我錯過了什麼? – gokhanakkurt 2016-06-27 10:39:40

+1

對不起,@gokhanakkurt。我認爲我的思想有些呃逆。你的回答是正確的 – fengd 2016-06-28 04:17:35

0

這是檢查日期是本月底或不

func isOnThisMonth(dateToCompare: NSDate) -> Bool { 
    let calendar: NSCalendar = NSCalendar.currentCalendar() 
    let today: NSDate = NSDate() 
    let todaysWeek: Int = calendar.components(NSCalendarUnit.Month, fromDate: today).month 
    let dateToCompareWeek: Int = calendar.components(.Month, fromDate: dateToCompare).month 
    let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year 
    let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year 
    if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear { 
     return true 
    } 
    return false 
} 

而第二個只改變calendarUnit的類型弱這樣

func isOnThisWeek(dateToCompare: NSDate) -> Bool { 
    let calendar: NSCalendar = NSCalendar.currentCalendar() 
    let today: NSDate = NSDate() 
    let todaysWeek: Int = calendar.components(NSCalendarUnit.Weekday, fromDate: today).weekday 
    let dateToCompareWeek: Int = calendar.components(.Weekday, fromDate: dateToCompare).weekday 
    let todaysYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: today).year 
    let dateToCompareYear: Int = calendar.components(NSCalendarUnit.Year, fromDate: dateToCompare).year 
    if todaysWeek == dateToCompareWeek && todaysYear == dateToCompareYear { 
     return true 
    } 
    return false 
} 

我希望這是有益的人感謝。

0

我回答了類似的問題already這裏就是爲什麼我的答案是更好:

  • 斯威夫特3
  • 使用DateFormatter的「Yesterday」和「Today」。這已經由Apple翻譯了,這可以節省您的工作量!
  • 使用DateComponentsFormatter已翻譯的「1周」字符串。 (對Apple來說,再次減少對你的工作。)你所要做的就是翻譯「%@ ago」字符串。
  • 其他答案錯誤地計算當天從「今天」切換到「昨天」等時間的固定常數是一個很大的NO-NO,因爲reasons。此外,其他答案使用當前日期/時間,當他們應該使用當日日期/時間的末尾
  • 用途autoupdatingCurrent日曆&區域設置確保您的應用程序是立即最新的與用戶的日曆和語言偏好Settings.app
2

如果你使用的是iOS 10+或者MacOS 10.12+,你可以使用這兩個Calendar方法正確地做到這一點。

  • func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?docs
  • func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval?docs

下面是如何在斯威夫特3使用這些方法,在我的時區輸出的遊樂場以及一個例子。

let calendar = Calendar.current 
let now = Date() 
// => "Apr 28, 2017, 3:33 PM" 

let yesterday = calendar.date(byAdding: .day, value: -1, to: now) 
// => "Apr 29, 2017, 3:33 PM" 
let yesterdayStartOfDay = calendar.startOfDay(for: yesterday!) 
// => ""Apr 29, 2017, 12:00 AM" 

let thisWeekInterval = calendar.dateInterval(of: .weekOfYear, for: now) 
// => 2017-04-23 04:00:00 +0000 to 2017-04-30 04:00:00 +0000 

let thisMonthInterval = calendar.dateInterval(of: .month, for: now) 
// => 2017-04-01 04:00:00 +0000 to 2017-05-01 04:00:00 +0000 

let aDateInLastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: now) 
let lastWeekInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastWeek!) 
// => 2017-04-16 04:00:00 +0000 to 2017-04-23 04:00:00 +0000 

let aDateInLastMonth = calendar.date(byAdding: .month, value: -1, to: now) 
let lastMonthInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastMonth!) 
// => 2017-03-26 04:00:00 +0000 to 2017-04-02 04:00:00 +0000 

紅利:您可以使用DateInterval s來測試日期是否落入該範圍。從上面繼續:

thisWeekInterval!.contains(now) 
// => true 
lastMonthInterval!.contains(now) 
// => false 
相關問題