【发布时间】:2014-02-16 13:31:17
【问题描述】:
我对 iOS 还是有点陌生,并且在使用 NSDate 时遇到了一些困难。基本上我的应用中有特定的 CostPeriods:
CostPeriodDaily
CostPeriodWeekly
CostPeriodMonthly
CostPeriodSemiAnnually
CostPeriodAnnually
根据 CostPeriod,我想要那个特定时期的开始和结束日期。 CostPeriodDaily 当然是从(即今天)2014 年 2 月 16 日 00:00:00(当地时间)- 2014 年 2 月 16 日 23:59:59(当地时间)。每月将从 2014 年 2 月 1 日 00:00:00 到 2014 年 2 月 28 日 23:59:59 等。
我首先有两个具体问题:
- NSWeekdayCalendarUnit:1 总是星期日和 7 星期六?不管 设置了什么语言环境?
- 如果我 NSLog 我的 endDate(如下面的代码)或开始日期,它通常是日期和 23:00:00,因为我生活在时区 格林威治标准时间+1。这是正确的吗?
现在到我的 endDate 函数,还有两个问题:-)
- 这个功能一般可以吗?或者我会根据特定的语言环境设置出现一些问题?
- 我的 CostPeriodWeekly 案例给了我今天的错误日期 2014-02-15 23:00:00 +0000。我不知道为什么...?
+(NSDate *)endDateForCurrentCostPeriod:(CostPeriod)costPeriod{ NSCalendar *gregorian = [[NSCalendar 分配] 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;
}
【问题讨论】:
标签: ios localization nsdate