1. 시작 전에 프로젝트 코드 기본 세팅하고 오기

 

https://growingsaja.tistory.com/869

 

[Objective-C] 프로젝트 기본 세팅 소스코드 예시

1. AppDelegate 수정 with 설명 // vim AppDelegate.h #import // MARK: - [클래스 설명] /* // ----------------------------------------- 1. 애플리케이션 딜리게이트 (선언부) 2. 전역변수 , 메소드 , 인스턴스변수 (클래스 생

growingsaja.tistory.com

 

 

 

 

 

2. GMT의 현재 일시 가져오기 및 KST로 바꾸고 출력 포맷 설정해서 출력하는 소스코드  작성

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"

// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    // MARK: [프로토콜 메소드 호출 실시]
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    // [현재 GMT 날짜 얻어 오기]
    NSDate *nowGMTDateRaw = [NSDate date];
    NSLog(@"[NSDate 현재 Raw 일시 :: %@]", nowGMTDateRaw);
    
    // [날짜 형식 포맷 + GMT 세팅 :: 24시간 형태]
    NSDateFormatter *dateFormatterGMT = [[NSDateFormatter alloc] init];
    [dateFormatterGMT setDateFormat:@"yyyy-MM-dd kk:mm:ss E요일"];
    NSTimeZone *gmtTimeZone = [NSTimeZone timeZoneWithName:@"GMT"];
    [dateFormatterGMT setTimeZone:gmtTimeZone];
    
    // [현재 GMT 일시 출력]
    NSString *nowGMTString = @"";
    nowGMTString = [dateFormatterGMT stringFromDate:nowGMTDateRaw];
    NSLog(@"[GMT 현재 일시 :: %@]", nowGMTString);
    
    // [날짜 형식 포맷 + KST 세팅 :: 24시간 형태
    NSDateFormatter *dateFormatterKST = [[NSDateFormatter alloc] init];
    [dateFormatterKST setDateFormat:@"yyyy-MM-dd kk:mm:ss E요일"];
    NSTimeZone *kstTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Seoul"];
    [dateFormatterKST setTimeZone:kstTimeZone];
    
    // [현재 KST 일시 출력]
    NSString *nowKSTString = @"";
    nowKSTString = [dateFormatterKST stringFromDate:nowGMTDateRaw];
    NSLog(@"[KST 현재 일시 :: %@]", nowKSTString);
    
}


// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

3. GMT의 현재 일시 가져오기 및 KST로 바꾸고 출력 포맷 설정해서 출력하는 소스 실행 결과 예시

 

[NSDate 현재 Raw 일시 :: 2023-06-27 07:37:56 +0000]
[GMT 현재 일시 :: 2023-06-27 07:37:56 화요일]
[KST 현재 일시 :: 2023-06-27 16:37:56 화요일]

 

 

 

 

 

4. KST의 현재 일시에서 특정 시간만큼 과거 혹은 미래로 이동한 일시 출력하는 소스코드  작성

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"

// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    // MARK: [프로토콜 메소드 호출 실시]
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    // [현재 GMT 날짜 얻어 오기]
    NSDate *nowGMTDateRaw = [NSDate date];
    NSLog(@"[NSDate 현재 Raw 일시 :: %@]", nowGMTDateRaw);
    
    // [날짜 형식 포맷 + KST 세팅 :: 24시간 형태
    NSDateFormatter *dateFormatterKST = [[NSDateFormatter alloc] init];
    [dateFormatterKST setDateFormat:@"yyyy-MM-dd kk:mm:ss E요일"];
    NSTimeZone *kstTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Seoul"];
    [dateFormatterKST setTimeZone:kstTimeZone];
    
    // [현재 KST 일시 출력]
    NSString *nowKSTString = @"";
    nowKSTString = [dateFormatterKST stringFromDate:nowGMTDateRaw];
    NSLog(@"[KST 현재 일시 :: %@]", nowKSTString);
    
    // 1달 후 + 1주일 전 : KST 일시 정보 가져오기
    NSDateComponents *diffDate = [[NSDateComponents alloc] init];
    diffDate.month = 1;
    diffDate.day = -7;
    diffDate.hour = 2;
    diffDate.minute = -15;
    NSDate *oneMonthLaterGMT = [[NSCalendar currentCalendar] dateByAddingComponents:diffDate toDate:nowGMTDateRaw options:0];
    NSString *nowKSTString_oneMonthLater = @"";
    nowKSTString_oneMonthLater = [dateFormatterKST stringFromDate:oneMonthLaterGMT];
    NSLog(@"[KST 변경 후 일시 :: %@]", nowKSTString_oneMonthLater);
}


// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

5. KST의 현재 일시에서 특정 시간만큼 과거 혹은 미래로 이동한 일시 출력하는 소스코드  실행 결과 예시

 

[NSDate 현재 Raw 일시 :: 2023-06-27 07:56:56 +0000]
[KST 현재 일시 :: 2023-06-27 16:56:56 화요일]
[KST 변경 후 일시 :: 2023-07-20 18:41:56 목요일]

 

 

 

 

 

6. KST의 현재 일시에서 과거 1년간의 매주 월요일 일시 출력하는 소스코드  작성

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"

// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    // MARK: [프로토콜 메소드 호출 실시]
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    // [현재 GMT 날짜 얻어 오기]
    NSDate *nowGMTDateRaw = [NSDate date];
    
    // [날짜 형식 포맷 + KST 세팅 :: 24시간 형태
    NSDateFormatter *dateFormatterKST = [[NSDateFormatter alloc] init];
    [dateFormatterKST setDateFormat:@"yyyy-MM-dd kk:mm:ss E요일"];
    NSTimeZone *kstTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Seoul"];
    [dateFormatterKST setTimeZone:kstTimeZone];
    
    // 과거로 1년간 매주 월요일 정보 : KST 일시 정보 가져오기
    NSDate *midMonday = [NSDate date];
    NSDateComponents *previousWeek = [[NSDateComponents alloc] init];
    NSString *everyMondayKSTString = @"";
    for (int i = 1; i <= 52; i++) {
        previousWeek.weekOfYear = i;
        NSDate *previousMonday = [[NSCalendar currentCalendar] nextDateAfterDate:midMonday matchingUnit:NSCalendarUnitWeekday value:2 options:NSCalendarMatchNextTime | NSCalendarSearchBackwards];
        everyMondayKSTString = [dateFormatterKST stringFromDate:previousMonday];
        NSLog(@"오늘로부터 이전 %d번째 월요일: %@", i, everyMondayKSTString);
        
        midMonday = previousMonday;
    }
}


// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

7. KST의 현재 일시에서 과거 1년간의 매주 월요일 일시 출력하는 결과 예시

 

 

 

 

 

 

8. NSDate 데이터의 timestamp(밀리세컨즈) 도출 및 길이 측정, 형변환 예제 소스코드

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"

// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    // MARK: [프로토콜 메소드 호출 실시]
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    // [현재 날짜 및 시간 >> 타임 스탬프 변환 : 밀리 세컨드]
    NSDate *stampDate = [NSDate date];
    NSTimeInterval stampInterval = [stampDate timeIntervalSince1970];
    long long stampMilliseconds = stampInterval * 1000;
    
    NSLog(@"[타임 스탬프 :: %lld]", stampMilliseconds);
    NSLog(@"[길이 :: %lu]", [NSString stringWithFormat:@"%lld", stampMilliseconds].length);
    
    
    
    // [타임 스탬프 변환 >> 현재 날짜 및 시간 변환]
    NSTimeInterval milliseconds = stampMilliseconds; // 타임 스탬프 [밀리 세컨드]
    NSTimeInterval seconds = milliseconds / 1000.0;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds];
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // date 형식 포맷
    [formatter setDateFormat:@"yyyy-MM-dd kk:mm:ss"];
    NSString *nowDate = [formatter stringFromDate:date];
    
    NSLog(@"[현재 날짜 및 시간 :: %s]", nowDate.description.UTF8String);
}

// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

9. NSDate 데이터의 timestamp(밀리세컨즈) 도출 및 길이 측정, 형변환 예제 실행 결과

 

 

 

 

 

 

10. 타이머 구현 소스코드 작성

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"

// MARK: - [헤더 [선언부] 호출]
// MARK: - [Private 변수 선언 영역]
@interface ViewController (){
    NSTimer *timerRepeat; // [타이머 객체]
    int timerCount; // [타이머 카운트]
}
@end

@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    
    // MARK: [타이머 동작 수행 메소드 호출]
    [self startTimer];
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [타이머 시작 메소드 선언 실시]
- (void)startTimer {
    NSLog(@"[ViewController >> startTimer() :: 타이머 시작 실시]");
    
    // [사전 이미 타이머가 동작 중인 경우 종료 실시]
    [self stopTimer];
    
    // [사전 변수값 초기화 수행 실시]
    timerCount = 1;
    
    // [타이머 객체 생성 수행 실시 : 1초 마다 반복 수행 실시 : 타이머 동작 콜백 메소드 (timerCallback)]
    timerRepeat = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(timerCallback:) userInfo:nil repeats:YES];
}


// MARK: - [타이머 실시간 동작 수행 부분]
-(void)timerCallback:(NSTimer*)timer {
    NSLog(@"[ViewController >> timerCallback() :: 실시간 타이머 동작 수행]");
    NSLog(@"[카운트 :: %d]", timerCount);
    
    // [특정 카운트 값이 된 경우 타이머 종료 실시]
    if (timerCount != 0 && timerCount >= 5){
        NSLog(@"[ViewController >> timerCallback() :: 실시간 타이머 동작 종료]");
        // [타이머 종료 호출 실시]
        [self stopTimer];
    }
    
    // [특정 로직 처리 실시]
    
    // [타이머 카운트 값 증가 실시]
    timerCount ++;
}


// MARK: - [타이머 종료 메소드 선언 실시]
- (void)stopTimer {
    NSLog(@"[ViewController >> stopTimer() :: 타이머 종료 실시]");
    
    // [사전 타이머 객체가 널이 아닌지 확인 후 종료]
    if (timerRepeat != nil && [timerRepeat isValid]){ // [타이머가 널이 아니고 , 동작 중인 경우]
        [timerRepeat invalidate]; // [타이머 동작 종료]
        timerRepeat = nil; // [타이머 객체 널 만듦]
    }
    
    
    // [변수값 초기화 수행 실시]
    timerCount = 1;
}


// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

11. 타이머 구현 결과 예시

 

 

 

 

+ Recent posts