using System; using System.Collections.Generic; using System.Text; namespace QM.Common { /// /// 模块编号:QM.Common.FuncDate /// 作 用:共通日期处理函数 /// 作 者: /// 编写日期:2014-05-05 /// public class FuncDate { #region 属性 /// /// 起始年 /// private const ushort START_YEAR = 1901; /// /// 结束年 /// private const ushort END_YEAR = 2050; /// /// 星座 /// private static string[] ConstellationName = { "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座", "水瓶座", "双鱼座" }; /// /// 节气 /// private static string[] LunarHolDayName = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" }; /// /// 数组gLunarDay存入阴历1901年到2100年每年中的月天数信息, /// 阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天 /// private static int[] gLunarMonthDay = { //测试数据只有1901.1.1 --2050.12.31 0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0, //1910 0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0, //1920 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0, //1930 0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0, //1940 0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0, //1950 0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50, //1960 0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0, //1970 0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0, //1980 0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9370, 0x4978, //1990 0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960, //2000 0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, //2010 0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8, //2020 0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0, //2030 0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0, //2040 0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0 }; //2050 /// /// 数组gLanarMonth存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年 /// private static byte[] gLunarMonth ={ 0x00, 0x50, 0x04, 0x00, 0x20, //1910 0x60, 0x05, 0x00, 0x20, 0x70, //1920 0x05, 0x00, 0x40, 0x02, 0x06, //1930 0x00, 0x50, 0x03, 0x07, 0x00, //1940 0x60, 0x04, 0x00, 0x20, 0x70, //1950 0x05, 0x00, 0x30, 0x80, 0x06, //1960 0x00, 0x40, 0x03, 0x07, 0x00, //1970 0x50, 0x04, 0x08, 0x00, 0x60, //1980 0x04, 0x0a, 0x00, 0x60, 0x05, //1990 0x00, 0x30, 0x80, 0x05, 0x00, //2000 0x40, 0x02, 0x07, 0x00, 0x50, //2010 0x04, 0x09, 0x00, 0x60, 0x04, //2020 0x00, 0x20, 0x60, 0x05, 0x00, //2030 0x30, 0xb0, 0x06, 0x00, 0x50, //2040 0x02, 0x07, 0x00, 0x50, 0x03 }; //2050 /// /// 数组gLanarHoliDay存放每年的二十四节气对应的阳历日期 /// 每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中 /// 1月 2月 3月 4月 5月 6月 /// 小寒 大寒 立春 雨水 惊蛰 春分 清明 谷雨 立夏 小满 芒种 夏至 /// 7月 8月 9月 10月 11月 12月 /// 小暑 大暑 立秋 处暑 白露 秋分 寒露 霜降 立冬 小雪 大雪 冬至 /// 数据格式说明: /// 如1901年的节气为 /// 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 /// 6, 21, 4, 19, 6, 21, 5, 21, 6,22, 6,22, 8, 23, 8, 24, 8, 24, 8, 24, 8, 23, 8, 22 /// 9, 6, 11,4, 9, 6, 10,6, 9,7, 9,7, 7, 8, 7, 9, 7, 9, 7, 9, 7, 8, 7, 15 /// 上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行 /// 这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放 /// 第二个节气的数据,可得下表 /// private static byte[] gLunarHolDay ={ 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1901 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1902 0x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78, //1903 0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87, //1904 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1905 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1906 0x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78, //1907 0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1908 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1909 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1910 0x96, 0xA5, 0x87, 0x96, 0x87, 0x87, 0x79, 0x69, 0x69, 0x69, 0x78, 0x78, //1911 0x86, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1912 0x95, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1913 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1914 0x96, 0xA5, 0x97, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78, //1915 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1916 0x95, 0xB4, 0x96, 0xA6, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87, //1917 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77, //1918 0x96, 0xA5, 0x97, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78, //1919 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1920 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87, //1921 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x77, //1922 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x69, 0x69, 0x78, 0x78, //1923 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1924 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x87, //1925 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1926 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1927 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1928 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1929 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1930 0x96, 0xA4, 0x96, 0x96, 0x97, 0x87, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1931 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1932 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1933 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1934 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1935 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1936 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1937 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1938 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1939 0x96, 0xA5, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1940 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1941 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1942 0x96, 0xA4, 0x96, 0x96, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1943 0x96, 0xA5, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1944 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1945 0x95, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, //1946 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1947 0x96, 0xA5, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //1948 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x79, 0x78, 0x79, 0x77, 0x87, //1949 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, //1950 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x79, 0x79, 0x79, 0x69, 0x78, 0x78, //1951 0x96, 0xA5, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //1952 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1953 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x68, 0x78, 0x87, //1954 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1955 0x96, 0xA5, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //1956 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1957 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1958 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1959 0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1960 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1961 0x96, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1962 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1963 0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1964 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1965 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1966 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1967 0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1968 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1969 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1970 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x79, 0x69, 0x78, 0x77, //1971 0x96, 0xA4, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1972 0xA5, 0xB5, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1973 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1974 0x96, 0xB4, 0x96, 0xA6, 0x97, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, //1975 0x96, 0xA4, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x89, 0x88, 0x78, 0x87, 0x87, //1976 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //1977 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87, //1978 0x96, 0xB4, 0x96, 0xA6, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, //1979 0x96, 0xA4, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1980 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x77, 0x87, //1981 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1982 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x78, 0x79, 0x78, 0x69, 0x78, 0x77, //1983 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, //1984 0xA5, 0xB4, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //1985 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1986 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x79, 0x78, 0x69, 0x78, 0x87, //1987 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //1988 0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1989 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //1990 0x95, 0xB4, 0x96, 0xA5, 0x86, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1991 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //1992 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1993 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1994 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x76, 0x78, 0x69, 0x78, 0x87, //1995 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //1996 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //1997 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //1998 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //1999 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //2000 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2001 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //2002 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //2003 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //2004 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2005 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2006 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x69, 0x78, 0x87, //2007 0x96, 0xB4, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2008 0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2009 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2010 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x78, 0x87, //2011 0x96, 0xB4, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2012 0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, //2013 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2014 0x95, 0xB4, 0x96, 0xA5, 0x96, 0x97, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //2015 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2016 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, //2017 0xA5, 0xB4, 0xA6, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2018 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //2019 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86, //2020 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //2021 0xA5, 0xB4, 0xA5, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2022 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x79, 0x77, 0x87, //2023 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, //2024 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //2025 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2026 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //2027 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, //2028 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //2029 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2030 0xA5, 0xB4, 0x96, 0xA5, 0x96, 0x96, 0x88, 0x78, 0x78, 0x78, 0x87, 0x87, //2031 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, //2032 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x86, //2033 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x78, 0x88, 0x78, 0x87, 0x87, //2034 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2035 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, //2036 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x86, //2037 0xA5, 0xB3, 0xA5, 0xA5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2038 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2039 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x96, //2040 0xA5, 0xC3, 0xA5, 0xB5, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2041 0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x88, 0x88, 0x88, 0x78, 0x87, 0x87, //2042 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2043 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x88, 0x87, 0x96, //2044 0xA5, 0xC3, 0xA5, 0xB4, 0xA5, 0xA6, 0x87, 0x88, 0x87, 0x78, 0x87, 0x86, //2045 0xA5, 0xB3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x88, 0x78, 0x87, 0x87, //2046 0xA5, 0xB4, 0x96, 0xA5, 0xA6, 0x96, 0x88, 0x88, 0x78, 0x78, 0x87, 0x87, //2047 0x95, 0xB4, 0xA5, 0xB4, 0xA5, 0xA5, 0x97, 0x87, 0x87, 0x88, 0x86, 0x96, //2048 0xA4, 0xC3, 0xA5, 0xA5, 0xA5, 0xA6, 0x97, 0x87, 0x87, 0x78, 0x87, 0x86, //2049 0xA5, 0xC3, 0xA5, 0xB5, 0xA6, 0xA6, 0x87, 0x88, 0x78, 0x78, 0x87, 0x87 }; //2050 #endregion #region 私有方法 /// /// 判断当前日期所属的年份是否是闰年,私有函数 /// /// /// 日期 /// 格式:“2008-03-24” /// /// 是闰年:True ,不是闰年:False private static bool IsRuYear(DateTime pDate) { int intYear; intYear = pDate.Year; if ((intYear % 400 == 0) || (intYear % 4 == 0 && intYear % 100 != 0)) { return true; } else { return false; } } /// /// 判断当前年份是否是闰年,私有函数 /// /// /// 年份 /// 格式:2008 /// /// 是闰年:True ,不是闰年:False private static bool IsRuYear(int pYear) { if ((pYear % 400 == 0) || (pYear % 4 == 0 && pYear % 100 != 0)) { return true; } else { return false; } } #endregion #region 日期处理方法 /// /// 返回本年有多少天 /// /// 年份 /// 本年的天数 public static int GetDaysOfYear(int pYear) { #region int intCnt = 0; if (IsRuYear(pYear)) { //闰年多 1 天 即:2 月为 29 天 intCnt = 366; } else { //--非闰年少1天 即:2 月为 28 天 intCnt = 365; } return intCnt; #endregion } /// /// 本年有多少天 /// /// 日期 /// 本天在当年的天数 public static int GetDaysOfYear(DateTime pDate) { #region int intYear; //取得传入参数的年份部分,用来判断是否是闰年 intYear = pDate.Year; if (IsRuYear(intYear)) { //闰年多 1 天 即:2 月为 29 天 return 366; } else { //--非闰年少1天 即:2 月为 28 天 return 365; } #endregion } /// /// 本月有多少天 /// /// 年 /// 月 /// 天数 public static int GetDaysOfMonth(int pYear, int pMonth) { #region int intDays = 0; switch (pMonth) { case 1: intDays = 31; break; case 2: if (IsRuYear(pYear)) { //闰年多 1 天 即:2 月为 29 天 intDays = 29; } else { //--非闰年少1天 即:2 月为 28 天 intDays = 28; } break; case 3: intDays = 31; break; case 4: intDays = 30; break; case 5: intDays = 31; break; case 6: intDays = 30; break; case 7: intDays = 31; break; case 8: intDays = 31; break; case 9: intDays = 30; break; case 10: intDays = 31; break; case 11: intDays = 30; break; case 12: intDays = 31; break; } return intDays; #endregion } /// /// 本月有多少天 /// /// 日期 /// 天数 public static int GetDaysOfMonth(DateTime pDate) { #region int intYear = pDate.Year; int intMonth = pDate.Month; int intDays = 0; //--利用年月信息,得到当前月的天数信息。 switch (intMonth) { case 1: intDays = 31; break; case 2: if (IsRuYear(intYear)) { //闰年多 1 天 即:2 月为 29 天 intDays = 29; } else { //--非闰年少1天 即:2 月为 28 天 intDays = 28; } break; case 3: intDays = 31; break; case 4: intDays = 30; break; case 5: intDays = 31; break; case 6: intDays = 30; break; case 7: intDays = 31; break; case 8: intDays = 31; break; case 9: intDays = 30; break; case 10: intDays = 31; break; case 11: intDays = 30; break; case 12: intDays = 31; break; } return intDays; #endregion } /// /// 返回当前日期的星期名称 /// /// 日期 /// 星期名称 public static string GetWeekNameOfDay(DateTime pDate) { #region string strDate; string strWeek = ""; strDate = pDate.DayOfWeek.ToString(); switch (strDate) { case "Monday": strWeek = "星期一"; break; case "Tuesday": strWeek = "星期二"; break; case "Wednesday": strWeek = "星期三"; break; case "Thursday": strWeek = "星期四"; break; case "Friday": strWeek = "星期五"; break; case "Saturday": strWeek = "星期六"; break; case "Sunday": strWeek = "星期日"; break; } return strWeek; #endregion } /// /// 返回当前日期的星期编号 /// /// 日期 /// 星期数字编号 public static string GetWeekNumberOfDay(DateTime pDate) { #region string strDate; string strWeek = ""; strDate = pDate.DayOfWeek.ToString(); switch (strDate) { case "Monday": strWeek = "1"; break; case "Tuesday": strWeek = "2"; break; case "Wednesday": strWeek = "3"; break; case "Thursday": strWeek = "4"; break; case "Friday": strWeek = "5"; break; case "Saturday": strWeek = "6"; break; case "Sunday": strWeek = "7"; break; } return strWeek; #endregion } /// /// 返回两个日期之间相差的天数 /// /// 起始日期 /// 结束日期 /// 天数 public static int DiffDays(DateTime pFromDate, DateTime pToDate) { #region TimeSpan ts = pFromDate.Subtract(pToDate); return ts.Days; #endregion } /// /// 返回两个日期之间相差的天数 /// /// 起始日期 /// 结束日期 /// 天数 public static int DiffDays(string pFromDate, string pToDate) { #region DateTime datFromDate = Convert.ToDateTime(pFromDate); DateTime datToDate = Convert.ToDateTime(pToDate); TimeSpan ts = datFromDate.Subtract(datToDate); return ts.Days; #endregion } /// /// 将输入的字符串转化为日期。如果字符串的格式非法,则返回当前日期。 /// /// 输入字符串 /// 日期对象 public static DateTime ConvertStringToDate(string pDate) { #region DateTime datDateTime; try { datDateTime = DateTime.Parse(pDate); } catch (Exception) { datDateTime = DateTime.Today; } return datDateTime; #endregion } /// /// 将日期对象转化为格式字符串 /// /// 日期对象 /// /// 格式: /// "SHORTDATE"===短日期 /// "LONGDATE"==长日期 /// 其它====自定义格式 /// /// 日期字符串 public static string ConvertDateToString(DateTime pDateTime, string pFormat) { #region string strDate = ""; try { switch (pFormat.ToUpper()) { case "SHORTDATE": strDate = pDateTime.ToShortDateString(); break; case "LONGDATE": strDate = pDateTime.ToLongDateString(); break; default: strDate = pDateTime.ToString(pFormat); break; } } catch (Exception) { strDate = pDateTime.ToShortDateString(); } return strDate; #endregion } /// /// 判断是否为合法日期,必须大于1800年1月1日 /// /// 输入日期字符串 /// True/False public static bool IsDateTime(string pDate) { #region try { DateTime datDate = DateTime.Parse(pDate); if (datDate.CompareTo(DateTime.Parse("1800-1-1")) > 0) return true; else return false; } catch (Exception) { return false; } #endregion } #endregion #region 农历日期处理方法 /// /// 计算指定日期的星座序号 /// /// 日期 /// public static int GetConstellation(DateTime pDate) { #region int pYear, intMonth, intDay; pYear = pDate.Year; intMonth = pDate.Month; intDay = pDate.Day; pYear = intMonth * 100 + intDay; if (((pYear >= 321) && (pYear <= 419))) { return 0;} else if ((pYear >= 420) && (pYear <= 520)) { return 1;} else if ((pYear >= 521) && (pYear <= 620)) { return 2;} else if ((pYear >= 621) && (pYear <= 722)) { return 3;} else if ((pYear >= 723) && (pYear <= 822)) { return 4;} else if ((pYear >= 823) && (pYear <= 922)) { return 5;} else if ((pYear >= 923) && (pYear <= 1022)) { return 6;} else if ((pYear >= 1023) && (pYear <= 1121)) { return 7;} else if ((pYear >= 1122) && (pYear <= 1221)) { return 8;} else if ((pYear >= 1222) || (pYear <= 119)) { return 9;} else if ((pYear >= 120) && (pYear <= 218)) { return 10;} else if ((pYear >= 219) && (pYear <= 320)) { return 11;} else { return -1;} #endregion } /// /// 计算指定日期的星座名称 /// /// 日期 /// public static string GetConstellationName(DateTime pDate) { #region int intConstellation; intConstellation = GetConstellation(pDate); if ((intConstellation >= 0) && (intConstellation <= 11)) { return ConstellationName[intConstellation]; } else { return ""; } #endregion } /// /// 计算公历当天对应的节气 0-23,-1表示不是节气 /// /// 日期 /// public static int GetLunarHolDay(DateTime pDate) { #region byte bytFlag; int intHolDay, intYear, intMonth, intDay; intYear = pDate.Year; if ((intYear < START_YEAR) || (intYear > END_YEAR)) { return -1; } intMonth = pDate.Month; intDay = pDate.Day; bytFlag = gLunarHolDay[(intYear - START_YEAR) * 12 + intMonth - 1]; if (intDay < 15) { intHolDay = 15 - ((bytFlag >> 4) & 0x0f); } else { intHolDay = (bytFlag & 0x0f) + 15; } if (intDay == intHolDay) { if (intDay > 15) { return (intMonth - 1) * 2 + 1; } else { return (intMonth - 1) * 2; } } else { return -1; } #endregion } /// /// 农历月显示 /// /// 月 /// /// public static string FormatMonth(ushort pMonth, bool pLunar) { #region string strText = "正二三四五六七八九十"; string strMonth = ""; if ((!pLunar) && (pMonth == 1)) { return "一月"; } if (pMonth <= 10) { strMonth = strMonth + strText.Substring(pMonth - 1, 1); } else if (pMonth == 11) { strMonth = "十一"; } else { strMonth = "十二"; } return strMonth + "月"; #endregion } /// /// 农历日显示 /// /// 日 /// public static string FormatLunarDay(ushort pDay) { #region string strText1 = "初十廿三"; string strText2 = "一二三四五六七八九十"; string strDay; if ((pDay != 20) && (pDay != 30)) { strDay = strText1.Substring((pDay - 1) / 10, 1); strDay = strDay + strText2.Substring((pDay - 1) % 10, 1); } else { // strDay = szText1.Substring((pDay / 10) * 2 + 1, 2); strDay = strText1.Substring((pDay / 10) , 1); strDay = strDay + "十"; } return strDay; #endregion } /// /// 指定节气名称 /// /// 日期 /// public static string GetLunarHolDayName(DateTime pDate) { #region ushort intYear, intMonth, intDay; int intHolDay; TimeSpan ts; intYear = (ushort)(pDate.Year); if ((intYear < START_YEAR) || (intYear > END_YEAR)) { return ""; } intHolDay = GetLunarHolDay(pDate); if ((intHolDay >= 0) && (intHolDay <= 23)) { return LunarHolDayName[intHolDay]; } else { ts = pDate - (new DateTime(START_YEAR, 1, 1)); CalcLunarDate(out intYear, out intMonth, out intDay, (uint)(ts.Days)); return FormatMonth(intMonth, true) + FormatLunarDay(intDay); } #endregion } /// /// 返回阴历pLunarYear年的闰月月份,如没有返回0 1901年1月---2050年12月 /// /// 年 /// public static int GetLeapMonth(ushort pLunarYear) { #region byte bytFlag; if ((pLunarYear < START_YEAR) || (pLunarYear > END_YEAR)) { return 0; } bytFlag = gLunarMonth[(pLunarYear - START_YEAR) / 2]; if ((pLunarYear - START_YEAR) % 2 == 0) { return bytFlag >> 4; } else { return bytFlag & 0x0F; } #endregion } /// /// 返回阴历iLunarYer年阴历pLunarMonth月的天数,如果pLunarMonth为闰月 /// 高字为第二个pLunarMonth月的天数,否则高字为0 1901年1月---2050年12月 /// /// 年 /// 月 /// public static uint LunarMonthDays(ushort pLunarYear, ushort pLunarMonth) { #region int intHeight, intLow; int intBit; if ((pLunarYear < START_YEAR) || (pLunarYear > END_YEAR)) { return 30; } intHeight = 0; intLow = 29; intBit = 16 - pLunarMonth; if ((pLunarMonth > GetLeapMonth(pLunarYear)) && (GetLeapMonth(pLunarYear) > 0)) { intBit--; } if ((gLunarMonthDay[pLunarYear - START_YEAR] & (1 << intBit)) > 0) { intLow++; } if (pLunarMonth == GetLeapMonth(pLunarYear)) { if ((gLunarMonthDay[pLunarYear - START_YEAR] & (1 << (intBit-1)))>0) { intHeight = 30; } else { intHeight = 29; } } return (uint)((uint)(intLow)|(uint)(intHeight)<<16); //合成为uint #endregion } /// /// 返回阴历pLunarYear年的总天数 1901年1月---2050年12月 /// /// 年 /// public static int LunarYearDays(ushort pLunarYear) { #region int intDays; uint uintTmp; if ((pLunarYear < START_YEAR) || (pLunarYear > END_YEAR)) { return 0; } intDays = 0; for (ushort intCnt=1; intCnt <= 12; intCnt++) { uintTmp = LunarMonthDays(pLunarYear, intCnt); intDays = intDays + ((ushort)(uintTmp>>16) & 0xFFFF); //取高位 intDays = intDays + (ushort)(uintTmp); //取低位 } return intDays; #endregion } /// /// 计算从1901年1月1日过pSpanDays天后的阴历日期 /// /// 年 /// 月 /// 日 /// 间隔天数 public static void CalcLunarDate(out ushort pYear, out ushort pMonth, out ushort pDay, uint pSpanDays) { #region uint intTmp; //阳历1901年2月19日为阴历1901年正月初一 //阳历1901年1月1日到2月19日共有49天 if (pSpanDays < 49) { pYear = START_YEAR - 1; if (pSpanDays < 19) { pMonth = 11; pDay = (ushort)(11 + pSpanDays); } else { pMonth = 12; pDay = (ushort)(pSpanDays - 18); } return; } //下面从阴历1901年正月初一算起 pSpanDays = pSpanDays - 49; pYear = START_YEAR; pMonth = 1; pDay = 1; //计算年 intTmp = (uint)LunarYearDays(pYear); while (pSpanDays >= intTmp) { pSpanDays = pSpanDays - intTmp; pYear++; intTmp = (uint)LunarYearDays(pYear); } //计算月 intTmp = LunarMonthDays(pYear, pMonth); //取低位 while (pSpanDays >= intTmp) { pSpanDays = pSpanDays - intTmp; if (pMonth == GetLeapMonth(pYear)) { intTmp = (LunarMonthDays(pYear, pMonth)>>16)&0xFFFF; //取高位 if (pSpanDays < intTmp) { break; } pSpanDays = pSpanDays - intTmp; } pMonth++; intTmp = LunarMonthDays(pYear,pMonth); //取低位 } //计算日 pDay = (ushort)(pDay + pSpanDays); #endregion } /// /// 把pYear年格式化成天干记年法表示的字符串 /// /// 日期 /// public string FormatLunarYear(DateTime pDate) { #region string strYear; string strTianGan = "甲乙丙丁戊己庚辛壬癸"; string strDiZhi = "子丑寅卯辰巳午未申酉戌亥"; string strShengXiao = "鼠牛虎免龙蛇马羊猴鸡狗猪"; ushort pYear; pYear = (ushort)(pDate.Year); strYear = strTianGan.Substring((pYear - 4) % 10, 1); strYear = strYear + strDiZhi.Substring((pYear - 4) % 12, 1); strYear = strYear + " "; strYear = strYear + strShengXiao.Substring((pYear - 4) % 12, 1); strYear = strYear + "年"; return strYear; #endregion } #endregion } }