1. 시작 전에 프로젝트 코드 기본 세팅하고 오기
https://growingsaja.tistory.com/869
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. 타이머 구현 결과 예시
'Development > iOS' 카테고리의 다른 글
[Objective-C] 앱 만들기 입문 - 1 : 하단 메뉴탭바 만들기 (0) | 2023.06.30 |
---|---|
[Objective-C] 입문하기 - 15 : extern const 사용해 외부 공유 가능한 상수 정의 및 호출 (0) | 2023.06.30 |
[Objective-C] 입문하기 - 13 : init 클래스 생성자 초기화 및 인스턴스 초기 데이터와 함께 생성해 사용하기 (0) | 2023.06.27 |
[Objective-C] 입문하기 - 12 : Encoding, Decoding 예제 (0) | 2023.06.26 |
[Objective-C] 입문하기 - 11 : String을 활용한 소스코드 - 응용 (0) | 2023.06.26 |