본문 바로가기
프로그래밍/iOS

NSDate / NSDateFormatter date

by 백룡화검 2012. 2. 15.

//NSDateFormatter 를 생성한다.
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
//데이트 형식을 지정한다.
[inputFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"];

//inputFormatter 에 지정한 형식대로 NSDate 가 생성된다.
NSDate *formatterDate = [inputFormatter dateFromString:@"1999-07-11 at 10:30"];
//위에 까지가 날짜 생성

//NSDateFormatter 를 생성한다.
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
// 날짜 포맷을 세팅한다.
[outputFormatter setDateFormat:@"HH:mm 'on' EEEE MMMM d"];
//포맷된 형식되로 날짜를 NSString 으로 보여준다. formatterDate 은 위에서 세팅한 날짜 NSDate 값
NSString *newDateString = [outputFormatter stringFromDate:formatterDate];
//로그에 출력해서 본다.
NSLog(@"newDateString %@", newDateString);

부록

 enum {    // date and time format styles
NSDateFormatterNoStyle = kCFDateFormatterNoStyle,
NSDateFormatterShortStyle = kCFDateFormatterShortStyle,
NSDateFormatterMediumStyle = kCFDateFormatterMediumStyle,
NSDateFormatterLongStyle = kCFDateFormatterLongStyle,
NSDateFormatterFullStyle = kCFDateFormatterFullStyle
};
 NSDate *date = [NSDate date];
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
[dateFormatter setDateStyle:NSDateFormatterFullStyle];
 NSDateFormatterNoStyle :  ()
NSDateFormatterShortStyle : 10/24/08 (M/d/yy)
NSDateFormatterMediumStyle : Oct 24, 2008 (MMM d, yyyy)
NSDateFormatterLongStyle : October 24, 2008 (MMMM d, yyyy)
NSDateFormatterFullStyle : Friday, October 24, 2008 (EEEE, MMMM d, yyyy)

yyyy : 년도

w : 일년안에서 몇번째 주인지

W : 한달안에서 몇번째 주인지

MM : 월

dd : 일

D : 일년에서 몇번째 일인지

E : 요일 (ex) TuesdayTue

F : 요일을 숫자로 (ex) 2

hh : 시간 ( 12시간 단위로 1-12) 

kk : 시간 (12시간 단위로 0-11)

HH : 시간 (24시간 단위로 1-24)

KK : 시간 (24시간 단위로 0-23)

a : PM 인지 AM 인지

mm : 분

ss : 초. second in minute

SSS : Millisecond

zzzz : General time zone (ex) Pacific Standard TimePSTGMT-08:00

Z : RFC 822 time zone (ex) -800

 

Date and Time PatternResult
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700


NSDateFormatter가 제공하는 기본 스타일을 사용하지 않고 사용자가 직접 스타일을 지정하여 날짜의 문자열을 얻을 수 있습니다. 아래의 코드를 보시죠 :)

//커스텀 날짜 형식
{
        NSDate *today = [NSDate date];
        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormat setDateFormat:@"MM/dd/yyyy hh:mma"];
        NSString *dateString = [dateFormat stringFromDate:today];
        NSLog(@"Custom Style Date : %@", dateString);
}
//출력결과
//Custom Style Date : 10/06/2010 03:39PM

위에서 MM, dd, yyyy 와 같은 형식지정자가 어떤 역할을 하는지 알아야 하는데 어디서 그 내용을 알 수 있을까요? 바로 ICU (International Components for Unicode)에서 표준 날짜 형식 지정자를 정해 놓습니다. 여기서 제공하는 문서에서 날짜 형식 패턴 부분을 보면 자세한 설명과 간단한 예제가 있습니다. 아래에 예제를 첨부합니다.

PatternResult (in a particular locale)
yyyy.MM.dd G 'at' HH:mm:ss zzz 1996.07.10 AD at 15:08:56 PDT
EEE, MMM d, ''yy Wed, July 10, '96
h:mm a 12:08 PM
hh 'o''clock' a, zzzz 12 o'clock PM, Pacific Daylight Time
K:mm a, z 0:00 PM, PST
yyyyy.MMMM.dd GGG hh:mm aaa 01996.July.10 AD 12:08 PM


코드를 통해 몇가지 예제를 더 살펴 보겠습니다.

//커스텀 날짜 형식
{
        NSDate *today = [NSDate date];
        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
        NSString *dateString = [dateFormat stringFromDate:today];
        NSLog(@"%@", dateString);
}
//출력결과
//Wednesday October 6, 2010
//커스텀 날짜 형식
{
        NSDate *today = [NSDate date];
        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormat setDateFormat:@"H:mm a, zzz"];
        NSString *dateString = [dateFormat stringFromDate:today];
        NSLog(@"%@", dateString);        
}
//출력결과
//15:39 PM, GMT+09:00

문자열로 표현된 날짜 데이터를 NSDate 객체로 바꾸는 것도 빈번히 일어나는 일입니다. 간한히 예로 들면 100610 이라고 표현된 날짜 문자열을 2010/10/06으로 바꾸고 싶을 때 다음 순서를 따라야 합니다.

  1. 우선 100610 을 NSDateFormatter를 이용하여 NSDate 객체로 변환한다
  2. 변환된 NSDate 를 NSDateFormatter를 이용하여 원하는 날짜 문자열을 얻는다. 
위의 순서대로 작성한 코드를 보겠습니다 :)
//문자열 날짜를 NSDate로 변경하기
{
        NSString *dateStr = @"20020505";
        
        // 1. NSDate로 변경하기
        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormat setDateFormat:@"yyyyMMdd"];
        NSDate *date = [dateFormat dateFromString:dateStr];
        
        // 2. 원하는 문자열 얻기
        [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
        dateStr = [dateFormat stringFromDate:date];
        
        NSLog(@"%@", dateStr);
}
//출력결과
//Sunday May 5, 2002
문자열로 표현된 날짜 데이터를 NSDate 객체로 변경하여 날짜간의 차이를 얻는 것은 NSDate 의 인스턴스 메소드인 timeIntervalSinceDate 를 이용하면 됩니다


지역에 맞게 날짜 데이터를 출력해 보겠습니다. 우선 현재 사용하고 있는 아이폰이 어떤 지역 설정을 사용하는지 알아보겠습니다. 아래 코드를 보시죠 :)

//아이폰이 현재 사용하고 있는 지역 설정 표시
{
        NSLocale *locale = [NSLocale currentLocale];
        NSLog(@"Current Locale : %@", [locale localeIdentifier]);
}
//출력결과 (시뮬레이터)
//Current Locale : en_US
위 결과를 보시면 현재 지역이 미국으로 설정되어 있습니다. 이를 한국으로 바꾸면 월 이름과 요일 이름이 한글로 출력됩니다. 아래 코드를 보시죠 :)
//지역 설정을 한국으로 변경하기
{
        NSDate *today = [NSDate date];
        
        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
        [dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ko_KR"] autorelease]];
        
        NSString *dateString = [dateFormat stringFromDate:today];
               
        NSLog(@"Today : %@", dateString);
}
//출력결과
//Today : 수요일 10월 6, 2010
NSLocale을 "ko_KR"로 생성하여 NSFormatter에 설정해 주면 됩니다. 그럼 일본어로 표시해 볼까요?
//지역 설정을 일본으로 변경하기
{
        NSDate *today = [NSDate date];
        
        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
        [dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease]];
        
        NSString *dateString = [dateFormat stringFromDate:today];       
        
        NSLog(@"Today : %@", dateString);
}
//출력결과
//Today : 水曜日 10月 6, 2010
지금까지 NSDate와 NSDateFormatter에 대해서 알아보았습니다. 해피코딩하세요!

출처 : http://smallsnail.thoth.kr/?mid=blog&document_srl=11289567