앱 개발시 국제화 대응을 생각한다면 국가별언어처리와 국가별 시간처리를 미리 생각해 둘 필요가 있다.
특히 시간처리경우 서버 클라이언트 환경 혹은 다른 디바이스간의 통신환경일 경우 GMT를 계산해 넣지 않으면 데이타의 시간이 뒤죽박죽 되기 때문이다.
이번프로젝트에서도 이런 상황이 또 발생하여 대규모의 리팩토링을 했기에 이번에 확실히 정리해 두려고 한다.
이 이슈에 대하서 먼저 이해해야 할 두가지 단어가 있다.
NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger flags = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay;
NSDateComponents *comps =[calendar components:flags fromDate:date];
[comps setCalendar:calendar];
// NSDate data1 = comp.date;
이렇게 얻은 데이타는 언어포멧에 맞추어 출력을 할 수도 있다.
NSString *dateTimeString = [NSString stringWithFormat:@"%d년%d월%d일 %d시%d분%d초",
comps.year, comps.month, comps.day,
comps.hour, comps.minute, comps.second];
그러나 위의 방법 보다는 NSDateFormatter 로컬라이즈를 적용하여 문자열을 얻는 방법이 더 유용하다.
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy/M/d H:mm"];
NSString *dateString = [dateFormatter stringFromDate:date];
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 카렌다를 생략하면 언어설정에 의해 양력이외에 표기로 되는수도 있으므로 꼭 설정해 주자.
// 예를들어 일본의 경우 연호를 사용한 일본달력이 되는 수도 있다.
dateFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
dateFormatter.dateStyle = NSDateFormatterLongStyle;
dateFormatter.timeStyle = NSDateFormatterShortStyle;
NSString *dateString = [dateFormatter stringFromDate:date];
덧붙여 블루투스 장비의 경우는 Unix시간을 쓰는 경우가 많은데 이경우에는 아래와 같은 코드로 변환해 주면된다. - Unix시간도 GMT기준이다.
//NSDate → UNIX시간
NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
NSLog(@"timestamp: %f", timestamp);
//UNIX시간 → NSDate
NSTimeInterval interval = [timestamp doubleValue] / 1000; // ms -> sec
NSDate* expiresDate = [NSDate dateWithTimeIntervalSince1970:interval];
NSLog(@"expiresDate: %@", expiresDate);
//NSDate → NSString
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSString *dateString = [dateFormatter stringFromDate:expiresDate];
NSLog(@"dateString: %@", dateString);
이번프로젝트의 경우는 CoreData에 저장하는 데이타는 모조리 UnixTime(UInt64)으로 변환하여 저장하고 표시할 경우에만 타임존을 적용하였다.
모두 유틸클래스로 공통화하는 리팩토링도 같이했는데 다수의 개발자가 작업하는 플젝에서는 엉뚱한 짓을 못하게 하는것도 중요한것 같다.
'코딩(プログラミング)' 카테고리의 다른 글
Objective-C에서의 output parameter 사용시 ARC 생각하기 (2) | 2015.02.02 |
---|---|
[Objective-c]Parse를 이용한 앱개발 ( PFObject를 이펙티브하게 사용하기) (0) | 2015.01.17 |
[Objective-c] NSDate 이해 - Unix시간 이용하는 방법 (0) | 2015.01.17 |
Assets Catalog를 사용하고 있는 앱안에서 아이콘 이미지(AppIcon) 사용하기 (1) | 2015.01.14 |
메타데이터 리젝 - 앱스토어에 프리뷰 동영상 만들기. (0) | 2015.01.11 |
네비게이션바에 커스텀뷰를 붙일경우의 주의점 (0) | 2015.01.07 |
댓글을 달아 주세요