internal int GetDatePart(long ticks, int part) {
int PersianYear; // Persian year
int PersianMonth; // Persian month
int PersianDay; // Persian day
long NumDays; // The calculation buffer in number of days.
CheckTicksRange(ticks);
//
// Get the absolute date. The absolute date is the number of days from January 1st, 1 A.D.
// 1/1/0001 is absolute date 1.
//
NumDays = ticks / GregorianCalendar.TicksPerDay + 1;
//
// Calculate the appromixate Persian Year from this magic formula.
//
PersianYear = (int)(((NumDays - GregorianOffset) * DateCycle) / DaysPerCycle) + 1;
long daysToPersianYear = DaysUpToPersianYear(PersianYear); // The absoulte date for PersianYear
long daysOfPersianYear = GetDaysInYear(PersianYear, CurrentEra); // The number of days for (PersianYear+1) year.
if (NumDays < daysToPersianYear) {
daysToPersianYear -= daysOfPersianYear;
PersianYear--;
} else if (NumDays == daysToPersianYear) {
PersianYear--;
daysToPersianYear -= GetDaysInYear(PersianYear, CurrentEra);
} else {
if (NumDays > daysToPersianYear + daysOfPersianYear) {
daysToPersianYear += daysOfPersianYear;
PersianYear++;
}
}
if (part == DatePartYear) {
return (PersianYear);
}
//
// Calculate the Persian Month.
//
NumDays -= daysToPersianYear;
if (part == DatePartDayOfYear) {
return ((int)NumDays);
}
PersianMonth = 0;
while ((PersianMonth < 12) && (NumDays > DaysToMonth[PersianMonth]))
{
PersianMonth++;
}
if (part == DatePartMonth) {
return (PersianMonth);
}
//
// Calculate the Persian Day.
//
PersianDay = (int)(NumDays - DaysToMonth[PersianMonth-1]);
if (part == DatePartDay) {
return (PersianDay);
}
// Incorrect part value.
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_DateTimeParsing"));
}