Hat jemand einen guten Algorithmus, um zu berechnen, auf welches Datum Karfreitag fällt, wenn das Jahr als Eingabe verwendet wird? Am liebsten in C #.
Hier ist ein großartiger Artikel, der Ihnen beim Aufbau Ihres Algorithmus helfen soll
http://www.codeproject.com/KB/datetime/christianholidays.aspx
Anhand dieses Beispiels sollten Sie in der Lage sein zu schreiben:
DateTime goodFriday = EasterSunday(DateTime.Now.Year).AddDays(-2);
Vollständiges Beispiel:
public static DateTime EasterSunday(int year)
{
int day = 0;
int month = 0;
int g = year % 19;
int c = year / 100;
int h = (c - (int)(c / 4) - (int)((8 * c + 13) / 25) + 19 * g + 15) % 30;
int i = h - (int)(h / 28) * (1 - (int)(h / 28) * (int)(29 / (h + 1)) * (int)((21 - g) / 11));
day = i - ((year + (int)(year / 4) + i + 2 - c + (int)(c / 4)) % 7) + 28;
month = 3;
if (day > 31)
{
month++;
day -= 31;
}
return new DateTime(year, month, day);
}
Denke
Erkenne, dass das Berechnen von Ostern das ist, worauf du wirklich angewiesen bist.
Forschung
Hier ist die offizielle Naval Observatory-Seite für die Berechnung von Ostern.
http://aa.usno.navy.mil/faq/docs/easter.php
Ausführen
Verwenden Sie die Formel zum Berechnen von Ostern und wechseln Sie dann zum vorherigen Freitag (oder ziehen Sie 2 Tage ab, Details bis zu Ihnen).
Wikipedia weiß: http://en.wikipedia.org/wiki/Good_Friday#Calculating_the_date
Karfreitag ist der Freitag vor Ostern, der im östlichen Christentum und im westlichen Christentum anders berechnet wird (siehe Computus für Details). Ostern fällt am ersten Sonntag nach dem Paschalischen Vollmond, dem Vollmond am oder nach dem 21. März, als Datum des Frühlingspunktes. Die westliche Berechnung verwendet den gregorianischen Kalender, während die östliche Berechnung den julianischen Kalender verwendet, dessen 21. März nun dem 3. April des Gregorianischen Kalenders entspricht. Die Berechnungen zur Ermittlung des Vollmonddatums unterscheiden sich ebenfalls. Siehe Easter Dating Method (Astronomische Gesellschaft von Südaustralien).
Im östlichen Christentum kann Ostern zwischen dem 22. März und dem 25. April im julianischen Kalender (also zwischen dem 4. April und dem 8. Mai in Bezug auf den Gregorianischen Kalender im Zeitraum 1900 bis 2099) fallen, sodass der Karfreitag zwischen dem 20. März und dem 23. April fallen kann (einschließlich (oder zwischen dem 2. April und dem 6. Mai nach dem Gregorianischen Kalender). (Siehe Ostern .)
Versuche dies:
// test code:
Console.WriteLine(CalcGoodFri(2008));
Console.WriteLine(CalcGoodFri(2009));
Console.WriteLine(CalcGoodFri(2010));
private static DateTime CalcGoodFri(int yr)
{
//int yr = 2010; // The year for which to determine the date of Good Friday.
int a = yr % 19;
int b = yr / 100;
int c = yr % 100;
int d = b / 4;
int e = b % 4;
int i = c / 4;
int k = c % 4;
int g = (8 * b + 13) / 25;
int h = ((19 * a) + b - d - g + 15) % 30;
int l = ((2 * e) + (2 * i) - k + 32 - h) % 7;
int m = (a + (11*h) + (19*l)) / 433;
int days_to_good_friday = h + l - (7*m) - 2;
int mo = (days_to_good_friday + 90) / 25;
int da = (days_to_good_friday + (33 * mo) + 19) % 32;
return new DateTime ( yr, mo, da) ; // Returns the date of Good Friday
}
Logik von hier aus portiert: http://www.kenhamady.com/form25.shtml
Nekromanzierung.
Eigentlich hängt es davon ab, ob es sich um einen orthodoxen oder einen katholischen Karfreitag handelt;)
von https://mycodepad.wordpress.com/2014/04/28/c-calculating-orthodox-and-catholic-easter/
(Anmerkung: Ostern = Ostersonntag)
/// <summary>
/// Get Orthodox easter for requested year
/// </summary>
/// <param name="year">Year of easter</param>
/// <returns>DateTime of Orthodox Easter</returns>
public static DateTime GetOrthodoxEaster( int year ) {
int a = year % 19;
int b = year % 7;
int c = year % 4;
int d = (19 * a + 16) % 30;
int e = (2 * c + 4 * b + 6 * d) % 7;
int f = (19 * a + 16) % 30;
int key = f + e + 3;
int month = (key > 30) ? 5 : 4;
int day = (key > 30) ? key - 30 : key;
return new DateTime( year, month, day );
}
/// <summary>
/// Get Catholic easter for requested year
/// </summary>
/// <param name="year">Year of easter</param>
/// <returns>DateTime of Catholic Easter</returns>
public static DateTime GetCatholicEaster( int year ) {
int month = 3;
int G = year % 19 + 1;
int C = year / 100 + 1;
int X = (3 * C) / 4 - 12;
int Y = (8 * C + 5) / 25 - 5;
int Z = (5 * year) / 4 - X - 10;
int E = (11 * G + 20 + Y - X) % 30;
if (E == 24) { E++; }
if ((E == 25) && (G > 11)) { E++; }
int N = 44 - E;
if (N < 21) { N = N + 30; }
int P = (N + 7) - ((Z + N) % 7);
if (P > 31) {
P = P - 31;
month = 4;
}
return new DateTime( year, month, P );
}
Dann könnten Sie noch einen abstrakten Osterhasen erstellen:
private static void EasterBunnyTest()
{
AbstractEasterBunny WesternEuropeanBunny = new CatholicEasterBunny();
AbstractEasterBunny EasternEuropeanBunny = new OrthodoxEasterBunny();
AbstractEasterBunny LocalizedEasterBunny = AbstractEasterBunny.CreateInstance();
System.DateTime dtRomeEaster = WesternEuropeanBunny.EasterSunday(2016);
System.DateTime dtAthensEaster = EasternEuropeanBunny.EasterSunday(2016);
System.DateTime dtLocalEaster = LocalizedEasterBunny.EasterSunday(2016);
System.Console.WriteLine(dtRomeEaster);
System.Console.WriteLine(dtAthensEaster);
System.Console.WriteLine(dtLocalEaster);
}
Mit diesem abstrakten Hasen hier:
public abstract class AbstractEasterBunny
{
/// <summary>
/// Gets the Orthodox easter sunday for the requested year
/// </summary>
/// <param name="year">The year you want to know the Orthodox Easter Sunday of</param>
/// <returns>DateTime of Orthodox Easter Sunday</returns>
public abstract System.DateTime EasterSunday(int year);
public abstract System.DateTime GoodFriday(int year);
public static AbstractEasterBunny CreateInstance()
{
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;
System.Globalization.RegionInfo ri = new System.Globalization.RegionInfo(ci.LCID);
// https://msdn.Microsoft.com/en-us/library/windows/desktop/dd374073(v=vs.85).aspx
System.Collections.Generic.List<int> lsOrthodox = new System.Collections.Generic.List<int>{
0x10D // Serbia and Montenegro
,0x10E // Montenegro
,0x10F // Serbia
,0x19 // Bosnia and Herzegovina
// ,0x46 // Estonia
// ,0x4B // Czech Republic
// ,0x4D // Finland
,0x62 // Greece
// ,0x6D // Hungary
,0x79 // Iraq
// ,0x8C // Latvia
// ,0x8D // Lithuania
// ,0x8F // Slovakia
// ,0x98 // Moldova
// ,0xD4 // Slovenia
,0x4CA2 // Macedonia, Former Yugoslav Republic of
,0xEB // Turkey
};
// if(ci == WesternSlavonicOrthodox)
if (lsOrthodox.Contains(ri.GeoId))
return new OrthodoxEasterBunny();
// TODO: Correct for Armenia/Georgia ? ? ?
// if(ri.GeoId == 0x7 || ri.GeoId == 0x58) // 0x7: Armenia, 0x58: Georgia
// return new CatholicEasterBunny();
// if(ci == EasternSlavonic)
string strMonthName = ci.DateTimeFormat.GetMonthName(8);
if (System.Text.RegularExpressions.Regex.IsMatch(strMonthName, @"\p{IsCyrillic}"))
{
// there is at least one cyrillic character in the string
return new OrthodoxEasterBunny();
}
return new CatholicEasterBunny();
}
}
public class OrthodoxEasterBunny : AbstractEasterBunny
{
/// <summary>
/// Gets the Orthodox easter sunday for the requested year
/// </summary>
/// <param name="year">The year you want to know the Orthodox Easter Sunday of</param>
/// <returns>DateTime of Orthodox Easter Sunday</returns>
public override System.DateTime EasterSunday(int year)
{
int a = year % 19;
int b = year % 7;
int c = year % 4;
int d = (19 * a + 16) % 30;
int e = (2 * c + 4 * b + 6 * d) % 7;
int f = (19 * a + 16) % 30;
int key = f + e + 3;
int month = (key > 30) ? 5 : 4;
int day = (key > 30) ? key - 30 : key;
return new System.DateTime(year, month, day);
}
public override System.DateTime GoodFriday(int year)
{
return this.EasterSunday(year).AddDays(-2);
}
}
public class CatholicEasterBunny : AbstractEasterBunny
{
/// <summary>
/// Gets the Catholic easter sunday for the requested year
/// </summary>
/// <param name="year">The year you want to know the Catholic Easter Sunday of</param>
/// <returns>DateTime of Catholic Easter Sunday</returns>
public override System.DateTime EasterSunday(int year)
{
int day = 0;
int month = 0;
int g = year % 19;
int c = year / 100;
int h = (c - (int)(c / 4) - (int)((8 * c + 13) / 25) + 19 * g + 15) % 30;
int i = h - (int)(h / 28) * (1 - (int)(h / 28) * (int)(29 / (h + 1)) * (int)((21 - g) / 11));
day = i - ((year + (int)(year / 4) + i + 2 - c + (int)(c / 4)) % 7) + 28;
month = 3;
if (day > 31)
{
month++;
day -= 31;
}
return new System.DateTime(year, month, day);
}
public override System.DateTime GoodFriday(int year)
{
return this.EasterSunday(year).AddDays(-2);
}
}
Ist es möglich, die hebräischen oder arabischen Mondkalender für die Konvertierung zu verwenden? ZB:
DateTime getEasterSunday(int year)
{
const int fourTeen = 14;
DateTime Paschal = new DateTime(1900, 3, 20);
var iCal = new HebrewCalendar();
DateTime eFullMoon;
var pDate = new DateTime(year, Paschal.Month, Paschal.Day);
var LunarYear = iCal.GetYear(pDate);
var LunarMonth = iCal.GetMonth(pDate);
var LunarDay = iCal.GetDayOfMonth(pDate);
if (LunarDay >= fourTeen) LunarMonth++;
eFullMoon = iCal.ToDateTime(LunarYear, LunarMonth, fourTeen, 0, 0, 0, 0);
return Enumerable.Range(0, 6).Select(x => eFullMoon.Date.AddDays(x)).Where(x => x.DayOfWeek == DayOfWeek.Sunday).First();
}