NSDate중 날짜 부분만을 변경 하거나 시간 부분만을 변경할 일이 필요해졌다.
NSDate에서 직접 변경은 불가능.
다음과 같은 방법으로 변경 해야한다.
NSCalendar
* cal = [NSCalendar
currentCalendar
];
NSCalendarUnit
unit = NSYearCalendarUnit
| NSMonthCalendarUnit
| NSDayCalendarUnit
| NSHourCalendarUnit
| NSMinuteCalendarUnit
;
NSDateComponents
* comps = [cal components
:unit fromDate
:birthDate];
NSDateComponents * newComps = [cal
components:unit
fromDate:time];
// 날자 부분을 변경해야 할 경우.
[comps setYear:newComps.year];
[comps setMonth:newComps.month];
[comps setDay:newComps.day];
// 시간 부분을 변경해야 할 경우.
[comps setHour:newComps.hour];
[comps setMinute:newComps.minute];
[self setBirthDate:[cal dateFromComponents:comps]];
[self.tableView reloadData];
[comps release];
[newComps release];
[cal release];
}
------
위 코드 대로 하면 프로그램이 죽는다. -> release하는 코드 삭제 후 정상 동작한다. 아직 메모리 관리에 관련되 충분한 이해가 없다.
* NSDate로 부터 year, month, day 에 해당하는 int값 얻기.
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:locale];
[locale release];
// Get year
[dateFormatter setDateFormat:@"yyyy"];
int year = [[dateFormatter stringFromDate:today] intValue];
// Get Month
[dateFormatter setDateFormat:@"MM"];
int month = [[dateFormatter stringFromDate:today] intValue];
// Get Day
[dateFormatter setDateFormat:@"dd"];
int day = [[dateFormatter stringFromDate:today] intValue];
[dateFormatter release];
------------
출처 : Bingsoo blog ( http://bingsoo.com/blog/?p=3708 )
Friday, December 10th, 2010
NSDate의 date method로 현재 날짜를 얻거나 UIDatePick의 date로 설정한 날짜를 얻어오는 경우, time부분을 옵션에서 꺼 놓았다 해도 현재 시각이 기록되는 문제가 발생한다. 두 개의 NSDate의 차이를 계산하는 경우 시간 때문에 정확한 계산이 이루어지지 않는데, 아래와 같은 방법으로 해결할 수 있다.
NSDate *date1, *date2가 있을 때
1
2
3
4
5
6
7
8
|
[gregorian rangeOfUnit:NSDayCalendarUnit
startDate:&date1
interval: NULL
forDate :date1 ];
[gregorian rangeOfUnit:NSDayCalendarUnit
startDate:&date2
interval: NULL
forDate :date2 ];
|
를 사용하면 각각 변수의 시간 정보가 그 날의 시작시간(beginning of the day)로 초기화된다. 최종 적으로
1
2
3
4
5
6
7
8
|
int result = 0 ;
NSCalendar *gregorian =
[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
result = [[gregorian components:NSDayCalendarUnit
fromDate :date1
toDate :date2
options: 0 ] day];
|
를 통해 시간 값이 상관 없이 두 NSDate 사이에 며칠의 차이가 있는지 구해낼 수 있다.