저는 아직 iOS에 익숙하지 않고 NSDate에 조금 어려움을 겪고 있습니다. 내가 그 일정 기간의 시작 및 종료 날짜를 원하는 CostPeriod에 따라로케일 설정 등을 고려한 일부 NSDate 질문
CostPeriodDaily
CostPeriodWeekly
CostPeriodMonthly
CostPeriodSemiAnnually
CostPeriodAnnually
: 기본적으로 나는 특정 내 응용 프로그램에서 CostPeriods 있습니다. CostPeriodDaily는 당연히 (즉 오늘부터) 16.Feb 2014 00:00:00 (현지 시간) - 16.Feb 2014 23:59:59 (현지 시간)입니다. 01.Feb 2014 0시 0분 0초에서 것이다 월 - 28.Feb 2014 23시 59분 59초 등
나는 처음 두 구체적인 질문이 있습니다
- NSWeekdayCalendarUnit : 1 항상 일요일 7을 토요일? 상관없이 로케일이 설정되어 있습니까?
- 내 종료일 (다음 코드와 같이)을 NSLog로 지정하거나 시작일 인 경우 보통 GMT + 1 시간대에 살고 있기 때문에 날짜는 23:00:00입니다. 이 올바른지?
- :-) 내 endDate가 함수에 지금
그리고 , 두 개의 추가 질문이 일반적으로이 기능을 확인인가 아니면 특정 로케일 설정에 따라 몇 가지 문제로 실행됩니다?
+ (있는 NSDate *) endDateForCurrentCostPeriod (CostPeriod) costPeriod { NSCalendar 양력 * = [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;
}
고마워 마틴. 내가 정확히 당신이 방법은 지역 작동 이해한다면, 월요일 또는 일요일에 상관없이 등 어떤 시간대, 일주일의 첫날에 상관없이없는 경우는? 그리고이 접근 방식으로 일정 기간의 시작 날짜를 얻는 방법을 보여 주시겠습니까? – MichiZH
@MichiZH : 시작 날짜는 이미 해당 코드로 계산됩니다. 이것은'startDate : & startOfPeriod' 인수에서 조금 숨겨져 있습니다. 네, 로케일과 시간대에 따라 올바른 결과를 제공해야합니다. –
다시 한번 고마워요. 내 응용 프로그램에서 지금을 다할 것입니다 :-) – MichiZH