我仍然是iOS的新手,并且与NSDate有点挣扎 . 基本上我在我的应用程序中有一定的CostPeriods:
CostPeriodDaily
CostPeriodWeekly
CostPeriodMonthly
CostPeriodSemiAnnually
CostPeriodAnnually
根据CostPeriod,我想要特定时期的开始和结束日期 . CostPeriodDaily当然是来自(即今天)16.Feb 2014 00:00:00(当地时间) - 16.Feb 2014 23:59:59(当地时间) . 每月将从01.Feb 2014 00:00:00 - 28.Feb 2014 23:59:59等 .
我首先提出两个具体问题:
-
NSWeekdayCalendarUnit:1个星期天和7个星期六?无论设置什么语言环境?
-
如果我NSLog我的endDate(如下面的代码)或开始日期,它通常是日期和23:00:00,因为我住在GMT 1时区 . 这是正确的吗?
现在到我的endDate函数,还有两个问题:-)
-
这个功能一般是否正常,或者我会遇到一些问题,具体取决于具体的区域设置?
-
我的CostPeriodWeekly案例给了我错误的日期2014-02-15 23:00:00 0000今天 . 我不知道为什么......?
(NSDate *)endDateForCurrentCostPeriod:(CostPeriod)costPeriod {NSCalendar * gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents =
[gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit ) fromDate:[NSDate date]];
NSRange daysOfCurrentMonth = [gregorian rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
NSDateComponents *endDateComponents = [[NSDateComponents alloc] init];
switch (costPeriod) {
case CostPeriodDaily:
[endDateComponents setDay:[todayComponents day]];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
break;
case CostPeriodWeekly:
//Weekday 1 = sunday, 2 = monday
if([todayComponents weekday] == 1){
//Sunday -> do nothing, we have the end date
[endDateComponents setDay:[todayComponents day]];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
} else {
// all other days of current week, so 8- weekday (if Friday: 8 - 6 = + 2 -> Sunday)
NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];
[componentsToAdd setDay: 8 - [todayComponents weekday]];
NSDate *endOfWeek = [gregorian dateByAddingComponents:componentsToAdd
toDate:[NSDate date] options:0];
NSDateComponents *endOfWeekComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:endOfWeek];
[endDateComponents setDay:[endOfWeekComponents day]];
[endDateComponents setMonth:[endOfWeekComponents month]];
[endDateComponents setYear:[endOfWeekComponents year]];
}
break;
case CostPeriodMonthly:
[endDateComponents setDay:daysOfCurrentMonth.length];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
break;
case CostPeriodSemiAnnually:
[endDateComponents setYear:[todayComponents year]];
if([todayComponents month] <= 6){
[endDateComponents setDay:30];
[endDateComponents setMonth:6];
} else {
[endDateComponents setDay:31];
[endDateComponents setMonth:12];
}
break;
case CostPeriodAnnually:
[endDateComponents setDay:31];
[endDateComponents setMonth:12];
[endDateComponents setYear:[todayComponents year]];
break;
default:
[endDateComponents setDay:daysOfCurrentMonth.length];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
break;
}
NSDate *endDate = [gregorian dateFromComponents:endDateComponents];
return endDate;
}
1 回答
那是正确的 . 但这并不意味着1 =星期天总是被认为是本周的第一天 .
NSCalendar
有一个firstWeekDay
方法,这是依赖于语言环境的 . (例如,在德国,星期一是一周的第一天 . )那是正确的 .
你的方法看起来过于复杂 . 确定您可以使用的时间段
这应该根据您的语言环境正常工作 . 今天(德国,2月16日,星期日)的当前一周将给出结果
因为这周从星期一开始 . (所以实际上
endOfPeriod
不是期末,而是下一期的开始 . )对于 semi-annual period ,没有相应的
NSCalendarUnit
,因此您可以按以下步骤操作:EDIT: Changed everything with the help from Martin to this. Works, but still confused about the end date +1day +1 hour necessity...