计算当前周的第一天和最后一天

问题描述:

参考预先回答的问题在: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

如果您有NSDate,则可以使用当前的NSCalendar检索该日期的NSDateComponents。将NSDateComponentsweekday设置为1(一周的第一天),创建副本,并将副本的weekday设置为7(一周的最后一天)。然后使用NSCalendar将两个NSDateComponents转换回它们各自的NSDate对象,之后您可以使用NSDateFormatter创建字符串表示。

此链接有关于如何得到一个日期的工作日为例:https://*.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

下面是一些代码,并在本周初前一个月开始它还会检查边界情况:

// 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]; 
} 

相关的代码这是我以前找天终于找到了。在NSDate中有一种方法rangeOfUnit:startDate:interval:forDate:,并以简单的方式执行该操作。 Current Week Start and End Date

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);