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

[iOS] 음력 변환(LunarSun Convert) 클래스

by Mr-후 2017. 4. 25.
반응형

일전에 SKT Cake iOS프로젝트에 참여를 할 때 맡았던 부분은 캘린더(일정) 부분이었다. 

안드로이드 앱이 이미 만들어져 있는 상태라 안드로이드 앱을 보면서 만들었는데 음력을 주기적으로 표시를 해주고 있었다. 

 

당시 음력 계산에 대해서는 구현을 해본적이 없어 살짝 당황했었다. 웹 기반에서는 자바스크립트 리소스가 상당히 많았지만 

iOS Objective-C형태로 구현된 리소스를 찾기가 만만치 않았는데 여기저기 떠도는 리소스를 찾아서 적용을 해보면 의외로 완벽한 음력 계산 리소스는 많지 않았다. 대체로 구현된지 오래되었고 특정 연도까지만 계산을 하는 방식이기도 했다. 

 

우연히 검색을 통해서 찾게 된 클래스가 있어 공유를 하고자 한다. 

 

GitHub 경로 --> https://github.com/vantoan8x/LunarSunConverter

 

나의 경우는 SunLunar클래스에 싱글톤 패턴을 추가해서 어디에서던 접근이 용이하게 했다. 

 

+ (id)sharedInstance;

 

그외는 GitHub의 리소스와 동일하다. 

 

//  SunLunar.h

 

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, LunarCalendarType) {

    LunarCalendarType_Simple = 100,

    LunarCalendarType_Holiday,

    LunarCalendarType_Full,

};

 

typedef struct

{

    int day;

    int month;

    int year;

} TimeSL;

 

@interface SunLunar : NSObject

 

+ (id)sharedInstance;

 

- (NSString *)getLunaCalendar:(NSDate *)date ret:(LunarCalendarType)type;

 

- (void) test;

 

// Convert Sun calendar to Lunar

- (TimeSL) convertSunToLunar:(TimeSL)date timeZone:(int)timeZone;

 

// Convert Sun calendar to Lunar

- (TimeSL) convertSunToLunar:(int)day month:(int)month year:(int)year timeZone:(int)timeZone;

 

// Convert Lunar to Sun calendar

- (TimeSL) convertLunarToSun:(TimeSL)date timeZone:(int)timeZone;

 

// Convert Lunar to Sun calendar

- (TimeSL) convertLunarToSun:(int)day month:(int)month year:(int)year lunarLeap:(int)lunarLeap timeZone:(int)timeZone;

 

// Get Date Components

- (TimeSL) getDateComponentsBy:(NSDate*)date;

 

// Get Today

- (TimeSL) getToday;

 

// Get Next Day

- (TimeSL) getPreviousDayBy:(NSDate*)date;

 

// Get Next Day

- (TimeSL) getPreviousDayBy:(int)day month:(int)month year:(int)year;

 

// Get Next Day

- (TimeSL) getNextDayBy:(NSDate*)date;

 

// Get Next Day

- (TimeSL) getNextDayBy:(int)day month:(int)month year:(int)year;

 

// Get count day of a Month

- (int) getNumberDayOfMonth:(int)month year:(int)year;

 

// get NSDate by Time separated numbers

- (NSDate*) getDateTimeBy:(int)day month:(int)month year:(int)year hour:(int)hour minute:(int)minute second:(int)second;

 

// Get Day of Week, Sunday = 1

- (int) getWeekDayBy:(int)day month:(int)month year:(int)year;

 

// Get Day of Week, Sunday = 1

- (int) getWeekDayBy:(NSDate*)date;

 

// Get Week of Year,

- (int) getYearWeekBy:(int)day month:(int)month year:(int)year;

 

// get Week of Year,

- (int) getYearWeekBy:(NSDate*)date;

 

// Get Day of Year,

- (int) getYearDayBy:(int)day month:(int)month year:(int)year;

 

// get Day of Year

- (int) getYearDayBy:(NSDate*)date;

 

// Get Week of Month,

- (int) getMonthWeekBy:(int)day month:(int)month year:(int)year;

 

// get Week of Month,

- (int) getMonthWeekBy:(NSDate*)date;

 

// Add some days to a day

- (TimeSL) addSomeDaysTo:(int)day month:(int)month year:(int)year addDays:(int)addDays;

 

// Add some days to a day

- (TimeSL) addSomeDaysTo:(TimeSL)day addDays:(int)addDays;

 

// Add some Months to a Date

- (TimeSL) addSomeMonthsTo:(TimeSL)day addMonths:(int)addMonths;

 

// Add some Months to a Date

- (TimeSL) addSomeMonthsTo:(int)month year:(int)year addMonths:(int)addMonths;

 

// Get Current Local TimeZone

- (int) getLocalTimeZoneNumber;

 

// Get Lunar Next Day from Lunar day

- (TimeSL) getLunarNextDay:(int)day month:(int)month year:(int)year;

 

// Get Lunar Previous Day from Lunar day

- (TimeSL) getLunarPreviousDay:(int)day month:(int)month year:(int)year;

 

// Get Leap From Sun Date

- (int) getLunarLeapFromSunDate:(int)day month:(int)month year:(int)year timeZone:(int)timeZone;

 

 

@end

 

SunLunar.m 

+ (id)sharedInstance {

    static SunLunar *_sharedSunLunar = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _sharedSunLunar = [[self alloc] init];

    });

    return _sharedSunLunar;

 

}

 

 

사용했던 방식 

    NSString *_title = [NSString stringWithFormat:@"%@ (%@)"

[CommonUtil stringFromDateWithFormat:_todayDate format:@"오늘 M d EEEE"],

[[SunLunar sharedInstance] getLunaCalendar:_todayDate ret:LunarCalendarType_Simple]];

 

 

천군만마를 얻는 기분이었다고 할까? ㅎㅎ 

 

 

 

 

 

 

 

 

 

 

<!— mobile browser only />

—>

반응형