توابع تاریخ:
Author: (FastCode) <behrooz.amoozad@yahoo.com>
internal static System.Globalization.PersianCalendar PersianCalendar = new System.Globalization.PersianCalendar();
private static int Date_YearBase_Start = 1300; //these are not super magical constants, it means we are going to use this program from year 1300 to 1500
private static int Date_YearBase_Size = 200;
private static int[] Date_YearBase;
private static int[] DIM_NL = { 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 29 };
private static int[] DIM_L = { 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30, 30 };
private static int[] DOM_NL = { 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365 };
private static int[] DOM_L = { 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 366 };
static string[] DOW = { "شنبه", "یک شنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه" };
internal static string GetDayOfWeekName(string Date)
{
int? I = DateToDayID(Date);
if (I == null) return null;
return DOW[(I.Value /*+ 2*/) % 7];
}
internal static string GetDayOfWeekName(int DayID)
{
return DOW[(DayID /*+ 2*/) % 7];
}
internal static DayOfWeek? GetDayOfWeek(string Date)
{
int? I = DateToDayID(Date);
if (I == null) return null;
return (DayOfWeek)(I.Value % 7);
}
internal static DayOfWeek GetDayOfWeek(int DateIndex)
{
return (DayOfWeek)((DateIndex /*+ 2*/) % 7);
}
internal static bool IsLeapYear(int Year) { return (Year % 33).In(1, 5, 9, 13, 17, 22, 26, 30); }
internal static int? GetDayOfYear(string Date)
{
if (!VerifiyDateIntegrityBasic(Date)) return null;
int M;
bool P = int.TryParse(Date.Substring(5, 2), out M);
if (!P) return null;
if (M < 1) return null;
if (M > 12) return null;
int Year;
P = int.TryParse(Date.Substring(0, 4), out Year);
if (!P) return null;
bool LeapYear = IsLeapYear(Year);
int DayOfMonth = int.Parse(Date.Substring(8, 2));
int DeltaYear = Year - Date_YearBase_Start;
if (DeltaYear < 0) return null;
if (DeltaYear > Date_YearBase_Size) return null;
if (LeapYear)
{
int DIM = DIM_L[M - 1];
if (DIM < DayOfMonth) return null;
return Date_YearBase[_CD_Year - Date_YearBase_Start] - Date_YearBase[DeltaYear] + DOM_L[M - 1] + DayOfMonth;
}
else
{
int DIM = DIM_NL[M - 1];
if (DIM < DayOfMonth) return null;
return Date_YearBase[_CD_Year - Date_YearBase_Start] - Date_YearBase[DeltaYear] + DOM_NL[M - 1] + DayOfMonth;
}
}
internal static bool DayIDToYear(int DayID, out int Year, out int Month_Day)
{
int l_ = -1, _, c, a = Date_YearBase_Start, b = Date_YearBase_Start + Date_YearBase_Size - 1;
if (b == -1)
{
Year = 0;
Month_Day = 0;
return false;
}
nxt: _ = (a + b) >> 1;
if (l_ == _)
{
Year = 0;
Month_Day = 0;
return false;
}
else
l_ = _;
c = Date_YearBase[_ - Date_YearBase_Start];
if ((DayID >= c) && (DayID - c < (IsLeapYear(_) ? 366 : 365)))
{
Year = _;
Month_Day = DayID - Date_YearBase[_ - Date_YearBase_Start];
return true;
}
if (c > DayID)
{
b = _;
goto nxt;
}
if (c < DayID)
{
a = _ + 1;
goto nxt;
}
{
Year = 0;
Month_Day = 0;
return false;
}
}
internal static bool Month_DaySplit(int Year, int Month_Day, out int Month, out int Day)
{
try
{
int[] DOM;
if (IsLeapYear(Year)) DOM = DOM_L; else DOM = DOM_NL;
int N = 0;
while (Month_Day >= DOM[N]) N++;//it always happens once because the first element in the array is zero
Month = N;
Day = (Month_Day - DOM[N - 1]) + 1;
return true;
}
catch
{
Month = 0;
Day = 0;
return false;
}
}
internal static string DayIDToDate(int Date)
{
int Year, Month_Day, Month, Day;
if (DayIDToYear(Date, out Year, out Month_Day))
if (Month_DaySplit(Year, Month_Day, out Month, out Day))
return Year.ToString() + "/" + Month.ToString().PadLeft(2, '0') + "/" + Day.ToString().PadLeft(2, '0');
else
return null;
else
return null;
}
internal static int? DateToDayID(string Date)
{
if (!VerifiyDateIntegrityBasic(Date)) return null;
int M;
bool P = int.TryParse(Date.Substring(5, 2), out M);
if (!P) return null;
if (M < 1) return null;
if (M > 12) return null;
int Year;
P = int.TryParse(Date.Substring(0, 4), out Year);
if (!P) return null;
bool LeapYear = IsLeapYear(Year);
int DayOfMonth = int.Parse(Date.Substring(8, 2));
int DeltaYear = Year - Date_YearBase_Start;
if (DeltaYear < 0) return null;
if (DeltaYear > Date_YearBase_Size) return null;
if (LeapYear)
{
int DIM = DIM_L[M - 1];
if (DIM < DayOfMonth) { System.Windows.Forms.MessageBox.Show(Date); return null; }
return Date_YearBase[DeltaYear] + DOM_L[M - 1] + DayOfMonth;
}
else
{
int DIM = DIM_NL[M - 1];
if (DIM < DayOfMonth) { System.Windows.Forms.MessageBox.Show(Date); return null; }
return Date_YearBase[DeltaYear] + DOM_NL[M - 1] + DayOfMonth;
}
}
internal static int? DateToWeekID(string Date)
{
if (!VerifiyDateIntegrityBasic(Date)) return null;
int M;
bool P = int.TryParse(Date.Substring(5, 2), out M);
if (!P) return null;
if (M < 1) return null;
if (M > 12) return null;
int Year;
P = int.TryParse(Date.Substring(0, 4), out Year);
if (!P) return null;
bool LeapYear = IsLeapYear(Year);
int DayOfMonth = int.Parse(Date.Substring(8, 2));
int DeltaYear = Year - Date_YearBase_Start;
if (DeltaYear < 0) return null;
if (DeltaYear > Date_YearBase_Size) return null;
if (LeapYear)
{
int DIM = DIM_L[M - 1];
if (DIM < DayOfMonth) { System.Windows.Forms.MessageBox.Show(Date); return null; }
return (Date_YearBase[DeltaYear] + DOM_L[M - 1] + DayOfMonth) / 7;
}
else
{
int DIM = DIM_NL[M - 1];
if (DIM < DayOfMonth) { System.Windows.Forms.MessageBox.Show(Date); return null; }
return (Date_YearBase[DeltaYear] + DOM_NL[M - 1] + DayOfMonth) / 7;
}
}
internal static int? DateToMonthID(string Date)
{
if (!VerifiyDateIntegrityBasic(Date)) return null;
int M;
bool P = int.TryParse(Date.Substring(5, 2), out M);
if (!P) return null;
if (M < 1) return null;
if (M > 12) return null;
int Year;
P = int.TryParse(Date.Substring(0, 4), out Year);
if (!P) return null;
int DeltaYear = Year - Date_YearBase_Start;
if (DeltaYear < 0) return null;
if (DeltaYear > Date_YearBase_Size) return null;
return (DeltaYear * 12) + M - 1;
}
internal static int? DateToYearID(string Date)
{
if (!VerifiyDateIntegrityBasic(Date)) return null;
int Year;
bool P = int.TryParse(Date.Substring(0, 4), out Year);
if (!P) return null;
int DeltaYear = Year - Date_YearBase_Start;
if (DeltaYear < 0) return null;
if (DeltaYear > Date_YearBase_Size) return null;
return DeltaYear;
}
internal static bool VerifiyDateIntegrityBasic(string Date)
{
//stub method
if (Date_YearBase == null) return false;
if (DOM_L == null) return false;
if (DOM_NL == null) return false;
if (Date == null) return false;
if (Date.Length != 10) return false;
return true;
}
internal static void refreshCurrentDate()
{
DateTime dt = DateTime.Now;
_CD_Year = PersianCalendar.GetYear(dt);
_CD_Month = PersianCalendar.GetMonth(dt);
_CD_Day = PersianCalendar.GetDayOfMonth(dt);
isCurrentYear_LeapYear = IsLeapYear(_CD_Year);
_CurrentYear = _CD_Year.ToString();
int CurrentDayInYears = 1;//0000/01/01
Date_YearBase = new int[Date_YearBase_Size];
for (int n = 0; n != Date_YearBase_Size; n++)
{
Date_YearBase[n] = CurrentDayInYears;
CurrentDayInYears += IsLeapYear(Date_YearBase_Start + n) ? 366 : 365;
}
Year_Month = _CurrentYear + "/" + _CD_Month.ToString().PadLeft(2, '0');
cd = Year_Month + "/" + _CD_Day.ToString().PadLeft(2, '0');
_CurrentDayID = DateToDayID(cd).Value;
if (Form_Main.Current != null) Form_Main.Current.datetts.Text = cd;
_YearFirstDay = _CurrentYear + "/01/01";
_YearFirstDayID = Date_YearBase[_CD_Year - Date_YearBase_Start];
_CurrentDayOfYear = _CurrentDayID - _YearFirstDayID;
_DaysInCurrentYear = isCurrentYear_LeapYear ? 366 : 365;
}
static int _DaysInCurrentYear;
static internal int DaysInCurrentYear()
{
return _DaysInCurrentYear;
}
static bool isCurrentYear_LeapYear;
internal static string GetMonthFirstDay(int Month) { return _CurrentYear + "/" + Month.ToString() + "/01"; }
internal static string GetMonthLastDay(int Month)
{
if (isCurrentYear_LeapYear)
return _CurrentYear + "/" + Month.ToString().PadLeft(2, '0') + "/" + DIM_L[Month].ToString().PadLeft(2, '0');
else
return _CurrentYear + "/" + Month.ToString().PadLeft(2, '0') + "/" + DIM_NL[Month].ToString().PadLeft(2, '0');
}
internal static bool Date_Overlap(string Range1_Start, string Range1_End, string Range2_Start, string Range2_End)
{
int _Range1_Start = DateToDayID(Range1_Start).GetValueOrDefault();
int _Range1_End = DateToDayID(Range1_End).GetValueOrDefault();
int _Range2_Start = DateToDayID(Range2_Start).GetValueOrDefault();
int _Range2_End = DateToDayID(Range2_End).GetValueOrDefault();
if (_Range1_Start == 0) throw new ArgumentException("Range1_Start");
if (_Range1_End == 0) throw new ArgumentException("Range1_End");
if (_Range2_Start == 0) throw new ArgumentException("Range2_Start");
if (_Range2_End == 0) throw new ArgumentException("Range2_End");
if (_Range1_End < _Range1_Start) throw new ArgumentException("Range1_End < Range1_Start");
if (_Range2_End < _Range2_Start) throw new ArgumentException("Range2_End < Range2_Start");
if (_Range2_Start > _Range1_Start) if (_Range2_Start < _Range1_End) return true;
if (_Range2_End > _Range1_Start) if (_Range2_End < _Range1_End) return true;
if (_Range1_Start > _Range2_Start) if (_Range1_Start < _Range2_End) return true;
return false;
}
static int _CD_Year; public static int CD_Year { get { return _CD_Year; } }
static int _CD_Month; public static int CD_Month { get { return _CD_Month; } }
static int _CD_Day; public static int CD_Day { get { return _CD_Day; } }
static string Year_Month;
static int _CurrentDayOfYear;
static int _YearFirstDayID;
internal static int GetDaysInMonth(int Year, int Month)
{
if (IsLeapYear(Year)) return DIM_L[Month]; else return DIM_NL[Month];
}
internal static long GetCurrentDayOfYear()
{
return _CurrentDayOfYear;
}
internal static int GetYearFirstDayID()
{
return _YearFirstDayID;
}
internal static string GetCurrentDate() { return cd; }
static string _YearFirstDay;
static string _CurrentYear; internal static string GetYearFirstDay() { return _YearFirstDay; }
internal static DateTime? ToGregorian(string date)
{
if (VerifiyDateIntegrityBasic(date))
{
int year = EConvert.Val_int(date.Substring(0, 4));
int month = EConvert.Val_int(date.Substring(5, 2));
int day = EConvert.Val_int(date.Substring(8, 2));
return PersianCalendar.ToDateTime(year, month, day, 1, 1, 1, 1);
} return null;
}
internal static bool DayIDToDateParameters(int DayID, out int Year, out int Month, out int Day)
{
int Month_Day;
if (DayIDToYear(DayID, out Year, out Month_Day))
return Month_DaySplit(Year, Month_Day, out Month, out Day);
Month = 0;
Day = 0;
return false;
}
internal static DateTime? ToGregorian(int DayID)
{
int year, month, day;
if(DayIDToDateParameters(DayID, out year, out month , out day))
return PersianCalendar.ToDateTime(year, month, day, 1, 1, 1, 1);
return null;
}
internal static string ToShamsiDateTime(DateTime dateTime)
{
//use Date_Base to make it faster/O(1)
return (PersianCalendar.GetYear(dateTime).ToString() + "/" + PersianCalendar.GetMonth(dateTime).ToString().PadL eft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(dateTime).ToString() .PadLeft(2, '0') + " " + dateTime.Hour.ToString().PadLeft(2, '0') + ":" + dateTime.Minute.ToString().PadLeft(2, '0') + ":" + dateTime.Second.ToString().PadLeft(2, '0'));
}
internal static string ToShamsiDate(DateTime dateTime)
{
return (PersianCalendar.GetYear(dateTime).ToString() + "/" + PersianCalendar.GetMonth(dateTime).ToString().PadL eft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(dateTime).ToString() .PadLeft(2, '0'));
}