WindowsPhone 在 根据公历 获取月球日期数据

WindowsPhone 在 它们的定义 类,根据公历 获取月球日期数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ChineseCalendar
{
    /// <summary>
    /// 中国农历
    /// </summary>
    public static class ChineseDate
    {
        #region 日历数据
        /// <summary>
        /// int[] CalendarData
        /// </summary>
        static int[] CalendarData = new int[] {
                    0x41A95, 0xD4A, 0xDA5, 0x20B55, 0x56A, 0x7155B,
                    0x25D, 0x92D, 0x5192B, 0xA95, 0xB4A, 0x416AA, 0xAD5,
                    0x90AB5, 0x4BA, 0xA5B, 0x60A57, 0x52B, 0xA93, 0x40E95 };         /// <summary>
        /// int[] madd
        /// </summary>
        static int[] madd = new int[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };         static String numString = "一二三四五六七八九十";
        static String monString = "正二三四五六七八九十冬腊";
        static String[] run = new String[] { "闰正", "闰二", "闰三", "闰四", "闰五", "闰六", "闰七", "闰八", "闰九", "闰十", "闰冬", "闰腊" };
        static String cDateString = String.Empty;
        static int cYear, cMonth, cDay, cHour;
        static String holiday = String.Empty;
        #endregion         #region 节日数据
        /// <summary>
        /// 农历节日数据
        /// </summary>
        static String[] NLHoliday = new String[] { 
                "正月初一 春节",
                "正月十五 元宵节",
                "二月初二 龙抬头",
                "五月初五 端午节",
                "七月初七 七夕",
                "七月十五 中元节",
                "八月十五 中秋节",
                "九月初九 重阳节",
                "腊月初八 腊八节",
                "腊月廿三 小年",
                "腊月三十 除夕"
        };         //公历节日 表示放假日
        static String[] GLHoliday = new String[] {
                "0101 元旦",
                "0214 情人节",
                "0308 妇女节",
                "0312 植树节",
                "0401 愚人节",
                "0422 地球日",
                "0501 劳动节",
                "0504 青年节",
                "0531 无烟日",
                "0601 儿童节",
                "0606 爱眼日",
                "0701 建党日",
                "0707 抗战纪念日",
                "0801 建军节",
                "0910 教师节",
                "0918 九一八事变",
                "1001 国庆节",
                "1031 万圣节",
                "1111 光棍节",
                "1201 艾滋病日",
                "1213 南京大屠杀纪念日",
                "1224 平安夜",
                "1225 圣诞节"
        };
        #endregion         #region 计算方法
        /// <summary>
        /// int GetBit
        /// </summary>
        /// <param name="m"></param>
        /// <param name="n"></param>
        /// <returns></returns>
        private static int GetBit(int m, int n)
        {
            return (m >> n) & 1;
        }         /// <summary>
        /// void e2c
        /// </summary>
        /// <param name="dt">公历时间</param>
        private static void e2c(DateTime dt)
        {
            bool isEnd = false;
            int total, m, n, k, tmp = dt.Year;             if (tmp < 1900) tmp += 1900;             total = (tmp - 2001) * 365
                  + (int)Math.Floor((Double)(tmp - 2001) / 4)
                  + madd[dt.Month - 1]
                  + dt.Day
                  - 23;             if (dt.Year % 4 == 0 && dt.Month > 2)
                total++;             for (m = 0; ; m++)
            {
                k = (CalendarData[m] < 0xfff) ? 11 : 12;
                for (n = k; n >= 0; n--)
                {
                    if (total <= 29 + GetBit(CalendarData[m], n))
                    {
                        isEnd = true;
                        break;
                    }
                    total = total - 29 - GetBit(CalendarData[m], n);
                }
                if (isEnd) break;
            }             cYear = 2001 + m;
            cMonth = k - n + 1;
            cDay = total;             if (k == 12)
            {
                if (cMonth == (int)Math.Floor((double)(CalendarData[m] / 0x10000) + 1))
                    cMonth = 1 - cMonth;                 if (cMonth > (int)Math.Floor((double)(CalendarData[m] / 0x10000) + 1))
                    cMonth--;
            }
            cHour = (int)Math.Floor((double)((dt.Hour + 3) / 2));
        }         /// <summary>
        /// void GetcDateString()
        /// </summary>
        private static void GetcDateString()
        {
            String tmp = String.Empty;             if (cMonth < 1)
            {
                tmp += "闰";
                tmp += monString[-cMonth - 1];
            }
            else tmp += monString[cMonth - 1] + "月";             if (cDay <= 10) tmp += "初";
            else if (cDay < 20) tmp += "十";
            else if (cDay == 20) tmp += "二十";
            else if (cDay < 30) tmp += "廿";
            else tmp += "三十";             if (cDay % 10 != 0 || cDay == 10)
                tmp += numString[Math.Abs(cDay - 1) % 10];             cDateString = tmp;
        }         /// <summary>
        /// 获取相应日期的节日数据
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="strDate"></param>
        private static void getHoliday(DateTime dt, String strDate)
        {
            //获取农历节日
            String strNLHoliday = String.Empty;
            if (strDate == "正月")
                strNLHoliday = "春节";
            else
            {
                for (int i = 0, len = NLHoliday.Length; i < len; i++)
                {
                    if (NLHoliday[i].ToString().Contains(strDate))
                    {
                        strNLHoliday = NLHoliday[i].ToString().Split(' ')[1];
                        break;
                    }
                }
            }             //获取公历节日
            String strGLHoliday = String.Empty;
            for (int i = 0, len = GLHoliday.Length; i < len; i++)
            {
                if (GLHoliday[i].ToString().Contains(dt.ToString("MMdd")))
                {
                    strGLHoliday = GLHoliday[i].ToString().Split(' ')[1];
                    break;
                }
            }             //返回结果
            if (!String.IsNullOrEmpty(strNLHoliday) && !String.IsNullOrEmpty(strGLHoliday))
                holiday = (strNLHoliday + strGLHoliday).Replace("节", "");
            else if (!String.IsNullOrEmpty(strNLHoliday))
                holiday = strNLHoliday;
            else if (!String.IsNullOrEmpty(strGLHoliday))
                holiday = strGLHoliday;
            else holiday = String.Empty;
        }         #region 农历年
        /// <summary>
        /// 十天干
        /// </summary>
        private static string[] tiangan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };         /// <summary>
        /// 十二地支
        /// </summary>
        private static string[] dizhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };         /// <summary>
        /// 十二生肖
        /// </summary>
        private static string[] shengxiao = { "鼠", "牛", "虎", "免", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };         /// <summary>
        /// 返回农历天干地支年 
        /// </summary>
        /// <param name="year">农历年</param>
        /// <returns></returns>
        private static string GetLunisolarYear(int year)
        {
            int tgIndex = (year - 1900 + 36) % 10;
            int dzIndex = (year - 1900 + 36) % 12;             return string.Concat(tiangan[tgIndex], dizhi[dzIndex], "【", shengxiao[dzIndex], "】");
        }
        #endregion
        #endregion         #region 调用方法
        /// <summary>
        /// 获取农历日期(格式 dd)
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static String getNLDate(DateTime dt)
        {
            e2c(dt);
            GetcDateString();             //获取节日
            getHoliday(dt, cDateString);             if (cDateString.Contains("初一"))
                cDateString = cDateString.Replace("初一", "");
            else
                cDateString = cDateString.Substring(cDateString.IndexOf("月") + 1);             for (int i = 0, len = run.Length; i < len; i++)
            {
                if (cDateString.Contains(run[i]))
                {
                    cDateString = cDateString.Replace(run[i], "");
                    if (String.IsNullOrEmpty(cDateString))
                        cDateString = run[i];                     break;
                }
            }             return cDateString;
        }         /// <summary>
        /// 获取农历日期(格式 年月日完整日期)
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static String getNLDateTime(DateTime dt)
        {
            //农历月
            getNLDate(dt);             return GetLunisolarYear(dt.Year) + "年" + cDateString;
        }         /// <summary>
        /// 获取节日数据
        /// </summary>
        /// <returns></returns>
        public static String getHoliday()
        {
            return holiday;
        }
        #endregion
    }
}

备注:此类 是更依据网上的 javascript 改编而来。

经过測试,当输入的公历 年 小于 2001 年 获取的农历日期数据就会有误。

而且 当 输入的年 大于 2040 年后 获取的农历数据也会有误!

希望有人可以完好。谢谢。

效果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWltaXl1YW5nZ3Vhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

WindowsPhone 在 根据公历 获取月球日期数据的更多相关文章

  1. SQL Server使用convert对datetime日期数据进行获取

    来源:http://database.51cto.com/art/201007/211883.htm 备注:本文的语法讲解确实是比较乱,似乎格式不太严谨.参考时还是以实例验证为准比较好 以下的文章主要 ...

  2. C# 获取农历日期

    //C# 获取农历日期 ///<summary> /// 实例化一个 ChineseLunisolarCalendar ///</summary> private static ...

  3. 通过DialogFragment从DatePicker或TimePicker中获取日期数据

    通过DialogFragment从DatePicker或TimePicker中获取日期数据 一个activity类,里面存有date和time的变量,想通过dialogfragment的方式获取用户输 ...

  4. iOS 获取公历、农历日期的年月日

    iOS 获取公历.农历日期的年月日 介绍三种方法获取 Date (NSDate) 的年月日. 用 date 表示当前日期.测试日期为公历 2017 年 2 月 5 日,农历丁酉年,鸡年,正月初九. l ...

  5. 获取指定日期相关DATENAME和DATEPART数据

    DATENAME和DATEPART有何区别,Insus.NET写成一个函数,可以方便查询与对比: 一个是返回一个字符串,另一个是返回一个整数. SET ANSI_NULLS ON GO SET QUO ...

  6. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  7. C标准函数库中获取时间与日期、对时间与日期数据操作及格式化

    表示时间的三种数据类型[编辑] 日历时间(calendar time),是从一个标准时间点(epoch)到现在的时间经过的秒数,不包括插入闰秒对时间的调整.开始计时的标准时间点,各种编译器一般使用19 ...

  8. HR开发 获取信息类型数据

    1.PNP逻辑数据库. LOOP获取信息类型数据. TABLES: PERNR . , . START-OF-SELECTION. GET PERNR . LOOP AT P0000 WHERE .. ...

  9. poi-处理excel的单元格日期数据

    poi处理excel时,当excel没有明确指明是哪个类型的数据时,poi很可能处理单元格的日期数据时就有可能是一串数字.而使用java程序基本无法转换 以下为对poi处理日期情况一些方面的处理(不是 ...

随机推荐

  1. PHP JSON_ENCODE 不转义中文汉字的方法

    ios程序中不识别读取到的JSON数据中 \u开头的数据. PHP 生成JSON的时候,必须将汉字不转义为 \u开头的UNICODE数据. 网上非常多,可是事实上都是错误的,正确的方法是在json_e ...

  2. linux df和du统计的空间不一致

    假设你发现是 /tmp/ 目录不对劲,那么就这样就可以查看:  lsof | grep /tmp 输出的结果中,注意某些含有“(deleted)”字样的记录,它们中的一部分就是罪魁祸首,将它们kill ...

  3. 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)

    Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...

  4. Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)

    uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间 ...

  5. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  6. javascript 下拉列表 自己主动取值 无需value

    <select id="applyType" name="$!{status.expression}" class="inp" onc ...

  7. 关于NSArray的几种排序:

    #利用数组的sortedArrayUsingComparator调用 NSComparator  当中NSComparator事实上就是一个返回NSComparisonResult的block. ty ...

  8. JMS的样例

    1.JMS是一个由AS提供的Message服务.它能接受消息产生者(Message Provider)所发出的消息,并把消息转发给消息消费者(Message  Consumer).2.JMS提供2种类 ...

  9. Java创建、重命名、删除文件和文件夹(转)

    Java的文件操作太基础,缺乏很多实用工具,比如对目录的操作,支持就非常的差了.如果你经常用Java操作文件或文件夹,你会觉得反复编写这些代码是令人沮丧的问题,而且要大量用到递归. 下面是的一个解决方 ...

  10. python语言学习9——使用list和tuple

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 位置 用索引来访问list中每一个位置的元素,记得索引是从0开始的,到 len-1结 ...