Click here to Skip to main content
15,896,557 members
Articles / Programming Languages / C#

Vietnamese Lunar Calendar for .NET

Rate me:
Please Sign up or sign in to vote.
4.20/5 (9 votes)
18 May 2012CPOL1 min read 68.2K   3.7K   14  
Implementation of Âm lịch Việt Nam for Microsoft.NET
using System;
using System.Text;

using NUnit.Framework;

namespace System.Globalization
{
	[TestFixture()]
	public class VietnameseCalendarTest
	{
		private VietnameseCalendar vnCal;

		[SetUp()]
		public void Initialize()
		{
			this.vnCal = new VietnameseCalendar();
		}

		[Test()]
		public void TwoDigitYearMax()
		{
			//Console.WriteLine(DateTime.Today.ToString("yyyyMMddTHHmmssZ"));
			//Console.WriteLine(Guid.NewGuid().ToString("N"));
			//
			Console.WriteLine(":: VietnameseCalendar.GetTwoDigitYearMax(1) = {0}",
				VietnameseCalendar.GetTwoDigitYearMax(1));
			Assert.AreEqual(2029, this.vnCal.TwoDigitYearMax);
		}

		[Test()]
		public void FromDateTime()
		{
			DateTime date = new DateTime(2008, 9, 30); int yyyy, mm, dd;
			this.vnCal.FromDateTime(date, out yyyy, out mm, out dd);
			// DEBUG
			Console.WriteLine("2008/9/30 = '{0}/{1}/{2}'", yyyy, mm, dd);
			//
			Assert.AreEqual("Mậu Tý", this.vnCal.GetYearName(yyyy));
			Assert.AreEqual(9, mm); Assert.AreEqual(2, dd);
			Assert.AreEqual("Nhâm Tuất", this.vnCal.GetMonthName(yyyy, mm));
			Assert.AreEqual("Quý Dậu", this.vnCal.GetDayName(date));
			Assert.AreEqual("Nhâm Tý", this.vnCal.GetHourZeroName(date));
			Assert.AreEqual("Thu phân", this.vnCal.GetMinorSolarTerms(date));
			Assert.AreEqual("Tý (23-1), Dần (3-5), Mão (5-7), Ngọ (11-13), Mùi (13-15), Dậu (17-19)",
				this.vnCal.GetPropitiousHour(date));
		}

		[Test()]
		public void ToDateTime()
		{
			DateTime date = new DateTime(2008, 9, 1, this.vnCal);
			// DEBUG
			Console.WriteLine("Mậu Tý/9/1 = '{0}'", date);
			//
			Assert.AreEqual(2008, date.Year); Assert.AreEqual(9, date.Month); Assert.AreEqual(29, date.Day);
		}

		[Test()]
		public void CheckLeapYear2006()
		{
			// DEBUG
			Console.WriteLine("Year 2006 IsLeap = {0}", this.vnCal.GetLeapMonth(2006, 0));
			DateTime date = new DateTime(2006, 1, 1, this.vnCal);	// tet am lich
			Assert.AreEqual(2006, date.Year); Assert.AreEqual(1, date.Month); Assert.AreEqual(29, date.Day);
			//
			DateTime date2 = date.AddDays(-28);
			Assert.AreEqual("Ất Dậu", this.vnCal.GetYearName(this.vnCal.GetYear(date2)));
			Assert.AreEqual(12, this.vnCal.GetMonth(date2));
			Assert.AreEqual(2, this.vnCal.GetDayOfMonth(date2));

			//
			date = new DateTime(2006, 8, 1, this.vnCal);	// thang nhuan
			Assert.AreEqual("Bính Tuất", this.vnCal.GetYearName(2006)); Assert.AreEqual(2006, date.Year);
			Assert.AreEqual(8, date.Month); Assert.AreEqual(24, date.Day);
			Assert.AreEqual("Bính Thân (nhuận)", this.vnCal.GetMonthName(2006, 8));
			//
			date2 = date.AddDays(-30);
			Assert.AreEqual(7, date2.Month); Assert.AreEqual(7, this.vnCal.GetMonth(date2));
			Assert.AreEqual(25, date2.Day); Assert.AreEqual(1, this.vnCal.GetDayOfMonth(date2));
			//
			Assert.AreEqual("Bính Thân", this.vnCal.GetMonthName(2006, 7));
			Assert.AreEqual("Ất Mão", this.vnCal.GetDayName(date2));
			Assert.AreEqual("Bính Tý", this.vnCal.GetHourZeroName(date2));
			Assert.AreEqual("Đại thử", this.vnCal.GetMinorSolarTerms(date2));
			Assert.AreEqual("Tý (23-1), Dần (3-5), Mão (5-7), Ngọ (11-13), Mùi (13-15), Dậu (17-19)",
				this.vnCal.GetPropitiousHour(date2));

			//
			date2 = new DateTime(2006, 13, 1, this.vnCal);	// cuoi nam luon
			Assert.AreEqual(2007, date2.Year);
			Assert.AreEqual(1, date2.Month); Assert.AreEqual(19, date2.Day);
			//
			Assert.AreEqual("Tân Sửu", this.vnCal.GetMonthName(2006, 13));
			Assert.AreEqual("Quý Sửu", this.vnCal.GetDayName(date2));
			Assert.AreEqual("Tiểu hàn", this.vnCal.GetMinorSolarTerms(date2));
		}

		/// <summary>
		/// Toan bo lich am cua 2 nam tinh tu nam hien tai.
		/// </summary>
		[Test()]
		public void PrintCurrentYear()
		{
			// current solar year
			int yyyy, mm, dd, lm, cy = DateTime.Today.Year;
			DateTime date = new DateTime(cy++, 1, 1);

			// iCalendar
			StringBuilder buff = new StringBuilder();
			buff.AppendLine("BEGIN:VCALENDAR")
				.AppendLine("VERSION:2.0")
				.AppendLine("METHOD:PUBLISH");

			// all months in the current year
			while (date.Year <= cy)
			{
				this.vnCal.FromDateTime(date, out yyyy, out mm, out dd);
				lm = this.vnCal.GetLeapMonth(yyyy, 0);
				// DEBUG
				//Console.WriteLine("Converting {0} to {1}/{2}/{3}", date.ToShortDateString(), yyyy, mm, dd);

				// append to the iCalendar
				CreateEvent(buff, date, 1, false, "Vietnamese Lunar Calendar",
					string.Format("ÂL {0}/{1}{2}", dd,
					((lm > 0 && mm >= lm) ? mm - 1 : mm), ((lm > 0 && lm == mm) ? " nhuận" : "")),
					string.Format("Ngày {0} tháng {1}{2} năm {3}\\nTiết: {4}\\nGiờ HĐ: {5}",
					this.vnCal.GetDayName(date), this.vnCal.GetMonthName(yyyy, mm),
					((lm > 0 && lm == mm) ? " nhuận" : ""), this.vnCal.GetYearName(yyyy),
					this.vnCal.GetMinorSolarTerms(date), this.vnCal.GetPropitiousHour(date)));

				date = date.AddDays(1);	// loop to next year
			}
			buff.AppendLine("END:VCALENDAR");

			// dump
			Console.Write(buff);
		}

		/// <summary>
		/// Cac ngay nghi am lich + duong lich cua VN trong 2 nam.
		/// </summary>
		[Test()]
		public void PrintHolidays()
		{
			// current solar year
			int yyyy, mm, dd, lm, cy = DateTime.Today.Year;
			DateTime date = new DateTime(cy++, 1, 1);

			// iCalendar
			StringBuilder buff = new StringBuilder();
			buff.AppendLine("BEGIN:VCALENDAR")
				.AppendLine("VERSION:2.0")
				.AppendLine("METHOD:PUBLISH");

			bool isLM;
			// all months in the current year
			while (date.Year <= cy)
			{
				this.vnCal.FromDateTime(date, out yyyy, out mm, out dd);
				lm = this.vnCal.GetLeapMonth(yyyy, 0);
				isLM = (lm > 0 && mm == lm); if (lm > 0 && mm >= lm) mm--;
				// DEBUG
				//Console.WriteLine("Converting {0} to {1}/{2}/{3}", date.ToShortDateString(), yyyy, mm, dd);

				// append to the iCalendar
				if (date.Month == 1 && date.Day == 1)	// Tết Dương Lịch
				{
					CreateEvent(buff, date, 1, true, "Vietnam Public Holidays", "Tết dương lịch", "");
				}
				if (mm == 1 && dd == 1 && !isLM)		// Tết Nguyên Đán
				{
					CreateEvent(buff, date.AddDays(-1), 4, true, "Vietnam Public Holidays",
						"Tết Nguyên Đán", "Tết cổ truyền của dân tộc\\nNăm " + this.vnCal.GetYearName(yyyy));
				}
				if (mm == 3 && dd == 10 && !isLM)		// Giỗ tổ Hùng Vương
				{
					CreateEvent(buff, date, 1, true, "Vietnam Public Holidays",
						"Giỗ Tổ Hùng Vương",
						"Đền Hùng, Phú Thọ\\nTưởng nhớ đến công ơn các Vua Hùng đã có công dựng nước.");
				}
				if (date.Month == 4 && date.Day == 30)	// Ngày giải phóng miền Nam
				{
					CreateEvent(buff, date, 1, true, "Vietnam Public Holidays",
						"Ngày giải phóng miền Nam, thống nhất đất nước", "Kết thúc Chiến tranh Việt Nam");
				}
				if (date.Month == 5 && date.Day == 1)	// Quốc tế Lao động
				{
					CreateEvent(buff, date, 1, true, "Vietnam Public Holidays", "Quốc tế Lao động", "");
				}
				if (date.Month == 9 && date.Day == 2)	// Quốc khánh
				{
					CreateEvent(buff, date, 1, true, "Vietnam Public Holidays",
						"Quốc khánh", "Kỉ niệm ngày thành lập nước CHXHCN Việt Nam");
				}
				/*--------------------------------------------------------------------------------------*/
				if (date.Month == 2 && date.Day == 3)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays",
						"Thành lập Đảng Cộng sản Việt Nam", "");
				}
				if (date.Month == 2 && date.Day == 27)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Ngày Thầy thuốc Việt Nam", "");
				}
				if (date.Month == 3 && date.Day == 8)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Quốc tế Phụ nữ", "");
				}
				if (date.Month == 6 && date.Day == 1)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Quốc tế Thiếu nhi", "");
				}
				if (date.Month == 7 && date.Day == 27)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Ngày Thương binh Liệt sĩ", "");
				}
				if (date.Month == 10 && date.Day == 10)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Ngày Giải phóng Thủ đô", "");
				}
				if (date.Month == 10 && date.Day == 20)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Ngày Phụ nữ Việt Nam", "");
				}
				if (date.Month == 11 && date.Day == 20)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Ngày Nhà giáo Việt Nam", "");
				}
				if (date.Month == 12 && date.Day == 22)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays",
						"Ngày thành lập Quân đội Nhân dân Việt Nam", "");
				}
				if (date.Month == 12 && date.Day == 24)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Lễ Giáng Sinh", "");
				}
				/*--------------------------------------------------------------------------------------*/
				if (mm == 1 && dd == 15 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Rằm Tháng Giêng", "");
				}
				if (mm == 4 && dd == 14 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Tết Dân tộc Khmer Nam Bộ", "");
				}
				if (mm == 4 && dd == 15 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Lễ Phật Đản", "");
				}
				if (mm == 5 && dd == 5 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Tết Đoan Ngọ", "");
				}
				if (mm == 7 && dd == 15 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Vu Lan", "");
				}
				if (mm == 8 && dd == 1 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Tết Katê - Dân tộc Chăm", "");
				}
				if (mm == 8 && dd == 15 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Tết Trung Thu", "");
				}
				if (mm == 12 && dd == 23 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Holidays", "Ông Táo chầu trời", "");
				}
				/*--------------------------------------------------------------------------------------*/
				if (mm == 1 && dd == 4 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội đền Hai Bà Trưng", "Mê Linh, Vĩnh Phúc");
				}
				if (mm == 1 && dd == 4 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Liễu Đôi", "Nam Định");
				}
				if (mm == 1 && dd == 8 && !isLM)
				{
					CreateEvent(buff, date, 2, false, "Vietnam Culture Holidays",
						"Hội Chùa Đậu", "Thường Tín, Hà Tây");
				}
				if (mm == 1 && dd == 5 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Đống Đa", "Hà Nội, Tây Sơn - Bình Định");
				}
				if (mm == 1 && dd == 6 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Chùa Hương", "Hà Tây\\nTháng 1 - Tháng 3");
				}
				if (mm == 1 && dd == 10 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội đua Voi", "Buôn Ma Thuột");
				}
				if (mm == 1 && dd == 13 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Lim", "Bắc Ninh");
				}
				if (mm == 1 && dd == 15 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Côn Sơn", "Hải Dương");
				}
				if (mm == 1 && dd == 15 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Xuân Núi Bà", "Tây Ninh");
				}
				if (mm == 3 && dd == 6 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Chùa Tây Phương", "Thạch Thất - Hà Tây");
				}
				if (mm == 3 && dd == 7 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Chùa Thầy", "Quốc Oai - Hà Tây");
				}
				if (mm == 3 && dd == 1 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Đâm Trâu", "Buôn Ma Thuột, Đắk Lắk\\nTháng 3");
				}
				if (mm == 4 && dd == 9 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Thánh Gióng", "Hà Nội");
				}
				if (mm == 4 && dd == 26 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Bà Chúa Xứ", "Châu Đốc, An Giang");
				}
				if (mm == 8 && dd == 2 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Lăng Lê Văn Duyệt", "TP Hồ Chí Minh");
				}
				if (mm == 8 && dd == 9 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Chọi Trâu Đồ Sơn", "Hải Phòng");
				}
				if (mm == 8 && dd == 16 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội Nghinh Ông", "Tiền Giang - Bến Tre - TP Hồ Chí Minh - Bình Thuận");
				}
				if (mm == 8 && dd == 20 && !isLM)
				{
					CreateEvent(buff, date, 1, false, "Vietnam Culture Holidays",
						"Hội đền Kiếp Bạc", "Hải Dương");
				}

				date = date.AddDays(1);	// loop to next year
			}
			buff.AppendLine("END:VCALENDAR");

			// dump
			Console.Write(buff);
		}
		private static void CreateEvent(StringBuilder buff, DateTime start, int duration,
			bool isPublic, string category, string summary, string description)
		{
			// append to the iCalendar
			buff.AppendLine("BEGIN:VEVENT")
				//.AppendLine("CLASS:PUBLIC")
				.AppendLine("STATUS:CONFIRMED")
				.AppendLine("TRANSP:OPAQUE")
				.Append("UID:").AppendLine(Guid.NewGuid().ToString())
				.Append("DTSTAMP:").AppendLine(DateTime.Now.ToString("yyyyMMddTHHmmssZ"))
				.Append("DTSTART;VALUE=DATE:").AppendLine(start.ToString("yyyyMMdd"))
				.Append("DTEND;VALUE=DATE:").AppendLine(start.AddDays(duration).ToString("yyyyMMdd"));
			//.Append("CREATED:").AppendLine(DateTime.Now.ToString("yyyyMMddTHHmmssZ"));
			if (isPublic)
				buff.AppendLine("RRULE:FREQ=YEARLY;INTERVAL=1");
			buff.Append("CATEGORY:").AppendLine(category)
				.Append("SUMMARY:").AppendLine(summary);
			if (!string.IsNullOrEmpty(description))
				buff.Append("DESCRIPTION:").AppendLine(description);
			buff//.Append("LAST-MODIFIED:").AppendLine(DateTime.Now.ToString("yyyyMMddTHHmmssZ"))
				.AppendLine("END:VEVENT");
		}

		/// <summary>
		/// Danh muc nhac nho cac ngay mung 1 va ngay ram.
		/// </summary>
		[Test()]
		public void PrintAllmostDays()
		{
			// current solar year
			int yyyy, mm, dd, lm, cy = DateTime.Today.Year;
			DateTime date = new DateTime(cy++, 1, 1);

			// iCalendar
			StringBuilder buff = new StringBuilder();
			buff.AppendLine("BEGIN:VCALENDAR")
				.AppendLine("VERSION:2.0")
				.AppendLine("METHOD:PUBLISH");

			// all months in the current year
			while (date.Year <= cy)
			{
				this.vnCal.FromDateTime(date, out yyyy, out mm, out dd);
				lm = this.vnCal.GetLeapMonth(yyyy, 0);
				// DEBUG
				//Console.WriteLine("Converting {0} to {1}/{2}/{3}", date.ToShortDateString(), yyyy, mm, dd);

				if ((dd == 1 || dd == 15) && mm != 1)
				{
					// append to the iCalendar
					CreateEvent(buff, date, 1, false, "Vietnamese Almost Lunar Days",
						string.Format("{0} tháng {1}{2}", (dd == 1 ? "Mùng 1" : "Rằm"),
						((lm > 0 && mm >= lm) ? mm - 1 : mm),
						((lm > 0 && mm == lm) ? " nhuận" : string.Empty)),
						"Năm " + this.vnCal.GetYearName(yyyy));
				}

				date = date.AddDays(1);	// loop to next year
			}
			buff.AppendLine("END:VCALENDAR");

			// dump
			Console.Write(buff);
		}
	}//
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Junior)
Vietnam Vietnam
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions