BIBI BLOG

[Objective-C]NSDate와 날짜다루기 본문

iOS/Objective-c

[Objective-C]NSDate와 날짜다루기

BIBI⭐️ 2020. 10. 5. 01:19
728x90

■NSDate의 기본

○현재 날짜와 시간(GMT단위)
NSDate* date = [NSDate date];
NSLog(@"%@",date);
○현재 날짜와 시간(Locale단위)
NSDate* date = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone systemTimeZone] secondsFromGMT]];
NSLog(@"%@",date);

○지정한 날짜의 인스턴스 생성하기(문자열 그대로의 시간)
NSString* dateString = @"
yyyy-MM-dd HH:mm:ss";
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // 타임존 지정 
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date: %@",date);
--------------------------------예제--------------------------------
NSString* dateString = @"2020-10-04 15:45:00";
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date: %@",date);
2020-10-04 15:45:00

○지정한 날짜의 인스턴스 생성하기(GMT시간으로 바꾸는 경우)
NSString* dateString = @"yyyy-MM-dd HH:mm:ss"; 
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:60 * 60 * 9]];  // 타임존 지정 
NSDate *date = [formatter dateFromString:dateString];
NSLog(@"date: %@",date);
--------------------------------예제--------------------------------
NSString* dateString = @"2020-10-04 15:45:00"; 
NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:60 * 60 * 9]]; //서울시간은 9시간 차이
NSDate *date = [formatter dateFromString:dateString]; 
NSLog(@"date: %@",date);
2020-10-04 06:45:00

■날짜 포맷하기

○포맷인스턴스 만들기
NSDateFormatter *변수 = [NSDateFormatter alloc];

○날짜 포맷해보기
NSDateFormatter *fmt = [NSDateFormatter alloc] init];
[fmt setDateFormat:@"《NSString*》"];
NSString* 변수 = [fmt stringFromDate:《NSDate*》];
--------------------------------예제--------------------------------
NSDate* date = [NSDate date];
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"<Y><M><d>"];
NSLog(@"%@",[fmt stringFromDate:date]);
<2020><10><4>

※날짜 포맷 기호
G           : 시대 (AD)
yy          : 년 (2자리 표기)   예: 12
yyyy      : 년 (4자리 표기)   예:2020
M          : 월 (1자리 표기)    예: 1~12
MM       : 월 (2자리 표기)   예:01~12
MMM    : 월 (약어) 예: Oct
MMMM : 월          예: October
d           : (1자리 표기)    예: 1~31
dd         : (2자리 표기)   예:01~31
EEE       : 요일 (약어) 예: 수
EEEE     : 요일           예: 수요일
aa          : 오전/오후
H           : 시 (24시간 단위, 1자리 표기)    예: 0~23
HH        : 시 (2자리 표기)   예:00~23
K           : 시 (12시간 단위, 1자리 표기)    예: 0~11
KK         : (2시간 단위, 2자리 표기)   예:00~11
m          : (1자리 표기)    예: 0~59
mm       : (2자리 표기)   예:00~59
s            : (1자리 표기)    예: 0~59
ss          : (2자리 표기)   예:00~59
S           : 밀리 초

■로케일로 날짜 포맷하기

로케일이란 국가와 지역, 사용 언어에 관한 종류를 나타낸것입니다.
NSDateFormatter *변수 = [《NSDateFormatter*》 setLocale:《NSLocale*》];

○로케일 설정하기
NSLocale* 변수 = [[NSLocale alloc] initWithLocaleIdentifier:《NSString*》];
→initWithLocaleIdentifier:@"kr",@"ja",@"en_US"

[《NSDateFormatter*》 setDateStyle:스타일 종류 ];
[《NSDateFormatter*》 setTimeStyle:스타일 종류 ];

※스타일 종류
비표시 :NSDateFormatterNoStyle
짧은형식:NSDateFormatterShortStyle
표준형식:NSDateFormatterMediumStyle
긴형식   :NSDateFormatterLongStyle

--------------------------------예제--------------------------------
NSDate* date = [NSDate date];
NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"kr"];
[fmt setDateStyle:NSDateFormatterLongStyle];
[fmt setTimeStyle:NSDateFormatterMediumStyle];
[fmt setLocale:locale];
NSLog(@"%@",[fmt stringFromDate:date]);
→October 4, 2020 at 02:20:05

■날짜 계산하기

날짜 계산하기
◯◯ 년 ◯ 월 ◯ 일부터 △△ 일 후라는 날짜를 더하거나 뺄때 사용되는 메소드
NSDate* 변수 = [《NSDate*》 dateByAddingTimeInterval:《NSTimeInterval》 ];
NSTimeInterval은 double 값으로 "  "를 나타내는 값입니다. 예를 들어 1 일이라면, 60 초 × 60 분 × 24 시간 = 86400 입니다.
--------------------------------예제--------------------------------
NSDate* date = [NSDate date]; // 2020/10/4
NSTimeInterval t = 60 * 60 * 24 * 1000; // 1000일
NSDate* date2 = [date dateByAddingTimeInterval:t];
NSLog(@"%@",date2);
→2023-07-1 23:44:31

두 날짜사이의 차이 구하기
NSTimeInterval 변수 = [《NSDate*》 timeIntervalSinceDate:《NSDate*》];
--------------------------------예제--------------------------------
NSDate* date = [NSDate date]; // 2020/10/4
NSString* dateString = @"2020/10/1";
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy/M/d"];
NSDate *date2 = [formatter dateFromString:dateString];
NSTimeInterval t = [date timeIntervalSinceDate:date2];
NSInteger days = (int)(t / (60 * 60 * 24));
NSLog(@"%ld",days);
4

NSCalendar 날짜 다루기

○달력으로부터 날짜다루기
NSCalendar *변수 = [NSCalendar currentCalondar];
NSDateComponents *변수 = [《NSCalendar*》 components:《NSCalendarUnit》 fromDate:《NSDate*》];

※달력 유닛

NSCalendarUnitEra - 시대 (기원전 · 서기 등)
NSCalendarUnitYear - 년 
NSCalendarUnitMonth - 월 
NSCalendarUnitDay - 일 
NSCalendarUnitHour - 시간 
NSCalendarUnitMinute - 분 
NSCalendarUnitSecond - 초
NSCalendarUnitWeekday - 요일 
NSCalendarUnitWeekdayOrdinal - 요일 (달의 몇 번째요일인지)
  예: WeekdayOrdinalUnit =2, WeekdayUnit = 3일 경우, 달의 두번째 화요일 

NSCalendarUnitWeekOfMonth - 주 (1 년의 몇 주째인지) 
NSCalendarUnitWeekOfYear - 주 (달의 몇 주째인지) 
NSCalendarUnitQuarter - 몇 사분기인지

유닛 지정 방법
NSCalendarUnit unit = NSYearCalendarUnit|NSMonthCalendarUnit; 
NSInteger 변수 = [《NSDateComponents*》 era];
NSInteger 변수 = [《NSDateComponents*》 year];
NSInteger 변수 = [《NSDateComponents*》 month];
NSInteger 변수 = [《NSDateComponents*》 day];
NSInteger 변수 = [《NSDateComponents*》 hour];
NSInteger 변수 = [《NSDateComponents*》 minute];
NSInteger 변수 = [《NSDateComponents*》 second];
NSInteger 변수 = [《NSDateComponents*》 week];
NSInteger 변수 = [《NSDateComponents*》 weekday];
NSInteger 변수 = [《NSDateComponents*》 weekdayOrdinal];
NSInteger 변수 = [《NSDateComponents*》 quarter];

--------------------------------예제--------------------------------
NSDate
* date = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents* dc = [calendar components:unit fromDate:date];
NSLog(@"%ld-%ld-%ld",[dc year],[dc month],[dc day]);
2020-10-5

○NSDateComponents로 시간길이 정하기
NSDateComponents* 변수 = [NSDateComponents alloc];

[《NSDateComponents*》 setEra:《NSInteger》];
[《NSDateComponents*》 setYear:《NSInteger》];
[《NSDateComponents*》 setMonth:《NSInteger》];
[《NSDateComponents*》 setDay:《NSInteger》];
[《NSDateComponents*》 setHour:《NSInteger》];
[《NSDateComponents*》 setMinute:《NSInteger》];
[《NSDateComponents*》 setSecond:《NSInteger》];
[《NSDateComponents*》 setWeekOfMonth:《NSInteger》];
[《NSDateComponents*》 setWeekday:《NSInteger》];
[《NSDateComponents*》 setWeekdayOrdinal:《NSInteger》];
[《NSDateComponents*》 setQuarter:《NSInteger》];

--------------------------------예제--------------------------------
1개월 2주의 경우:
「setMonth:1」 , 「setWeekOfMonth:2」
을 설정해주면 됩니다.

날짜 계산하기
NSDate *변수 = [《NSCalendar*》 dateByAddingComponents:
                          《NSDateComponents*》 toDate:《NSDate*》
                          options:《NSUInteger》]; // 옵션은 보통 0을 지정합니다.
--------------------------------예제--------------------------------
NSDate* date = [NSDate date]; // 2020-10-04 16:06:47
NSDateComponents* dc = [[NSDateComponents alloc] init];
NSCalendar* calendar = [NSCalendar currentCalendar];
[dc setMonth:1];
[dc setWeekOfMonth:2];
NSDate* date2 = [calendar dateByAddingComponents:dc toDate:date options:0];
NSLog(@"%@",date2);
→2020-11-18 16:04:52

두 날짜사이의 차이 구하기
NSDateComponents *변수 = [《NSCalendar*》 components:《NSCalendarUnit》
                                              fromDate:《NSDate*》 toDate:《NSDate*》 options:《NSUInteger》];
--------------------------------예제--------------------------------
NSDate* date = [NSDate date];  // 2020-10-04 16:17:33
NSString* dateString = @"2019-01-01 00:00:00";
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date2 = [formatter dateFromString:dateString];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitWeekOfMonth | NSCalendarUnitDay;
NSDateComponents* dc = [calendar components:unit fromDate:date2 toDate:date options:0];
NSLog(@"%ld주 %ld일",[dc weekOfMonth],[dc day]);
91주 5일


728x90
Comments