public BadiDate GetBadiDate(DateTime gSourceDate, RelationToSunset relationToSunset) { // strip off time gSourceDate = gSourceDate.Date; var bDayRelationToMidnight = relationToSunset == RelationToSunset.gAfterSunset ? RelationToMidnight.bEvePrior_AfterSunset_Frag1 : RelationToMidnight.bDay_BeforeSunset_Frag2; if (relationToSunset == RelationToSunset.gAfterSunset) { gSourceDate = gSourceDate.AddDays(1); } var gYear = gSourceDate.Year; var gDayOfNawRuz = GetNawRuz(gYear, true); var gDayLoftiness1 = gDayOfNawRuz.AddDays(-19); var bYear = gYear - (gSourceDate >= gDayOfNawRuz ? 1843 : 1844); int bMonth; int bDay; var isBeforeLoftiness = gSourceDate < gDayLoftiness1; if (isBeforeLoftiness) { // back: Jan --> end of AyyamiHa var gDayLoftiness1LastYear = GetNawRuz(gYear - 1, true).AddDays(-19); var daysAfterLoftiness1LastYear = (int)Math.Round((gSourceDate - gDayLoftiness1LastYear).TotalDays); var numMonthsFromLoftinessLastYear = (int)Math.Floor(daysAfterLoftiness1LastYear / 19D); bDay = 1 + daysAfterLoftiness1LastYear - numMonthsFromLoftinessLastYear * 19; bMonth = numMonthsFromLoftinessLastYear; if (bMonth == 19) { bMonth = 0; } } else { // forward: Loftiness --> Dec var bDaysAfterLoftiness1 = (int)Math.Round((gSourceDate - gDayLoftiness1).TotalDays); var bNumMonthsFromLoftiness = (int)Math.Floor(bDaysAfterLoftiness1 / 19D); bDay = 1 + bDaysAfterLoftiness1 - bNumMonthsFromLoftiness * 19; bMonth = bNumMonthsFromLoftiness; if (bMonth == 0) { bMonth = 19; } } return(new BadiDate(bYear, bMonth, bDay, bDayRelationToMidnight)); }
/// <summary> /// This day, at sunset /// </summary> /// <param name="input"></param> /// <param name="forceRelationToSunset"></param> /// <returns></returns> public DateTime AtSunset(DateTime input, RelationToSunset forceRelationToSunset = RelationToSunset.Undefined) { // not actually calculating for now... var minute = DefaultSunsetMinute; switch (forceRelationToSunset) { case RelationToSunset.gBeforeSunset: minute--; break; case RelationToSunset.gAfterSunset: minute++; break; } return(new DateTime(input.Year, input.Month, input.Day, DefaultSunsetHour, minute, 0)); }
public void GetBadiDate_AfterNawRuz(int gYear, int gMonth, int gDay, RelationToSunset relationToSunset, int bYear, int bMonth, int bDay, RelationToMidnight relationToMidnight) { _badi.GetBadiDate(new DateTime(gYear, gMonth, gDay), relationToSunset) .ShouldBe(new BadiDate(bYear, bMonth, bDay, relationToMidnight)); }