首页 新闻 会员 周边

日期函数转换

0
悬赏园豆:10 [已解决问题] 解决于 2012-08-30 23:25
l编写一个函数进行日期转换,将输入的中文日期转换为阿拉伯数字日期,比如:二零一二年十二月二十一日要转换为2012-12-21。(处理“十”的问题:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)4中情况对“十”的不同翻译。1→10;2→1;3→不翻译;4→0
•测试数据:二零一二年十二月二十一日、二零零九年七月九日、二零一零年十月二十四日、二零一零年十月二十日
C#
问题补充:

用控制台程序做。

奔*跑的主页 奔*跑 | 初学一级 | 园豆:72
提问于:2012-05-26 22:00
< >
分享
最佳答案
1

使用正则表达式或字符串解析方式,把农历的年月日分解出具体的年、月、日的值,然后进行技术处理:

下面是我的代码,没运行调试,中间可能有些小问题,你自己调整一下。同时,也没对中文日期做安全检测与有效性检测,这个你自己处理下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GuorunAD.Common.Utility
{
    class DateUtility
    {
        private static IDictionary<char, int> ChineseToWorldCharsMap = new Dictionary<char, int>();
        private static IDictionary<int, char> WorldToChineseCharsMap = new Dictionary<int, char>();
        static DateUtility()
        {
            ChineseToWorldCharsMap.Add('〇', 0);
            ChineseToWorldCharsMap.Add('一', 1);
            ChineseToWorldCharsMap.Add('二', 2);
            ChineseToWorldCharsMap.Add('三', 3);
            ChineseToWorldCharsMap.Add('四', 4);
            ChineseToWorldCharsMap.Add('五', 5);
            ChineseToWorldCharsMap.Add('六', 6);
            ChineseToWorldCharsMap.Add('七', 7);
            ChineseToWorldCharsMap.Add('八', 8);
            ChineseToWorldCharsMap.Add('九', 9);
            ChineseToWorldCharsMap.Add('十', 10);
            ChineseToWorldCharsMap.Add('零', 0);
            ChineseToWorldCharsMap.Add('壹', 1);
            ChineseToWorldCharsMap.Add('贰', 2);
            ChineseToWorldCharsMap.Add('叁', 3);
            ChineseToWorldCharsMap.Add('肆', 4);
            ChineseToWorldCharsMap.Add('伍', 5);
            ChineseToWorldCharsMap.Add('陆', 6);
            ChineseToWorldCharsMap.Add('柒', 7);
            ChineseToWorldCharsMap.Add('捌', 8);
            ChineseToWorldCharsMap.Add('玖', 9);
            ChineseToWorldCharsMap.Add('拾', 10);
            WorldToChineseCharsMap.Add(0, '〇');
            WorldToChineseCharsMap.Add(1, '一');
            WorldToChineseCharsMap.Add(2, '二');
            WorldToChineseCharsMap.Add(3, '三');
            WorldToChineseCharsMap.Add(4, '四');
            WorldToChineseCharsMap.Add(5, '五');
            WorldToChineseCharsMap.Add(6, '六');
            WorldToChineseCharsMap.Add(7, '七');
            WorldToChineseCharsMap.Add(8, '八');
            WorldToChineseCharsMap.Add(9, '九');
            WorldToChineseCharsMap.Add(10, '十');
            WorldToChineseCharsMap.Add(100, '零');
            WorldToChineseCharsMap.Add(101, '壹');
            WorldToChineseCharsMap.Add(102, '贰');
            WorldToChineseCharsMap.Add(103, '叁');
            WorldToChineseCharsMap.Add(104, '肆');
            WorldToChineseCharsMap.Add(105, '伍');
            WorldToChineseCharsMap.Add(106, '陆');
            WorldToChineseCharsMap.Add(107, '柒');
            WorldToChineseCharsMap.Add(108, '捌');
            WorldToChineseCharsMap.Add(109, '玖');
            WorldToChineseCharsMap.Add(110, '拾');
        }

        public string ToChineseDate(DateTime datetime, bool big = true, bool lunar = false)
        {
            return string.Format("{0}年{1}月{2}日", ToChineseYear(datetime.Year, big, lunar), ToChineseMonth(datetime.Month, big, lunar), ToChineseDay(datetime.Day, big, lunar));
        }

        public DateTime ToWoldDate(string datetime)
        {
            string[] parts = datetime.Split('年', '月', '日');
            return new DateTime(ToWoldYear(parts[0]), ToWorldMonth(parts[1]), ToWorldDay(parts[2]));
        }

        private string ToChineseYear(int year, bool big = true, bool lunar = false)
        {
            return this.ToChineseNumber(year, big, lunar);
        }

        private int ToWoldYear(string year)
        {
            return this.ToWorldNumber(year);
        }

        private string ToChineseMonth(int month, bool big = true, bool lunar = false)
        {
            return this.ToChineseNumber(month, big, lunar);
        }

        private int ToWorldMonth(string month)
        {
            return this.ToWorldNumber(month);
        }

        private string ToChineseDay(int day, bool big = true, bool lunar = false)
        {
            string result = this.ToChineseNumber(day, big, lunar);
            if (lunar && day <= 10)
            {
                result = "初" + result;
            }
            return result;
        }

        private int ToWorldDay(string day)
        {
            return ToWorldNumber(day.Substring(day.IndexOf("初") + 1));
        }

        private string ToChineseNumber(int number, bool big = true, bool lunar = false)
        {
            string result = "";
            while (number > 0)
            {
                result = this.ToChineseNumberChar(number % 10, big, lunar);
                number /= 10;
            }
            return result;
        }

        private int ToWorldNumber(string number)
        {
            int result = 1;
            foreach (char c in number)
            {
                result = result * 10 + ToWorldNumberChar(c);
            }
            return result;
        }

        private string ToChineseNumberChar(int numberChar, bool big = true, bool lunar = false)
        {
            return WorldToChineseCharsMap[big ? 100 + numberChar : numberChar].ToString();
        }

        private int ToWorldNumberChar(char numberChar)
        {
            return ChineseToWorldCharsMap[numberChar];
        }
    }
}
收获园豆:10
无之无 | 大侠五级 |园豆:5095 | 2012-05-27 08:54
其他回答(2)
0

wow,这个怎么做?没有遇见过...是控制台程序还是窗体程序,如果是窗体程序使用一个叫datepickTime的控件,在将时间的显示方式改变一下就可以了....

 

还有一种方式就是输入时指定输入数字与斜线也行,避免中文输入.......

全力以赴001 | 园豆:629 (小虾三级) | 2012-05-26 22:30
1

提供一个思路:

把“十”替换“10”,然后进一步处理。

1.*月十日 = *月10日

2.*月十三日 = *月10+3日

3.*月二十三日 = *月10×2+3日

4.*月三十日 = *月10×3日

dudu | 园豆:22763 (高人七级) | 2012-05-26 22:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册。