计算当前周的第一天和最后一天
参考预先回答的问题在: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这样的字符串[即本周开始周(周末)]
如果您有NSDate
,则可以使用当前的NSCalendar
检索该日期的NSDateComponents
。将NSDateComponents
的weekday
设置为1(一周的第一天),创建副本,并将副本的weekday
设置为7(一周的最后一天)。然后使用NSCalendar
将两个NSDateComponents
转换回它们各自的NSDate
对象,之后您可以使用NSDateFormatter
创建字符串表示。
此链接有关于如何得到一个日期的工作日为例:https://stackoverflow.com/questions/1057349#1057405
什么如果这一周跨越一个月的结束和下一个的开始? – 2012-10-17 03:01:38
@jeffamaphone'NSCalendar'由'NSDateComponents'转换为'NSDate'将处理任何月份转换。如果您遇到麻烦,请随时发布新问题,让我知道,我会回答。 – 2012-10-17 03:04:42
啊,好的。我现在看到,“周日”不是日期,而是一周中的序号。现在更有意义。 :) – 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);
苹果提供了一个很好的例子:你可以看到详细https://developer.apple.com/Library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html – iwasrobbed 2013-02-04 14:08:37