.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);
}

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

于是再写一段代码测试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,只不过微软没有重视而已(责任在微软吗?我想应该不是,在商业社会我们有多重视微软就会有多重视。和以色列比起来,我们对传统文化的重视程度差得太远)。

你可能感兴趣的:(framework)