实现日期到农历五行八字转换

公历转农历(C版本)       前段时间做软件写了个公历转农历的函数,目前公开给大家参考,有兴趣的朋友可以在此基础上进一步完善其功能/*------------农历转换函数-----------*/char *GetDayOf(PSYSTEMTIME pSt){  /*天干名称*/ const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"} 阅读详情

这个程序是根据一个C版的公历转农历的程序改的,当初改成了VB版的,昨天被我翻出来又改成了伪C++版,因为时间久了,又是几经“转译”,程序未必完美,权当娱乐吧

#include <cstring>
#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///初始化数据
	//天干表
	const char TianGan[10][3] = {"甲", "乙", "丙", "丁", "戊" , "己", "庚", "辛", "壬", "癸"};
	//地支表
	const char DiZhi[12][3] = {"子", "丑", "寅", "卯", "辰", "巳" , "午", "未", "申", "酉", "戌", "亥"};
	const char ShuXiang[12][3] = {"鼠", "牛", "虎", "兔", "龙", "蛇" , "马", "羊", "猴", "鸡", "狗", "猪"};
	const char DayName[30][5] = {"初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八" , "初九", "初十",
								"十一", "十二", "十三", "十四", "十五", "十六" , "十七", "十八", "十九", "二十",
								"廿一", "廿二", "廿三", "廿四" , "廿五", "廿六", "廿七", "廿八", "廿九", "三十"};
	const char MonName[12][5] = {"正", "二", "三", "四", "五", "六" , "七", "八", "九", "十", "十一", "腊"};
	const char WuXing[5][3] = {"木", "火", "土", "金", "水"};
	//地支对应的五行表,规律怪,与其计算,还不如查表快
	const char wuxing[12][3] = {"水", "土", "木", "木", "土", "火" , "火", "土", "金", "金", "土", "水"};
	/*
	const int NongliData[100]的数据构成:
	低16位表示(12个或13个月)每个月是大月还是小月,高16位表示闰哪个月
	比如2006年表中10进制464219,16进制0x7155b,
	二进制
	0000 0000 0000 0111 0001 0101 0101 1011
	|--------闰7月------|-------98 *765 4321---|
	(*闰月,这里闰7月) 比如2007年表中10进制605,16进制0x25D,
	二进制
	0000 0000 0000 0000 0000 0010 0101 1011
	|--------无闰月-----|--------9 8765 4321---|
	*/
	const int NongliData[100] = {
							2635,333387,1701,1748,267701,694,2391,133423,1175,396438,
							3402,3749,331177,1453,694,201326,2350,465197,3221,3402,
							400202,2901,1386,267611,605,2349,137515,2709,464533,1738,
							2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,
							2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,
							330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,
							1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,
							1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,
							268949,3402,3493,133973,1386,464219,605,2349,334123,2709,
							2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};
	//const int MonthAdd[12]是当前月之前的经过的整月天数,二月暂以28天计
	const int MonthDay[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
	//平年和闰年的月表
	const int _Month[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
							{31,29,31,30,31,30,31,31,30,31,30,31}};
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///输入日期
	int year, month, day, hour;
	cout << "请输入要查询者的相关内容/n" << endl;
	while (cout << "请输入 年份(1922 - 2021):" && cin >> year)
		if(year >= 1922 && year <= 2021)
			break;
	//闰年计算,其实这里可以不用这么精确的计算,直接year % 4 == 0即可,因为年份跨度不大
	int leapyear = (year % 4 == 0) && ((year % 100 != 0)||(year % 400 == 0)) ? 1 : 0;
	while (cout << "请输入 月份(1 - 12):" && cin >> month)
		if(month >= 1 && month <= 12)
			break;
	while (cout << "请输入 日期(1 - 31):" && cin >> day)
		if(day >= 1 && day <= _Month[leapyear][month - 1])
			break;
	while (cout << "请输入 时刻(0 - 23):" && cin >> hour)
		if(hour >= 0 && hour <= 23)
			break;
	cout << "/n" << year << " - " << month << " - " << day << " - " << hour << endl;
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///预转换
	hour = (++hour) >= 24 ? 0 : hour / 2;
	//时间转换成时辰
	//计算日期差 X<-TheDate->1921-2-8
	//1921-2-8(辛酉年庚寅月壬寅日)而1921-1-1(辛酉年戊子月甲子)
	int sDay = (year - 1921) * 365 + (year - 1921) / 4 + day + MonthDay[month - 1] - 38;//38是代表是从1921-2-8(正月初一)开始计算,而不是1921-1-1,去除38天
	//如今年阳历是闰年(2月有29天),而且当前月份大于2月,经历的总天数加1
	if((!(year % 4)) && (month > 2)) sDay = sDay + 1;
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///农历数据转换
	bool IsEnd = false;
	int mYear = 0, h = 0, TDMonth = 0, TheDate = sDay, mMonth, n;
	//逐年逐月减天数
	while(!IsEnd) {
		if(NongliData[mYear] < 4095) {//判断是否有闰月
			mMonth = 11;
		}
		else {
			mMonth = 12; //有闰月,故一年有13个月
			++h;
		}
		n = mMonth;
		while(n >= 0) {
			int Bit = NongliData[mYear];
			Bit = (Bit >> n) & 1;
			//大小月补差
			if (TheDate <= (29 + Bit)) {//判断天数是否少于当月实际总天数
				IsEnd = true; break;
			}
			++TDMonth; //农历月份累加
			TheDate -= 29 + Bit; --n;
		}
		if(IsEnd)
			break;
		++mYear; //农历年份累加
	}
	month = mMonth - n;
	TDMonth = TDMonth - h;
	day = TheDate;
	if (mMonth == 12) {//判断闰月及相关数据调整
		if (month < NongliData[mYear] / 65536)
			++TDMonth;
		else if (month == NongliData[mYear] / 65536) //正好是闰月
			month = 1 - month;
		else if (month > NongliData[mYear] / 65536) //如果为闰月后面的月份,月份值调整
			--month;
	}
	int Tian[4], Di[4];
	///各天干计算:年、月、日、时
	Tian[0] = (mYear + 7) % 10;
	Tian[1] = (TDMonth + 6) % 10;
	Tian[2] = (sDay + 7) % 10;
	Tian[3] = ((Tian[2] % 5) * 2 + hour) % 10;
	///各地支计算:年、月、日、时
	Di[0] = (mYear + 9) % 12;
	Di[1] = (TDMonth + 2) % 12;
	Di[2] = (sDay + 1) % 12;
	Di[3] = hour;
	const char *theWuXing[8];
	///天干地支对应的五行属性
	//年
	theWuXing[0] = WuXing[Tian[0] / 2];
	theWuXing[1] = wuxing[Di[0]];
	//月
	theWuXing[2] = WuXing[Tian[1] / 2];
	theWuXing[3] = wuxing[Di[1]];
	//日
	theWuXing[4] = WuXing[Tian[2] / 2];
	theWuXing[5] = wuxing[Di[2]];
	//时
	theWuXing[6] = WuXing[Tian[3] / 2];
	theWuXing[7] = wuxing[Di[3]];
	//五行统计
	bool nWuXing[5] = {true, true, true, true, true};
	for(int i = 0; i != 8; ++i)
		for(int n = 0; n != 5; ++n)
			if(0 == strcmp(theWuXing[i], WuXing[n] ))
				nWuXing[n] = false;

	char NongliStr[7];
	sprintf(NongliStr, "%s%s年", TianGan[Tian[0]], DiZhi[Di[0]]);//显示XX年
	char NongliDayStr[13];
	//显示(闰)X月
	if (month < 0) //判断是否为闰月
		sprintf(NongliDayStr, "闰%s月", MonName[-1 * month]);
	else
		sprintf(NongliDayStr, "%s月", MonName[month]);
	strcat(NongliDayStr, DayName[day - 1]);
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///结果输出
	cout << "\n农历:" << NongliStr << "(" << ShuXiang[(mYear + 9) % 12] << ") " << NongliDayStr << " " << DiZhi[Di[3]]
	<< "时\n" << NongliStr << " " << TianGan[Tian[1]] << DiZhi[Di[1]] << "月 " << TianGan[Tian[2]] << DiZhi[Di[2]]
	<< "日 " << TianGan[Tian[3]] << DiZhi[Di[3]] << "时" << "\n\n八字为:"
	<< TianGan[Tian[0]] << DiZhi[Di[0]] << TianGan[Tian[1]] << DiZhi[Di[1]] << TianGan[Tian[2]] << DiZhi[Di[2]]
	<< TianGan[Tian[3]] << DiZhi[Di[3]] << "\n五行为:" << theWuXing[0] << theWuXing[1] << theWuXing[2] << theWuXing[3]
	<< theWuXing[4] << theWuXing[5] << theWuXing[6] << theWuXing[7] << endl;

	cout << "五行缺:\t";
	for(int i = 0; i != 5; ++i)
		if(nWuXing[i])
			cout << WuXing[i];
	cout << endl;
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	return 0;
}

中国的农历是相当博大精深的,此处仅以数据表的方式来查询农历闰月及大小月。同时,这个程序是以正月初一,作为新一年的分界。实际上也有以春分作为新一年的分界的。

P.S 代码显示效果不好,下次改用工具编辑好了再上传

使用python排八字 计算八字的相合相冲五行分值等 简介 八字术是一种古老的算命术。它运用阴阳、五行、干支、八卦等理论,把人的出生年月日时转化为八个字,进而推算人的富贵贫贱、祸福吉凶、穷通寿天、名利地位、家庭六亲等方面的情况 八字源自古代的中国,是一种利用天干和地支来准确记录年、月、日、时的方式,由“年干,年支”、“月干,月支”、“日干,日支”、“时干,时支”,共八个干支所组成(共八个字),年、月、日、时... 阅读详情

相关推荐

python 获取节假日,二十四节气,中国农历,星次、每日凶煞、每日值神、农历建除十二神、农历每日宜忌、彭祖百忌、每日五行、二十八星宿、天干地支、农历生辰八字、时辰凶吉等

python 获取节假日,二十四节气,中国农历,星次、每日凶煞、每日值神、农历建除十二神、农历每日宜忌、彭祖百忌、每日五行、二十八星宿、天干地支、农历生辰八字、时辰凶吉等

weixin_41486438的博客 4054

用c实现农历转换

【代码】用c实现农历转换。

qq_43792435的博客 3051

python计算出nan_如何用python计算出农历干支(干货)

在写一个python项目时,需要实现公历转换成农历,并且要实现计算出干支,实际就是农历的八字!!!先科普一下,中国传统中的生辰八字其实就是你的农历日期的另一种表达。举个例子:公历日期 2019-07-16 北京时间 10:50:15农历日期 2019年 六月 十四 10:50:15对应八字: 己亥 辛未 甲寅 己巳其中:己 、亥 分别是年的干和...

weixin_42186387的博客 1913

公历转农历C程序

注意只能到2049年! #define uchar unsigned char#define uint unsigned int#include /*公历年对应的农历数据,每年三字节,格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小月份对应的位为1

lengshine学习笔记 3769

Python实战:用代码生成你的生辰八字与五行属性(附完整源码)

本文通过Python编程实战,详细讲解了如何用代码生成生辰八字与五行属性。从基础的天干地支、阴阳五行知识入手,逐步构建农历日期转换算法,最终实现完整的生辰八字计算函数,并附有源码示例和五行分析功能,帮助开发者深入理解传统文化与现代编程的结合应用。

weixin_29103191的博客 270

C#: 实现公历转农历算法

通过以上示例,我们可以看到如何使用C#编程语言实现公历转农历的算法。与公历不同,农历的月份和年份并不是固定长度的,因此需要一套独特的计算方法来确定日期。在本文中,我们将探讨如何使用C#编程语言实现公历(阳历)转换为农历(阴历)的算法。我们将详细讨论农历的计算方法,并给出相应的源代码示例。在C#中实现公历转农历算法,我们可以使用一些基本的数学计算和查表方法。方法将其转换为农历日期。类型的参数表示公历日期,并输出对应的农历日期。方法根据农历数据表中的信息来确定每个月的天数。的类,其中包含了公历转农历的方法。

ByteHero的博客 1286

Python实现农历与天干地支五行转换的实战指南

本文详细介绍了如何使用Python实现农历与天干地支五行的转换,包括公历转农历、天干地支计算核心算法以及完整八字生成器的开发。通过实战代码示例,帮助开发者快速掌握传统文化与编程的结合应用,适用于传统节日提醒、命理分析等场景。

weixin_30415113的博客 396

生辰八字与卦相查询系统的开发

生辰八字,又称四柱命理,是中国传统命理学中用于分析个人命运的一种方法。它是根据个人出生的年、月、日、时四个时间点,对应天干地支,形成四个两字组合,进而对一个人的性格、命运进行分析预测的一种方式。四柱分别为年柱、月柱、日柱、时柱,每个柱子由一个天干和一个地支组成。

weixin_42601547的博客 1956

Python纳音五行计算

取名讲究五行平衡,生辰八字,五行归属,年月日时四柱如何计算?本文主要实现基于Python的纳音五行测算,解释程序设计思路以及五行测算算法。

用魔法打败魔法,走楼梯啊! 3020

C# WinForm生辰八字生成与解析工具实战项目

为实现模块间通信,可在Presenter或服务类中定义自定义事件:set;set;set;set;// 执行计算...YearStemBranch = "丙午",MonthStemBranch = "庚寅",DayStemBranch = "戊戌",HourStemBranch = "壬子"});在窗体中订阅该事件:// 更新其他字段...}));这样实现了松耦合的结果通知机制,便于将来替换为消息总线或MVVM命令模式。窗体实现该接口:else。

weixin_42103128的博客 1320

C#中公历与农历转换的实现与应用

干支纪年是中国传统历法中的一个特点,其历史悠久且在现代社会依然有其独特的意义。本章首先介绍干支纪年法的起源和发展,以及它的基本组成和轮转机制,随后探讨如何在C#中实现干支纪年算法,并进行封装和优化。24节气是中国古代历法中非常重要的一个组成部分,它代表了太阳在黄道上的位置,以及自然界和农业生产中的周期性变化。每一个节气都有其特定的天文含义和农业历法意义。天文含义:从天文角度来看,24节气是根据太阳在黄道上的视位置划分的。每个节气代表太阳黄经的角度增加15度。

weixin_42611310的博客 770

前端日历实现:公历、农历、黄历、星座、节气、天干、地支、八字、星宿、五行...

本文介绍了一个功能全面的中华万年历实现方案,包含公历农历转换、二十四节气、天干地支、生肖星座、八字推算、星宿五行、黄历宜忌等传统历法功能。技术栈采用原生JavaScript+HTML5+CSS3,无第三方依赖,确保轻量级和兼容性。核心算法包括:1)基于查表法的农历转换;2)节气近似计算;3)天干地支推算;4)八字和星宿简化算法;5)黄历规则引擎。项目结构分为数据层(农历年表、节气表)、算法层(转换计算)和UI层(日历渲染)。提供了完整的HTML/CSS/JS实现示例,可直接在浏览器运行。最后提出性能优化建议

油墨香^-^的博客 1603

VC++ 阳历与农历转换程序,也就是公历与阴历的相互转换,部分代码是从网上找到的,重新修正了一大部分代码,大家也可以把它当作控件来使用,因为我不初就是想想这样一个程序,奉献给大家。

VC++ 阳历与农历转换程序,也就是公历与阴历的相互转换,部分代码是从网上找到的,重新修正了一大部分代码,大家也可以把它当作控件来使用,因为我不初就是想想这样一个程序,奉献给大家。

Python实现农历日期转换:天干地支与五行属性解析

本文详细介绍了如何使用Python实现公历日期到农历的转换,并进一步解析天干地支与五行属性。通过`zhdate`库简化农历计算,结合核心算法推算四柱八字,为传统文化应用开发提供实用编程方案。

weixin_29090089的博客 323

C语言实现农历万年历,农历公历转换--最新版

信息最全的农历万年历,可以计算1901-2300年的信息,有整齐美观的日历格式打印。 公历信息包括日期、星期、节日。 农历信息包括二十四节气时间点、闰月、大小月、三伏、九九、干支、年号、农历节假日、属相等。 还可以进行农历和公历的日期对应转换,查询生辰八字。 支持自定义节日和纪念日,自定义时公历和农历是区分开的。 压缩包中包含源代码,也包含引用的自定义头文件的源C代码文件。

【2026-Spark实验一-Windows中安装Spark环境】

本文详细介绍了在Windows系统中配置Spark 3.5.8开发环境的完整流程。主要内容包括:安装JDK 8并配置环境变量,下载并解压Spark 3.5.8预编译版,设置SPARK_HOME系统变量,配置Hadoop的winutils工具解决Windows兼容性问题。通过spark-shell和SparkPi示例程序验证环境配置成功,确保Spark能够正常运行分布式计算任务。文中特别强调了路径命名规范、环境变量设置顺序等关键细节,提供了完整的配置截图和验证方法,帮助开发者快速搭建稳定的Spark学习环境。

pblh123的专栏 1586

PHP周易八字起名源码解析:基于天干地支的五行平衡算法实现

基于PHP的周易八字起名系统,本质是将传统命理的“经验判断”转化为可计算的“算法逻辑”。通过天干地支的数学映射、五行分数的量化分析,以及补益策略的规则化,实现了从出生时间到起名推荐的自动化流程。然而,需注意命理学的复杂性——算法仅能作为辅助工具,最终起名仍需结合家庭期望、文化背景等主观因素。未来,随着AI技术的发展,可进一步引入机器学习模型,通过海量起名案例训练,提升推荐结果的精准度与文化适配性。

yangrouchuan88的博客 525

HMC5883L磁力计驱动开发:I²C通信、校准与FreeRTOS集成

磁力计是惯性导航与电子罗盘系统的核心传感器,其输出原始磁场数据需经精确采集、单位换算与误差补偿才能用于姿态解算。基于各向异性磁阻(AMR)原理的三轴磁力计,如HMC5883L,依赖稳定I²C通信获取12位有符号磁场采样值,并通过增益配置、硬软铁校准及温度补偿提升物理量精度。在嵌入式实时系统中,驱动层须保障数据的时间一致性与抗干扰鲁棒性,避免总线挂死、字节错位或量程误配等典型问题。本文围绕HMC5883L这一广泛使用的停产但仍在产线服役的磁传感器,详解寄存器配置、定点单位转换、八方位校准算法及FreeRTOS

weixin_42594427的博客 145

Lunar JavaScript终极指南:从零掌握农历转换完整教程

Lunar JavaScript是一款功能强大的无第三方依赖的公历(阳历)、农历(阴历、老黄历)转换工具,支持节假日、星座、干支、生肖、节气、八字、五行等传统历法功能,是开发者实现中国传统历法功能的理想选择。 ## 🌟 为什么选择Lunar JavaScript? Lunar JavaScript作为轻量级的历法处理库,具有以下核心优势: - **无依赖**:纯JavaScript实现,无

gitblog_00364的博客 1166

从稳压管到LDO芯片:一张图看懂线性电源的‘内卷’进化史

本文追溯了从稳压管到LDO芯片的线性电源技术进化历程,详细解析了各阶段的技术突破与局限。重点探讨了现代LDO在超低功耗、高精度控制等方面的创新,并提供了实战选型的黄金法则,帮助工程师在电子设备小型化与低功耗化趋势中做出最优选择。

weixin_42525551的博客 204

powerdesigner导出sql将name放到comment注释上

【代码】powerdesigner导出sql将name放到comment注释上。

weixin_45947759的博客 1352

农历转换的现代解决方案:用JavaScript轻松处理传统历法

你是否曾为开发需要农历功能的应用程序而烦恼?无论是生日提醒、节日应用还是传统文化展示,处理农历日期总是一项复杂的任务。今天,我将向你介绍一个强大的工具——Lunar-JavaScript,它能让你在项目中轻松集成农历功能,无需深入研究复杂的历法算法。 ## 传统历法在现代应用中的价值 农历不仅仅是一个日期系统,它承载着丰富的文化内涵。从春节、中秋等传统节日,到生辰八字、黄道吉日等民俗应用,农历

gitblog_00650的博客 475

PYTHON 打印三角形大全

用PYTHON语言打印各种三角形

世上无难事,只要肯攀登 1万+
上一篇: 算法记录(2010.1.23-1)
下一篇: 关于map、hash_map 和 unordered_map 的简单性能测试
耍宝王
博客等级 码龄17年 107粉丝 15原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值