Introduction
This is an implementation of Am lich VN (http://www.informatik.uni-leipzig.de/~duc/amlich/) in C# / .NET 2.0. It's useful to calculate the Vietnamese lunar date in a .NET application (and I hope this source code may be used as a build-in for the Microsoft .NET Framework).
Background
This article uses the algorithm of author Ho Ngoc Duc (http://www.informatik.uni-leipzig.de/~duc/) to make a VietnameseCalendar
class (it's similar to the ChineseLunarCalendar
class - a build-in of Microsoft .NET 2.0).
Using the Code
You may use this class to convert a solar date (Gregorian calendar) to a Vietnamese lunar date and vice versa.
DateTime d = new DateTime(2008, 9, 1, new VietnameseCalendar());
Console.WriteLine("Solar date of Vietnam New Year - Mau Ty = '{0}'", d);
VietnameseCalendar vCal = new VietnameseCalendar();
DateTime dt = new DateTime(2008, 9, 30);
vCal.FromDateTime(dt, out y, out m, out d);
Console.WriteLine("VN lunar date of 2008/9/30 = 'Nam {0} - {1}({1}) - Ngay {3} ({4})
- Gio bat dau: {5} - Tiet {6}, Gio Hoang dao: {7}",
VietnameseCalendar.GetYearName(y),
VietnameseCalendar.GetMonthSpeechName(y, m),
VietnameseCalendar.GetMonthName(y, m),
d, VietnameseCalendar.GetDayName(dt),
VietnameseCalendar.GetHourZeroName(dt),
VietnameseCalendar.GetMinorSolarTerms(dt),
VietnameseCalendar.GetPropitiousHour(dt));
* You can use this class to get VN lunar start hour of a day; or get Minor solar terms; Propitious hours in a day,...
* A Vietnam lunar month can be 1 to 13 (because of leap-month) as a numeric
. Example:
VN Lunar year 1979 has leap-month: 6
So this year has 13 months (from 1 to 13, as an int
) like:
[1], [2] ... [5], [6], [7 => 6(N)
], [8 (=> 7)
], [9] ... [13]
So, if you convert 1979-9-17, you will received 1979/8/26 as output numbers, but string will be "26, Tháng Bảy, Năm Kỷ Mùi" (if you use the method: GetMonthSpeechName(y, m)
)
Points of Interest
This class has been tested by unit-testing (in the attached file). Here is that class diagram:
History
- 16th October, 2008: Initial post