Algoritmo para encontrar a data gregoriana do Ano Novo Chinês de um determinado ano gregoriano
Estou fazendo um driver para calcular vários feriados em um determinado período de tempo. Então, preciso encontrar as datas gregorianas de todos os feriados chineses (Ano Novo Chinês, Festival QingMing, Festival do Barco-Dragão, etc.). Usei o famoso 'algoritmo da Páscoa' para os cálculos de Sexta-feira Santa, Segunda-feira de Páscoa, Dia da Ascensão e Segunda-feira de Whit; no entanto, não o entendo bem o suficiente para adaptá-lo ao calendário chinês.
Encontrei perguntas semelhantes, mas elas costumam ir do gregoriano para o chinês:
Calculando feriados lunares / lunisolares em python
http://www.herongyang.com/year/program.html
http://www.hermetic.ch/cal_stud/ch_year.htm
O último link foi extremamente útil, mas ainda não tenho certeza de como implementar esse algoritmo de uma maneira que possa me ajudar. Qualquer conselho ou código seria muito apreciado!
Aqui está o meu algoritmo da Sexta-feira Santa:
private void GetGoodFridayOccurances(DateTime startDate, DateTime endDate, List<ObservedHoliday> observedHolidays, StandardHoliday holiday)
{
for (DateTime date = startDate; date <= endDate; date = date.AddYears(1))
{
#region Finding the Day of Easter Algorithm
int day, month;
int firstTwo = date.Year / 100;
int remainderMod = date.Year % 19;
int pfmDate = (firstTwo - 15) / 2 + 202 - 11 * remainderMod;
#region switches
switch (firstTwo)
{
case 21:
case 24:
case 25:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 34:
case 35:
case 38:
pfmDate = pfmDate - 1;
break;
case 33:
case 36:
case 37:
case 39:
case 40:
pfmDate = pfmDate - 2;
break;
}
#endregion
pfmDate = pfmDate % 30;
int tA = pfmDate + 21;
if (pfmDate == 29)
tA = tA - 1;
if (pfmDate == 29 && remainderMod > 10)
tA = tA - 1;
//Find next sunday
int tB = (tA - 19) % 7;
int tC = (40 - firstTwo) % 4;
if (tC == 3 || tC > 1)
tC = tC + 1;
pfmDate = date.Year % 100;
int tD = (pfmDate + pfmDate / 4) % 7;
int tE = ((20 - tB - tC - tD) % 7) + 1;
day = tA + tE;
if (day > 31)
{
day = day - 31;
month = 4;
}
else
{
month = 3;
}
#endregion
DateTime observed = new DateTime(date.Year, month, day).AddDays(-2);
ObservedHoliday obsdate = new ObservedHoliday(holiday);
if (startDate == endDate && startDate.Day == observed.Day)
{
obsdate.DateObserved = observed;
observedHolidays.Add(obsdate);
}
else if (startDate != endDate && observed >= startDate)
{
obsdate.DateObserved = observed;
observedHolidays.Add(obsdate);
}
}