ios 计算生辰八字和今日八字算法
2019-07-25 本文已影响0人
Padre_cfc6
八字 = 年柱 + 月柱 + 日柱 + 时柱
通俗说八字,其实就是古代的天干地支记时法。十天干十二地支的组合,记录时间。
60甲子为记时一个循环,也就是60年一轮回
_date_jiazi = @[
@"甲子", @"乙丑", @"丙寅", @"丁卯", @"戊辰", @"己巳", @"庚午", @"辛未", @"壬申", @"癸酉",
@"甲戌", @"乙亥", @"丙子", @"丁丑", @"戊寅", @"己卯", @"庚辰", @"辛巳", @"壬午", @"癸未",
@"甲申", @"乙酉", @"丙戌", @"丁亥", @"戊子", @"己丑", @"庚寅", @"辛卯", @"壬辰", @"癸巳",
@"甲午", @"乙未", @"丙申", @"丁酉", @"戊戌", @"己亥", @"庚子", @"辛丑", @"壬寅", @"癸卯",
@"甲辰", @"乙巳", @"丙午", @"丁未", @"戊申", @"己酉", @"庚戌", @"辛亥", @"壬子", @"癸丑",
@"甲寅", @"乙卯", @"丙辰", @"丁巳", @"戊午", @"己未", @"庚申", @"辛酉", @"壬戌", @"癸亥"
];
#十二地支
dz_num = @[@"子", @"丑", @"寅", @"卯", @"辰", @"巳",
@"午", @"未", @"申", @"酉", @"戌", @"亥" ];
#十天干
_tg_num = @[@"甲", @"乙", @"丙" , @"丁" ,@"戊" ,
@"己", @"庚", @"辛", @"壬", @"癸"];
获取公历日期 转农历日期
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth
| NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
#今日时间dateCom
NSDateComponents *dateComponent = [calendar components:unitFlags
fromDate:[NSDate date]];
_dateCom = dateComponent;
# 获取特定时间的date
NSDateFormatter* formater = [[NSDateFormatter alloc] init];
[formater setDateFormat:@"yyyy-M-d"];
NSString * timeStr = [NSString stringWithFormat:@"%ld-%ld-%ld",dateCom.year,dateCom.month,dateCom.day];
NSDate* dateTemp = [formater dateFromString:timeStr];
#农历时间dateCom
NSCalendar *localeCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents* NongLiCom = [localeCalendar components:unitFlags
fromDate:dateTemp];
#NongLiCom.year = 甲子数【1-60】
1,年柱
NSMutableDictionary * dateDic = [NSMutableDictionary dictionary];
NSInteger idx = self.NongLiCom.year - 1;
NSString* y = self.date_jiazi[idx];
NSString *y_tg = [y substringToIndex:1];
NSString *y_dz = [y substringFromIndex:1];
NSDictionary *yearDic = @{
@"tgdz":y, //年柱
@"tg":y_tg, //年地支
@"dz":y_dz //年地支
};
2 月柱
image.png甲己之年丙作首,乙庚之岁戊为头;
丙辛必定寻庚起,丁壬壬位顺行流;
更有戊癸何方觅,甲寅之上好追求。
写完发现与百度的天干地支对不上。经查发现原来与节气有关:
如2017-7 农历6月初四为乙庚午月 6月初五为辛未月
图片.png
图片.png
月柱月份
1月 | 2月 | 3月 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|
小寒-立春 | 立春-惊蛰 | 惊蛰-清明 | 清明-立夏 | 立夏-芒种 | 芒种-小暑 | 小暑-立秋 | 立秋-白露 | 白露-寒露 | 寒露-立冬 | 立冬-大雪 | 大雪-小寒 |
1月:小寒-立春 2月:立春-惊蛰 3月 :惊蛰-清明 4月:清明-立夏
_date_month =@{
@"甲、己" : @[@"丙寅" , @"丁卯" , @"戊辰" , @"己巳" , @"庚午" , @"辛未" , @"壬申" , @"癸酉" , @"甲戌" , @"乙亥" , @"丙子" , @"丁丑" ],
@"乙、庚" : @[@"戊寅" , @"己卯" , @"庚辰" , @"辛巳" , @"壬午" , @"癸未" , @"甲申" , @"乙酉" , @"丙戌" , @"丁亥" , @"戊子" , @"己丑" ],
@"丙、辛" : @[@"庚寅" , @"辛卯" , @"壬辰" , @"癸巳" , @"甲午" , @"乙未" , @"丙申" , @"丁酉" , @"戊戌" , @"己亥" , @"庚子" , @"辛丑" ],
@"丁、壬" : @[@"壬寅" , @"癸卯" , @"甲辰" , @"乙巳" , @"丙午" , @"丁未" , @"戊申" , @"己酉" , @"庚戌" , @"辛亥" , @"壬子" , @"癸丑" ],
@"戊、癸" : @[@"甲寅" , @"乙卯" , @"丙辰" , @"丁巳" , @"戊午" , @"己未" , @"庚申" , @"辛酉" , @"壬戌" , @"癸亥" , @"甲子" , @"乙丑" ]
};
NSArray * month_arry = [NSArray array];
if ([@"甲、己" containsString: y_tg]) {
month_arry = self.date_month[@"甲、己"];
}else if ([@"乙、庚" containsString:y_tg]){
month_arry = self.date_month[@"乙、庚"];
}else if ([@"丙、辛" containsString: y_tg]){
month_arry = self.date_month[@"丙、辛"];
}else if ([@"丁、壬" containsString: y_tg]){
month_arry = self.date_month[@"丁、壬"];
}else if ([@"戊、癸" containsString: y_tg]){
month_arry = self.date_month[@"戊、癸"];
}
#计算节气月的起始天
int index = [self solaComput:self.NongLiCom.month] - 1;
index = index<0?11:index;
NSString *m = month_arry[index];
NSString* m_tg = [m substringToIndex:1];
NSString *m_dz = [m substringFromIndex:1];![图片.png](https://img.haomeiwen.com/i7802419/247ce19e1be83c97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
NSDictionary *monDic = @{
@"tgdz":m,
@"tg":m_tg,
@"dz":m_dz
};
[dateDic setObject:monDic forKey:@"month"];
#计算节气
-(int)solaComput:(NSInteger)month
{
int year_num = self.GongLiCom.year % 100;
BOOL C = (self.GongLiCom.year/100 == 19) ;
int newMonth = (int)month;
switch (self.NongLiCom.month) {
case 1:{//小寒
int aa = (int)(year_num * 0.2422 + (C?6.11 : 5.4055) - (year_num-1)/4 );
if(self.GongLiCom.year == 2019) {
aa -= 1;
}else if (self.GongLiCom.year == 1918){
aa += 1;
}
if (month < aa) {
newMonth = 0;
}
NSLog(@"\n----小寒: 1月%d", aa);
}
break;
case 2:{//立春
int aa = (int)(year_num * 0.2422 + (C?4.15 : 3.87) - (year_num-1)/4 );
if (month < aa) {
newMonth = 1;
}
NSLog(@"\n----立春: 2月%d", aa);
}
break;
case 3:{//惊蛰
int aa = (int)(year_num * 0.2422 + 5.63 - (year_num)/4 );
if (month < aa) {
newMonth = 2;
}
NSLog(@"\n----惊蛰: 3月%d", aa);
}
break;
case 4:{//清明
int aa = (int)(year_num * 0.2422 + (C?5.59 : 4.81) - (year_num)/4 );
if (self.GongLiCom.year == 1911) {
aa += 1;
}
if (month < aa) {
newMonth = 3;
}
NSLog(@"\n----清明: 4月%d", aa);
}
break;
case 5:{//立夏
int aa = (int)(year_num * 0.2422 + (C?6.318 : 5.52) - (year_num)/4 );
if (month < aa) {
newMonth = 4;
}
NSLog(@"\n----立夏: 5月%d", aa);
}
break;
case 6:{//芒种
int aa = (int)(year_num * 0.2422 + (C?6.5 : 5.678) - (year_num)/4 );
if (self.GongLiCom.year == 1902) {
aa +=1;
}
if (month < aa) {
newMonth = 5;
}
NSLog(@"\n----芒种: 6月%d", aa);
}
break;
case 7:{//小暑
int aa = (int)(year_num * 0.2422 + (C?7.928 : 7.108) - (year_num)/4 );
if (self.GongLiCom.year == 1925 || self.GongLiCom.year == 2016) {
aa +=1;
}
if (month < aa) {
newMonth = 6;
}
NSLog(@"\n----小暑: 7月%d",aa);
}
break;
case 8:{//立秋
int aa = (int)(year_num * 0.2422 + (C?8.44 : 7.5) - (year_num)/4 );
if (self.GongLiCom.year == 2002) {
aa +=1;
}
if (month < aa) {
newMonth = 7;
}
NSLog(@"\n----立秋: 8月%d", aa);
}
break;
case 9:{//白露
int aa = (int)(year_num * 0.2422 + (C?8.44 : 7.646) - (year_num)/4 );
if (self.GongLiCom.year == 1927) {
aa +=1;
}
if (month < aa) {
newMonth = 8;
}
NSLog(@"\n----白露: 9月%d", aa);
}
break;
case 10:{//寒露
int aa = (int)(year_num * 0.2422 + (C?9.098 : 8.318) - (year_num)/4 );
if (month < aa) {
newMonth = 9;
}
NSLog(@"\n----寒露: 10月%d", aa);
}
break;
case 11:{//立冬
int aa = (int)(year_num * 0.2422 + (C?8.218 : 7.438) - (year_num)/4 );
if (self.GongLiCom.year == 2089) {
aa +=1;
}
if (month < aa) {
newMonth = 10;
}
NSLog(@"\n----立冬: 11月%d", aa);
}
break;
case 12:{//大雪
int aa = (int)(year_num * 0.2422 + (C?7.9 : 7.18) - (year_num)/4 );
if (self.GongLiCom.year == 1954) {
aa +=1;
}
if (month < aa) {
newMonth = 11;
}
NSLog(@"\n----大雪: 12月%d", aa);
}
break;
default:
break;
}
}
3,日柱
-(NSDictionary*)getDayTgDz:(NSDateComponents*)datecom
{
//日
// G = 4C + [C / 4] + 5y + [y / 4] + [3 * (M + 1) / 5] + d - 3
// Z = 8C + [C / 4] + 5y + [y / 4] + [3 * (M + 1) / 5] + d + 7 + I
// 其中 C 是世纪数减一,y 是年份后两位,M 是月份,d 是日数。1月和2月按上一年的13月和14月来算。奇数月i=0,偶数月i=6。G 除以10的余数是天干,Z 除以12的余数是地支
int C_num = (int)datecom.year/100;
int Y_num = datecom.year % 100;
int M_num ;
if (datecom.month == 1) {
M_num = 13;
Y_num -=1;
}else if(datecom.month == 2){
M_num = 14;
Y_num -=1;
}else{
M_num = (int)datecom.month;
}
int js = (datecom.month%2) ? 0 : 6;
int G = 4*C_num + (C_num / 4) + 5*Y_num + (Y_num / 4) + (3 * (M_num + 1) / 5) + (int)datecom.day - 3 -1;
int Z = 8*C_num + (C_num / 4) + 5*Y_num + (Y_num/ 4) + (3 * (M_num + 1) / 5) + (int)datecom.day +7 + js -1;
NSString *d_tg = self.tg_num[G%10];
NSString *d_dz = self.dz_num[Z%12];
NSString *d = [d_tg stringByAppendingString:d_dz]; ;
return @{
@"tgdz":d,
@"tg":d_tg,
@"dz":d_dz
};
}
4,时柱
/**
* 日上起时
* 甲己还生甲,乙庚丙作初,
* 丙辛从戊起,丁壬庚子居,
* 戊癸何方发,壬子是真途。
*/
image.png
int h_inx = ([self.hour intValue]+1)/ 2;
h_inx = h_inx>11?0:h_inx;
NSString * h_dz = self.dz_num[h_inx];
//日天干
NSString *d_tg = dayDic[@"tg"];
NSString *h_tg = @"";
if ([@"甲己" containsString:d_tg]) {
int tg_indx = h_inx % 10;
h_tg = self.tg_num[tg_indx];
}else if([@"乙庚"containsString:d_tg]){
int tg_indx = (h_inx +2) % 10;
h_tg = self.tg_num[tg_indx];
}else if([@"丙辛"containsString:d_tg]){
int tg_indx = (h_inx +4) % 10;
h_tg = self.tg_num[tg_indx];
}else if([@"丁壬"containsString:d_tg]){
int tg_indx = (h_inx +6) % 10;
h_tg = self.tg_num[tg_indx];
}else if([@"戊癸"containsString:d_tg]){
int tg_indx = (h_inx +8) % 10;
h_tg = self.tg_num[tg_indx];
}
NSString *h = [h_tg stringByAppendingString:h_dz];
NSDictionary *hourDic = @{
@"tgdz":h,
@"tg":h_tg,
@"dz":h_dz
};
[dateDic setObject:hourDic forKey:@"hour"];
百度弄了一天终于搞出来,传统文化博大精深啊,天干地支和很多东西都挂钩(如五行、生肖、老黄历中的东西基本都是用八字推算的)。
到这里八字就算完了 ,计算生辰八字 只需带入出生那年的年月日时即可。
原创感觉很棒