.NET framework2.0中的农历类(一)

一、简介
过年是中国(以及日本、韩国等国)人民的第一大节日。你怎么知道哪天过年?查日历或者听别人说?程序员当然有程序员的办法,就是写程序啦。
虽然公历(俗称的“阳历”)已经成了全世界的通用标准,而且也具有多方面的优越性。但在东亚地区,还是离不开“农历”,春节、元宵、端午、中秋、重阳这些节日是农历的,大部份人的老爸老妈的生日也是农历的。
早在1.0框架出来的时候,我就认为微软公司不应该“厚彼薄此”,在.net框架中提供了希伯来历等,却没有提供更广泛使用的“农历”。
而在.net 2.0中,微软公司终于做出了这个小小的改进。
.net 2.0在System.Globalization命名空间中新增加了EastAsianLunisolarCalendar 类及以继承它的ChineseLunisolarCalendar, JapaneseLunisolarCalendar, KoreanLunisolarCalendar, TaiwanLunisolarCalendar等几个类。LunisolarCalendar顾名思义应为“阴阳历”,我的理解是因为我们所用的农历虽然按照月亮公转来编月份,但用“闰月”的方式来调整年份与地球公转的误差,严格意义上来说是结合了月亮公转和地球公转的成份,因此属于“阴阳历”。但我这里还是按照习惯称之为“农历” 。

二、新的农历类还是没有公民待遇
为了测试新的日历类,我兴冲冲地写了几句代码:(省略了调用这个方法的其它代码)

private   string  getDateString(DateTime dt)
{
    CultureInfo ci 
=   new  CultureInfo( " zh-CN " );
    ci.DateTimeFormat.Calendar 
=   new  ChineseLunisolarCalendar();
    
return  dt.ToString( " D " ,ci);
}

运行报错,错误信息是:"Not a valid calendar for the given culture "

为了说明问题,继续测试

private   string  getDateString(DateTime dt)
{
    CultureInfo ci 
=   new  CultureInfo( " zh-TW " );
    ci.DateTimeFormat.Calendar 
=   new  TaiwanCalendar();
    
return  dt.ToString( " D " ,ci);
}

可以正常运行,结果是95年x月x日(民国纪年),注释掉中间那条语句,结果是2006年x月x日(也就是使用公历),将中间那条语句修改成:ci.DateTimeFormat.Calendar = new TaiwanLunisolarCalendar(),照样出错。查相关资料,原来DateTimeFormat的Calendar属性只能为CultureInfo的OptionalCalendars属性所指定范围。

于是再写一段代码测试OptionalCalendars的内容,对于zh-CN语言,惟一可用于日期格式的calendar是本地化的GregorianCalendar(也就是公历)。对于zh-TW,可用于日期格式的calendar是美国英语和本地化的GregorianCalendar以及TaiwanCalendar(即公历的年份减1911),都没有包括农历。

也就是说.net2.0虽然提供了农 历类,但对它的支持并不及同样有闰月的希伯来历。我查资料的时候找到了博客堂的一篇文章http://blog.joycode.com/percyboy/archive/2004/09/17.aspx ,作者在一年半以前发现了农历类不支持日期格式化的问题,并认为这是一个bug。当然还算不上bug,只不过微软没有重视而已(责任在微软吗?我想应该不是,在商业社会我们有多重视微软就会有多重视。和以色列比起来,我们对传统文化的重视程度差得太远)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值