2010-01-17 120 views
3

參考預先回答的問題在:Getting first and last days of current week計算當前周的第一天和最後一天

有在上面的鏈接兩個答案。其中一個是理論性的,另一個是PyObjC(Python-Objective C橋語言)語言,快速谷歌搜索證實PyObjC不能與iPhone SDK一起工作。

因此,關於這個問題,如何將PyObjC代碼翻譯爲與iPhone SDK兼容。

目標:假設今天(週二)是19日,太陽。是第17(周開始)和週六。 23日是週末。我想得到像19/01 - 23/01這樣的字符串[即本週開始周(週末)]

+0

蘋果提供了一個很好的例子:你可以看到詳細https://developer.apple.com/Library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html – iwasrobbed 2013-02-04 14:08:37

回答

7

如果您有NSDate,則可以使用當前的NSCalendar檢索該日期的NSDateComponents。將NSDateComponentsweekday設置爲1(一週的第一天),創建副本,並將副本的weekday設置爲7(一週的最後一天)。然後使用NSCalendar將兩個NSDateComponents轉換回它們各自的NSDate對象,之後您可以使用NSDateFormatter創建字符串表示。

此鏈接有關於如何得到一個日期的工作日爲例:https://stackoverflow.com/questions/1057349#1057405

+0

什麼如果這一週跨越一個月的結束和下一個的開始? – 2012-10-17 03:01:38

+0

@jeffamaphone'NSCalendar'由'NSDateComponents'轉換爲'NSDate'將處理任何月份轉換。如果您遇到麻煩,請隨時發佈新問題,讓我知道,我會回答。 – 2012-10-17 03:04:42

+0

啊,好的。我現在看到,「週日」不是日期,而是一週中的序號。現在更有意義。 :) – 2012-10-17 03:06:29

3

下面是一些代碼,並在本週初前一個月開始它還會檢查邊界情況:

// Finds the date for the first day of the week 
- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    // Edge case where beginning of week starts in the prior month 
    NSDateComponents *edgeCase = [[NSDateComponents alloc] init]; 
    [edgeCase setMonth:2]; 
    [edgeCase setDay:1]; 
    [edgeCase setYear:2013]; 
    NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase]; 

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate]; 
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday 
    [components setWeek:[components week]]; 

    NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]); 

    // Find Sunday for the given date 
    components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate]; 
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday 
    [components setWeek:[components week]]; 

    NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]); 

    return [calendar dateFromComponents:components]; 
} 

編輯:從上面

- (NSDate *)firstDayOfWeekFrom:(NSDate *)givenDate { 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate]; 
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday 
    [components setWeekOfYear:[components weekOfYear]]; 

    return [calendar dateFromComponents:components]; 
} 
0

相關的代碼這是我以前找天終於找到了。在NSDate中有一種方法rangeOfUnit:startDate:interval:forDate:,並以簡單的方式執行該操作。 Current Week Start and End Date

0
NSDate *weekDate = [NSDate date]; 
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *currentComps = [myCalendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:weekDate]; 
int ff = currentComps.weekOfYear; 
NSLog(@"1 %d", ff); 

[currentComps setWeekday:1]; // 1: sunday 
NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 
[currentComps setWeekday:7]; // 7: saturday 
NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 

NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init]; 
myDateFormatter.dateFormat = @"dd EEEE"; 
NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek]; 
NSString *secondStr = [myDateFormatter stringFromDate:lastDayOfTheWeek]; 

NSLog(@"first - %@ \nlast - %@", firstStr, secondStr);