'국가별시간처리'에 해당되는 글 1건

  1. 2015.01.17 [Objective-c] NSDate 이해 - Unix시간 이용하는 방법

앱 개발시 국제화 대응을 생각한다면 국가별언어처리와 국가별 시간처리를 미리 생각해 둘 필요가 있다.

특히 시간처리경우 서버 클라이언트 환경 혹은 다른 디바이스간의 통신환경일 경우 GMT를 계산해 넣지 않으면 데이타의 시간이 뒤죽박죽 되기 때문이다.

이번프로젝트에서도 이런 상황이 또 발생하여 대규모의 리팩토링을 했기에 이번에 확실히 정리해 두려고 한다.




이 이슈에 대하서 먼저 이해해야 할 두가지 단어가 있다. 


타임존(TimeZone)
말그대로 시간대 지역이다. 지구상의 모든국가는 나라,지역별로 시간대를 가지고 있는데 인간이 생활편의를 위한 시간개념이다. 예를들어 오전 10시면 해가 떠있는 아침이고 어둑어둑 해지면 오후 6시면 저녁이라는 시간개념이라고 해두자.

표준시(GMT)
지구상에서 기준이 되는 시간이다. 인간은 생활하는데 각자 편리하게 시간대를 정했지만 기준이 없다면 어느시간이 늦는지 빠른지 알수 없게 된다. 그래서 만든것이 표준시(GMT)이다.(일것이다.) 예를 들어 동경은 표준시보다 9시간 시차가 있으므로 GMT+09:00 의 형태로 표현 할 수 있다.

그럼 코딩에 세계에서는 어떻게 활용되는지 보자.

NSDate
NSDateはGMT에서 1970년1월1일 00:00:00부터 경과한 초를 날짜로 관리한다. 그러므로 타임존이 적용되지 않은 시간인것이다. 그러니까 당연히 날짜에 관련된 메소드도 없다. getYear, getMinute, getWeekday등등.. 간단히 NSDate는 GMT 시간이라고 알아두면 되겠다.


NSDate에서 타임존이 적용된 날짜를 얻는 방법은?
타임존이 적용된 날짜를 얻기 위해선 물론 현재 시간대(Timezone)의 달력이 달력이 있어야 한다. 

그것을 코드로 표현하면 

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)으로 변환하여 저장하고  표시할 경우에만 타임존을 적용하였다. 

모두 유틸클래스로 공통화하는 리팩토링도 같이했는데 다수의 개발자가 작업하는 플젝에서는 엉뚱한 짓을 못하게 하는것도 중요한것 같다.


Posted by 악당잰 트랙백 0 : 댓글 0

댓글을 달아 주세요