美文网首页
NSDate转换公历、农历

NSDate转换公历、农历

作者: Geniune | 来源:发表于2019-01-04 14:12 被阅读5次

最近研究天干地支五行八卦,纯(bu)粹(wu)爱(zheng)好(ye),如有写的不对的地方欢迎大家指出
废话不多说,直接上代码

- (void)tranformDate:(NSDate *)date{
    
    //公历数据:
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    //年
    NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
    //月
    NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
    //日
    NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];
    //时
    NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:date];
    //周
    NSInteger week = [calendar component:NSCalendarUnitWeekday fromDate:date];
    
    _label1.text = [NSString stringWithFormat:@"%zd年%zd月%zd日(星期%@) %zd点", year, month, day, [self getChineseWeek:week - 1], hour];
    
    NSLog(@"公历:%zd年%zd月%zd日(星期%@) %zd点", year, month, day, [self getChineseWeek:week - 1], hour);
    
    //农历数据:
    NSCalendar *chinaCalendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierChinese];
    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
    NSDateComponents*localeComp = [chinaCalendar components:unitFlags fromDate:date];
    //年
    NSInteger chinaYear = localeComp.year;
    //月
    NSInteger chinaMonth = localeComp.month;
    //日
    NSInteger chinaDay = localeComp.day;
    //时
    NSInteger chinaHour = localeComp.hour;
    
    if(localeComp.hour == 23){//特殊处理:如果已超过晚11点,农历日应按第二天计算
        
        date = [NSDate dateWithTimeInterval:1*60*60 sinceDate:date];//后一天
        localeComp = [chinaCalendar components:unitFlags fromDate:date];
        
        chinaYear = localeComp.year;
        chinaMonth = localeComp.month;
        chinaDay = localeComp.day;
        chinaHour = 0;
        
        year = [calendar component:NSCalendarUnitYear fromDate:date];
        month = [calendar component:NSCalendarUnitMonth fromDate:date];
        day = [calendar component:NSCalendarUnitDay fromDate:date];
        hour = [calendar component:NSCalendarUnitHour fromDate:date];
    }
    
    NSString *chinaHourString = [self getChinaHour:chinaHour];
    
    NSString *YearStems = [NSString stringWithFormat:@"%@%@", [self getStemsWithYear:chinaYear], [self getEarthlyBranchesWithYear:chinaYear]];
    
    NSLog(@"农历:%@年%@月%@日 %@", YearStems, [self getChinaMonth:chinaMonth], [self getChinaDay:chinaDay], chinaHourString);
}

- (NSString *)getChineseWeek:(NSInteger)week{
    NSArray *weekArray = @[@"日", @"一", @"二", @"三", @"四", @"五", @"六"];
    return [weekArray objectAtIndex:week];
}

//农历年 转换 天干
- (NSString *)getStemsWithYear:(NSUInteger)year{
    NSInteger heavenlyIndex = (year - 1) % 10;
    return _arrStems[heavenlyIndex];
}

//农历年 转换 地支
- (NSString *)getEarthlyBranchesWithYear:(NSUInteger)year{
    NSInteger earthIndex = year % _arrBranches.count - 1;
    return _arrBranches[earthIndex];
}

//农历月
- (NSString *)getChinaMonth:(NSInteger)month{
    
    NSArray *chineseMonths=[NSArray arrayWithObjects:@"正", @"二", @"三", @"四", @"五", @"六", @"七", @"八",@"九", @"十", @"冬", @"腊", nil];

    return [chineseMonths objectAtIndex:month-1];
}
//农历日
- (NSString *)getChinaDay:(NSUInteger)day{
    
    if(day < 0 || day > 30){
        return @"";
    }
    
    NSArray *chineseDays=[NSArray arrayWithObjects:@"初一",@"初二",@"初三",@"初四",@"初五",@"初六",@"初七",@"初八",@"初九",@"初十",@"十一",@"十二",@"十三",@"十四",@"十五", @"十六",@"十七",@"十八",@"十九",@"二十",@"廿一",@"廿二",@"廿三",@"廿四",@"廿五",@"廿六",@"廿七",@"廿八",@"廿九",@"三十",nil];
    return [chineseDays objectAtIndex:day-1];
}

使用NSDate对象调用tranformDate:方法即可

[self tranformDate:[NSDate date]];

输出:

公历:2019年1月4日(星期五) 14点
农历:戊戌年冬月廿九日 未时

如果本文对你有所帮助记得点个喜欢哈

相关文章

网友评论

      本文标题:NSDate转换公历、农历

      本文链接:https://www.haomeiwen.com/subject/ivbhrqtx.html