获取一周的开始和结束日期。用户输入了月,周和年

时间:2019-11-20 05:57:10

标签: objective-c

当用户提供月份,星期数和年份时,我的代码应带有特定星期的日期。例如:如果我的用户输入是month(String)->“ October”,week(Int)-> 1,year(int)-> 2019,则上面的输入应给出响应,如startDate-> 01 / 10/2019,endDate-> 07/10/2019。

如果用户给出了任何月份的最后一周,则应携带该月的剩余天数。从星期日算起的一周。

我尝试的代码给出了当前月份/当前日期的开始日期和结束日期

NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

cal.firstWeekday = 1;// set first week day to Monday
// 1: Sunday, 2: Monday, ..., 7:Saturday

NSDate *now = [NSDate date];
NSDate *startOfTheWeek;
NSDate *endOfWeek;
NSTimeInterval interval;
[cal rangeOfUnit:NSCalendarUnitWeekOfYear
       startDate:&startOfTheWeek
        interval:&interval
         forDate:now];
//startOfTheWeek holds the beginning of the week

endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval - 1];
// endOfWeek now holds the last second of the last week day

[cal rangeOfUnit:NSCalendarUnitDay
       startDate:&endOfWeek
        interval:NULL
         forDate:endOfWeek];
// endOfWeek now holds the beginning of the last week day

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterShortStyle;
formatter.timeStyle = NSDateFormatterShortStyle;

NSLog(@"start: %@", [formatter stringFromDate:startOfTheWeek]);
NSLog(@"end:   %@", [formatter stringFromDate:endOfWeek]);

1 个答案:

答案 0 :(得分:0)

我想出了一个符合您认为标准的东西

NSInteger year = 2019;
NSInteger month = 11;
NSInteger week = 1;

NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

cal.firstWeekday = 2;

NSDateComponents *comps = [NSDateComponents new];
comps.calendar = cal;
comps.year = year;
comps.month = month;
comps.weekday = cal.firstWeekday;
comps.weekdayOrdinal = week - 1;

NSDateComponents *startOfTheMonthComps = [NSDateComponents new];
startOfTheMonthComps.year = year;
startOfTheMonthComps.month = month;
NSDateComponents *endOfTheMonthComps = [NSDateComponents new];
endOfTheMonthComps.year = year;
endOfTheMonthComps.month = month + 1;

NSDate *startOfTheMonth = [cal dateFromComponents:startOfTheMonthComps];
NSDate *endOfTheMonth = [[cal dateFromComponents:endOfTheMonthComps] dateByAddingTimeInterval:-1];

NSDate *date = [comps date];
NSDate *startOfTheWeek;
NSDate *endOfWeek;
NSTimeInterval interval;
[cal rangeOfUnit:NSCalendarUnitWeekOfYear
       startDate:&startOfTheWeek
        interval:&interval
         forDate:date];

endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval];

startOfTheWeek = [startOfTheWeek dateByAddingTimeInterval:-1];


if ([startOfTheWeek compare:startOfTheMonth] == NSOrderedAscending) {
    startOfTheWeek = startOfTheMonth;
}

if ([endOfTheMonth compare:endOfWeek] == NSOrderedAscending) {
    endOfWeek = endOfTheMonth;
}
NSLog(@"start %@", startOfTheWeek);
NSLog(@"end %@", endOfWeek);

因此,对于11月1日的第一周,您将获得Fri Nov 1Mon Nov 4;对于9月的最后一周,您将获得{6}的第六周Sun Sep 29Mon Sep 30