使用C#实现五行号码属性变化的万年历

五行是指“金木水火土”,我国古代认为,宇宙是由金、木、水、火、土五种元素构成的,五行运动即相生相克的结果构成了大千世界。五行有正五行和纳音五行之分。
按天干地支的自身属性所定的五行为正五行,甲木、子水等;
(十大天干和十二地支,十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;
天干地支纪年法首先是天干在前,地支在后,比如今年2005就为-乙酉年)

按干支结合生出的五行为纳音五行。纳音来源:六十甲子纳音,实即六十律逆相为宫之法。一律合五音,十二律即纳六十音。纳音的基本方法是:同类娶妻,隔八生子。这也是律吕相生的法则。干为天,支为地,音为人。 

六十甲子纳音表
甲子乙丑海中金 丙寅丁卯炉中火 戊辰己巳大林木 庚午辛未路旁土 壬申癸酉剑锋金
甲戌乙亥山头火 丙子丁丑涧下水 戊寅己卯城头土 庚辰辛巳白腊金 壬午癸未杨柳木
甲申乙酉泉中水 丙戌丁亥屋上土 戊子己丑劈雳火 庚寅辛卯松柏木 壬辰癸巳长流水
甲午乙未沙中金 丙申丁酉山下火 戊戌己亥平地木 庚子辛丑壁上土 壬寅癸卯金箔金
甲辰乙巳佛灯火 丙午丁未天河水 戊申己酉大驿土 庚戌辛亥插环金 壬子癸丑桑枝木
甲寅乙卯大溪水 丙辰丁巳沙中土 戊午己未天上火 庚申辛酉石榴木 壬戌癸亥大海水

另外上面纳音表结合具体年份详细如下:

甲子年:(1924,1984)五行属海中金,屋上之鼠。乙丑年:(1925,1985)五行属海中金,海内之牛。

丙寅年:(1926,1986)五行属炉中火,山林之虎。丁卯年:(1927,1987)五行属炉中火,望月之兔。

戊辰年:(1928,1988)五行属大林木,清温之龙。已巳年:(1929,1989)五行属大林木,福气之蛇。

庚午年:(1930,1990)五行属路旁土,堂里之马。辛未年:(1931,1991)五行属路旁土,得禄之羊。

壬申年:(1932,1992)五行属剑锋金,清秀之猴。癸酉年:(1933,1993)五行属剑锋金,楼宿之鸡。

甲戌年:(1934,1994)五行属山头火,守身之狗。乙亥年:(1935,1995)五行属山头火,过往之猪。

丙子年:(1936,1996)五行属涧下水,田内之鼠。丁丑年:(1937,1997)五行属涧下水,湖内之牛。

戊寅年:(1938,1998)五行属城头土,过山之虎。巳卯年:(1939,1999)五行属城头土,山林之兔。

庚辰年:(1940,2000)五行属白腊金,怒性之龙。辛巳年:(1941,2001)五行属白腊金,冬藏之蛇。

壬午年:(1942,2002)五行属杨柳木,军中之马。癸未年:(1943,2003)五行属杨柳木,群内之羊。

甲申年:(1944,2004)五行属井泉水,过树之猴。乙酉年:(1945,2005)五行属井泉水,唱午之鸡。

丙戌年:(1936,2006)五行属屋上圭,自眠之狗。丁亥年:(1947,2007)五行属屋上圭,过山之猪。

戌子年:(1948,2008)五行属霹雷火,仓内之鼠。巳丑年:(1949,2009)五行属霹雷火,栏内之牛。

庚寅年:(1950,2010)五行属松柏木,出山之虎。辛卯年:(1951,2011)五行属松柏木,蟾窟之兔。

壬辰年:(1952,2012)五行属长流水,行雨之龙。癸巳年:(1953,2003)五行属长流水,草中之蛇。

甲午年:(1954,2004)五行属沙中金,云中之马。乙未年:(1955,2015)五行属沙中金,敬重之羊。

丙申年:(1956,2016)五行属山下火,山上之猴。丁酉年:(1957,2017)五行属山下火,独立之鸡。

戊戌年:(1958,2018)五行属平地木,进山之狗。已亥年:(1959,2019)五行属平地木,道院之猪。

庚子年:(1960,2020)五行属壁上土,梁上之鼠。辛丑年:(1961年)    五行属壁上土,路途之牛。

壬寅年:(1962年)    五行属金泊金,过林之虎。癸卯年:(1963年)    五行属金泊金,山林之兔。

甲辰年:(1964年)    五行属覆灯火,伏潭之龙。乙巳年:(1965年)    五行属覆灯火,出穴只蛇。

丙午年:(1966年)    五行属天河水,行路之马。丁未年:(1967年)    五行属天河水,失群之羊。

戊申年:(1968年)    五行属大泽土,独立之猴。已酉年:(1969年)    五行属大泽土,报晓之鸡。

庚戌年:(1970年)    五行属钗钏金,寺观之狗。辛亥年:(1971年)    五行属钗钏金,圈养之猪。

壬子年:(1972年)    五行属桑柘木,山上之鼠。癸丑年:(1973年)    五行属桑柘木,栏外之牛。

甲寅年:(1974年)    五行属大溪水,立定只虎。乙卯年:(1975年)    五行属大溪水,得道之兔。

丙辰年:(1976年)    五行属沙中土,天上之龙。丁已年:(1977年)    五行属沙中土,塘内之蛇。

戊午年:(1978年)    五行属天上火,厩内之马。已未年:(1979年)    五行属天上火,草野之羊。

庚申年:(1980年)    五行属石榴木,食果之猴。辛酉年:(1981年)    五行属石榴木,笼藏之鸡。

壬戌年:(1982年)    五行属大海水,顾家之犬。癸亥年:(1983年)    五行属大海水,林下之猪。

六十甲子納音之說,術家多不能曉。原其所以得名,皆從五音所生,有條不紊,端如貫珠。蓋甲子為首,而五音始於宮,宮土生金,故甲子為金,而乙丑以陰從陽。商金生水,故丙子為水,而丁丑從之。角木生火,故戊子為火。徵火生土,故庚子為土。羽水生木,故壬子為木。而己丑、辛丑、癸丑各從之。至於甲寅,則納音起於商,商金生水,故甲寅為水。角木生火,故丙寅為火。徵火生土,故戊寅為土。羽水生木,故庚寅為木。宮土生金,故壬寅為金。而五卯各從之。至甲辰,則納音起於角,角木生火,故甲辰為火。徵火生土,故丙辰為土。羽水生木,故戊辰為木。宮土生金,故庚辰為金。商金生水,故壬辰為水。而五巳各從之。宮、商、角既然,惟徵、羽不得居首。於是甲午復如甲子,甲申如甲寅,甲戌如甲辰,而五未、五酉、五亥,亦各從其類。

我们知道,六合一共有49个号码(1~49),由于五行号码是每年都会变化的,对应到六合里面, 如何获得该年的五行(金木水火土)对应的49个号码呢?

如2010年六合中的五行号码如下:

金:10,11,18,19,26,27,40,41,48,49,
木:01,08,09,22,23,30,31,38,39,
水:06,07,14,15,28,29,36,37,44,45,
火:02,03,16,17,24,25,32,33,46,47,
土:04,05,12,13,20,21,34,35,42,43,

在介绍使用C#来自动生成每年的五行号码前,我们先来看看使用易语言的实现逻辑。

.版本 2
.支持库 CnCalendar

.计次循环首 (49, 计次)
    .如果真 (六十甲子纳音数组 [农历日期框1.农历年 - 1922 - 计次] = “金”)
        金行文本 = 金行文本 + 取文本右边 (“0” + 到文本 (计次), 2) + “,”
    .如果真结束
    .如果真 (六十甲子纳音数组 [农历日期框1.农历年 - 1922 - 计次] = “木”)
        木行文本 = 木行文本 + 取文本右边 (“0” + 到文本 (计次), 2) + “,”
    .如果真结束
    .如果真 (六十甲子纳音数组 [农历日期框1.农历年 - 1922 - 计次] = “水”)
        水行文本 = 水行文本 + 取文本右边 (“0” + 到文本 (计次), 2) + “,”
    .如果真结束
    .如果真 (六十甲子纳音数组 [农历日期框1.农历年 - 1922 - 计次] = “火”)
        火行文本 = 火行文本 + 取文本右边 (“0” + 到文本 (计次), 2) + “,”
    .如果真结束
    .如果真 (六十甲子纳音数组 [农历日期框1.农历年 - 1922 - 计次] = “土”)
        土行文本 = 土行文本 + 取文本右边 (“0” + 到文本 (计次), 2) + “,”
    .如果真结束

.计次循环尾 ()

C#生成逻辑中,我们首先生成一个六十甲子字符列表,并能根据六十甲子字符串,从六十甲子纳音表中获取主五行,代码如下所示

        /// <summary>
        /// 获取六十甲子字符列表
        /// </summary>
        /// <returns></returns>
        private List<string> GetJiazhi()
        {
            string str = @"甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 
甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 
甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 
甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 
甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 
甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥";
            List<string> list = new List<string>();
            foreach (string item in str.Split(' '))
            {
                if (!string.IsNullOrEmpty(item))
                {
                    list.Add(item.Replace("\r\n", ""));
                }
            }
            return list;
        }

        /// <summary>
        /// 根据甲子获取纳音
        /// </summary>
        /// <param name="jiazhi"></param>
        /// <returns></returns>
        private string GetNayin(string jiazhi)
        {
            string str = @"甲子乙丑海中金 丙寅丁卯炉中火 戊辰己巳大林木 庚午辛未路旁土 壬申癸酉剑锋金 
甲戌乙亥山头火 丙子丁丑涧下水 戊寅己卯城头土 庚辰辛巳白腊金 壬午癸未杨柳木 
甲申乙酉泉中水 丙戌丁亥屋上土 戊子己丑劈雳火 庚寅辛卯松柏木 壬辰癸巳长流水 
甲午乙未沙中金 丙申丁酉山下火 戊戌己亥平地木 庚子辛丑壁上土 壬寅癸卯金箔金 
甲辰乙巳佛灯火 丙午丁未天河水 戊申己酉大驿土 庚戌辛亥插环金 壬子癸丑桑枝木 
甲寅乙卯大溪水 丙辰丁巳沙中土 戊午己未天上火 庚申辛酉石榴木 壬戌癸亥大海水 ";
            int iStart = str.IndexOf(jiazhi);
            string leftStr = str.Substring(iStart);

            int iSpace = leftStr.IndexOf(' ');
            leftStr = leftStr.Substring(0, iSpace);

            leftStr = leftStr.Substring(leftStr.Length-1, 1);
            return leftStr;
        }

继而我们把六十甲子列表、五行列表(金木水火土)、以及根据每一个六十甲子字符得到的五行列表放到变量中待用。如下所示

            //甲子列表
            List<string> jiazhiList = GetJiazhi();
            //纳音列表
            List<string> nayinList = new List<string>();

            //初始化五行数字字符串列表
            Dictionary<string, string> wuhanStrList = new Dictionary<string, string>() { };
            wuhanStrList.Add("金", "");
            wuhanStrList.Add("木", "");
            wuhanStrList.Add("水", "");
            wuhanStrList.Add("火", "");
            wuhanStrList.Add("土", "");

            for (int i = 1; i <= 60; i++)
            {
                string jiazhi = jiazhiList[i - 1];
                string nayin = GetNayin(jiazhi);
                nayinList.Add(nayin);
                //this.textBox1.AppendText(nayin + Environment.NewLine);
            }

最后我们根据1~49号码和当年的农历年数字,根据规则生成各五行的数字字符串,放到对应的五行数字字符串列表中,如下所示

            ChineseLunisolarCalendar chineseDate = new ChineseLunisolarCalendar();
            for (int i = 1; i <= 49; i++)
            {
                int currentYear = chineseDate.GetYear(this.dateTimePicker1.Value);
                int index = currentYear - 1922 - i - 1;
                string itemName = nayinList[index % 60];
                if (itemName == "金")
                {
                    wuhanStrList["金"] += i.ToString("D2") + ",";
                }
                else if (itemName == "木")
                {
                    wuhanStrList["木"] += i.ToString("D2") + ",";
                }
                else if (itemName == "水")
                {
                    wuhanStrList["水"] += i.ToString("D2") + ",";
                }
                else if (itemName == "火")
                {
                    wuhanStrList["火"] += i.ToString("D2") + ",";
                }
                else if (itemName == "土")
                {
                    wuhanStrList["土"] += i.ToString("D2") + ",";
                }
            }

            foreach (string key in wuhanStrList.Keys)
            {
                this.textBox1.AppendText(string.Format("{0}:{1}\r\n", key, wuhanStrList[key]));
            }

最后给出一个实例截图(程序文件下载地址):

本文转自博客园伍华聪的博客,原文链接:使用C#实现五行号码属性变化的万年历,如需转载请自行联系原博主。

 

时间: 2024-07-29 06:44:03

使用C#实现五行号码属性变化的万年历的相关文章

如果监视一个对象的属性变化,并触发一段代码

问题描述 Hi问题是关于如何监视一个对象的属性状态变化就好比在 ServletContextAttributeListener 一样当 ServletContext 属性发生变化时,会触发一段 代码的执行我想明白的就是 如果做,才能 监视自己写的对象,并在其 指定属性发生变化时,出发一段代码呢?请各位赐教下,小弟在此感激不尽 解决方案 监控属性变化,可以使用Observer模式,Java本身提供对这种模式的支持,你按下面的例子看一下:///你需要临视的Beanpackage com.test;i

用Vue.js实现监听属性的变化_javascript技巧

前言 创建 Vue 实例时,Vue 将遍历 data 的属性,通过 ES5 的 Object.defineProperty 将它们转为 getter/setter,在其内部 Vue 可以追踪依赖.通知变化. const vm = new Vue({ data: {foo: 1} // 'vm.foo' (在内部,同 'this.foo') 是响应的 }) 观察属性变化 Vue 的实例提供了 $watch 方法,用于观察属性变化. const vm = new Vue({ data: {foo:

JavaBean 设置关联属性

在一个Bean中设置关联属性的基本步骤如下: 调入java.beans 包,以便访问该包中所定义的一些方便类.MyButton中的import语句的使用方法如下: import java.beans.*; 实例化java.beans.PropertyChangeSupport类. private PropertyChangeSupport changes = new PropertyChangeSupport(this); MyButton创建了一个名为changes的新对象,它是Propert

JavaBean的属性

JavaBean的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量.在JavaBean设计中,按照属性的不同作用又细分为四类:Simple, Index, Bound与Constrained属性. 1.1 Simple属性 一个简单属性表示一个伴随有一对get/set方法(C语言的过程或函数在Java程序中称为"方法")的变量.属性名与和该属性相关的get/set方法名对应.例如:如果有setX和getX方法

属性动画中的插值器和估值器

1.概述         谷歌在android3.0时候给我们带来了属性动画,真正意义上带来了"动画",以前的帧动画也就4中效果的组合(旋转.淡入淡出.放大缩小.平移),而且只是表面的动画,最经典的比如,把一个button按钮移动到另一个位置,然后去点击,一点反应都没有,但是点击原来空白位置仍然有点击事件触发.而属性动画彻彻底底解决这个问题.         属性动画到底带来了哪些属性呢?如下: (1)Duration:动画持续时间 (2)TimeInterpolation: 用于定义

Vuejs——(3)计算属性,样式和类绑定

先上总结: (十九)标签和API总结(2) vm指new Vue获取的实例   ①当dom标签里的值和data里的值绑定后,更改data对应的值可以实时更新标签里的值:   但后续添加的值是无效的(绑定失败).   ②将可以将对象直接作为data的一个属性,是有效的(因为对象按值传递): 所以该属性和该对象是全等的:   ③vm的接口有: vm.$data是vm的data属性: vm.$el是el属性指向的dom结点: vm.$watch是监视属性变化(比如data里的值)(参照(九))   ④

CSS3 Transition属性使用详解

css3的transition这是样描述的:"css的transition允许css的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值." 下面我们同样从其最语法和属性值开始一步一步来学习transition的具体使用 语法: transition : [<'transition-property'> || <'transition-duration'> || <'tr

Knockout应用开发指南 第二章:监控属性(Observables)

原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,ObservableArray),本人无法准确表达它的准确含义,所以暂定翻译为(监控属性.依赖监控属性和监控数组),如果有好的建议请指正,多谢. 1     创建带有监控属性的view model Observables Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪

从零学Python之引用和类属性的初步理解_python

Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python已经成为最受欢迎的程序设计语言之一.2011年1月,它被TIOBE编程语言排行榜评为2010年度语言.自从2004年以后,python的使用率是呈线性增长. Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言. 鉴于以上各种优点,忍不住对Python进行