一、简介
过年是中国(以及日本、韩国等国)人民的第一大节日。你怎么知道哪天过年?查日历或者听别人说?程序员当然有程序员的办法,就是写程序啦。
虽然公历(俗称的阳历”)已经成了全世界的通用标准,而且也具有多方面的优越性。但在东亚地区,还是离不开农历”,春节、元宵、端午、中秋、重阳这些节日是农历的,大部份人的老爸老妈的生日也是农历的。
早在1.0框架出来的时候,我就认为微软公司不应该厚彼薄此,在.net框架中提供了希伯来历等,却没有提供更广泛使用的农历
而在.net 2.0中,微软公司终于做出了这个小小的改进。
.net 2.0System.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,只不过微软没有重视而已(责任在微软吗?我想应该不是,在商业社会我们有多重视微软就会有多重视。和以色列比起来,我们对传统文化的重视程度差得太远)。