#pragma once using namespace System; using namespace System::Globalization; /// /// A helper class for Persian language /// public ref class PersianDateHelper { public: PersianDateHelper() { // // TODO: Add constructor logic here // } #pragma region this.DateManager.AddDays System::String ^ChangeDate(System::String ^PersionDate, int Days) { DateTime aDate = PersianDatetoGDate(PersionDate); if (Days >= 0) { aDate = aDate.AddDays(Days); } else { System::TimeSpan days = TimeSpan(Days, 0, 0, 0, 0); aDate = aDate.Subtract(-days); } PersionDate = this->GDatetoPersianDate(aDate); return PersionDate; } #pragma endregion /// Get Today in Persian calendar System::String ^ToDay() { return GDatetoPersianDate(DateTime::Today); } //Convert Persian Date string to G date DateTime Object DateTime PersianDatetoGDate(System::String ^strd) { System::DateTime dt = DateTime(); try { if (strd->Length == 6) strd = "13" + strd; if (strd->Length == 8) strd = strd->Trim()->Substring(0, 4) + "/" + strd->Trim()->Substring(4, 2) + "/" + strd->Trim()->Substring(6, 2); System::String ^tt1, ^tt2, ^tt3; int bt, at, ct, ST = 0; if (strd == " / / " || strd == "13 / / ") return dt; tt1 = strd->Trim()->Substring(0, 4); tt2 = strd->Trim()->Substring(5, 2); tt3 = strd->Trim()->Substring(8, 2); int tmptt; tmptt = (int::Parse(tt1) + 621); tt1 = tmptt.ToString(); if (int::Parse(tt1) > 1995 && int::Parse(tt1) % 4 == 0) dt = DateTime(int::Parse(tt1), 3, 20); else dt = DateTime(int::Parse(tt1), 3, 21); at = int::Parse(tt1); bt = int::Parse(tt2); ct = int::Parse(tt3); switch (bt) { case 1: case 2: case 3: case 4: case 5: case 6: ST = ((bt - 1) * 31) + ct; break; case 7: case 8: case 9: case 10: case 11: case 12: ST = (6 * 31) + ((bt - 7) * 30) + ct; break; } dt = dt.AddDays(ST - 1); return dt; } catch(...) { return dt; } } //Convert GDate to Pesian Date System::String ^GDatetoPersianDate(System::DateTime ddat) { try { int da, mo, ye, ld; System::String ^tt1, ^tt2, ^tt3; array ^buf1, ^buf2; buf1 = gcnew array(12); buf2 = gcnew array(12); buf1[0] = 0; buf1[1] = 31; buf1[2] = 59; buf1[3] = 90; buf1[4] = 120; buf1[5] = 151; buf1[6] = 181; buf1[7] = 212; buf1[8] = 243; buf1[9] = 273; buf1[10] = 304; buf1[11] = 334; buf2[0] = 0; buf2[1] = 31; buf2[2] = 60; buf2[3] = 91; buf2[4] = 121; buf2[5] = 152; buf2[6] = 182; buf2[7] = 213; buf2[8] = 244; buf2[9] = 274; buf2[10] = 305; buf2[11] = 335; // if (ddat==null) // return (" "); if ((ddat.Year % 4) != 0) { da = buf1[ddat.Month - 1] + ddat.Day; if (da > 79) { da = da - 79; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { if (ddat.Year > 1996 && (ddat.Year % 4) == 1) ld = 11; else ld = 10; da = da + ld; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } else { da = buf2[ddat.Month - 1] + ddat.Day; if (ddat.Year >= 1996) ld = 79; else ld = 80; if (da > ld) { da = da - ld; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { da = da + 10; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } tt1 = ye.ToString()->Trim(); tt2 = mo.ToString()->Trim(); if (tt2->Length == 1) tt2 = "0" + tt2; tt3 = da.ToString()->Trim(); if (tt3->Length == 1) tt3 = "0" + tt3; return (tt1 + "/" + tt2 + "/" + tt3); } catch (System::Exception ^e1) { return System::String::Empty; } } int GetPersianMonth(System::DateTime ddat) { try { int da, mo, ye, ld; array ^buf1, ^buf2; buf1 = gcnew array(12); buf2 = gcnew array(12); buf1[0] = 0; buf1[1] = 31; buf1[2] = 59; buf1[3] = 90; buf1[4] = 120; buf1[5] = 151; buf1[6] = 181; buf1[7] = 212; buf1[8] = 243; buf1[9] = 273; buf1[10] = 304; buf1[11] = 334; buf2[0] = 0; buf2[1] = 31; buf2[2] = 60; buf2[3] = 91; buf2[4] = 121; buf2[5] = 152; buf2[6] = 182; buf2[7] = 213; buf2[8] = 244; buf2[9] = 274; buf2[10] = 305; buf2[11] = 335; // if (ddat==null) // return (" "); if ((ddat.Year % 4) != 0) { da = buf1[ddat.Month - 1] + ddat.Day; if (da > 79) { da = da - 79; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { if (ddat.Year > 1996 && (ddat.Year % 4) == 1) ld = 11; else ld = 10; da = da + ld; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } else { da = buf2[ddat.Month - 1] + ddat.Day; if (ddat.Year >= 1996) ld = 79; else ld = 80; if (da > ld) { da = da - ld; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { da = da + 10; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } //tt1 = ye.ToString().Trim(); //tt2 = mo.ToString().Trim(); //if (tt2.Length == 1) // tt2 = "0" + tt2; //tt3 = da.ToString().Trim(); //if (tt3.Length == 1) // tt3 = "0" + tt3; //return (tt1 + "/" + tt2 + "/" + tt3); return mo; } catch (System::Exception ^e1) { return ddat.Month; } } string GetPersianStrMonth(System::DateTime ddat) { try { array MonthName; MonthName = gcnew array(12); MonthName[0] = "فروردین"; MonthName[1] = "اردیبهشت"; MonthName[2] = "خرداد"; MonthName[3] = "تیر"; MonthName[4] = "مرداد"; MonthName[5] = "شهریور"; MonthName[6] = "مهر"; MonthName[7] = "آبان"; MonthName[8] = "آذر"; MonthName[9] = "دی"; MonthName[10] = "بهمن"; MonthName[11] = "اسفند"; return MonthName[GetPersianMonth(ddat)]; } catch (System::Exception ^e1) { return ddat.Month; } } int GetPersianYear(System::DateTime ddat) { try { int da, mo, ye, ld; array ^buf1, ^buf2; buf1 = gcnew array(12); buf2 = gcnew array(12); buf1[0] = 0; buf1[1] = 31; buf1[2] = 59; buf1[3] = 90; buf1[4] = 120; buf1[5] = 151; buf1[6] = 181; buf1[7] = 212; buf1[8] = 243; buf1[9] = 273; buf1[10] = 304; buf1[11] = 334; buf2[0] = 0; buf2[1] = 31; buf2[2] = 60; buf2[3] = 91; buf2[4] = 121; buf2[5] = 152; buf2[6] = 182; buf2[7] = 213; buf2[8] = 244; buf2[9] = 274; buf2[10] = 305; buf2[11] = 335; // if (ddat==null) // return (" "); if ((ddat.Year % 4) != 0) { da = buf1[ddat.Month - 1] + ddat.Day; if (da > 79) { da = da - 79; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { if (ddat.Year > 1996 && (ddat.Year % 4) == 1) ld = 11; else ld = 10; da = da + ld; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } else { da = buf2[ddat.Month - 1] + ddat.Day; if (ddat.Year >= 1996) ld = 79; else ld = 80; if (da > ld) { da = da - ld; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { da = da + 10; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } //tt1 = ye.ToString().Trim(); //tt2 = mo.ToString().Trim(); //if (tt2.Length == 1) // tt2 = "0" + tt2; //tt3 = da.ToString().Trim(); //if (tt3.Length == 1) // tt3 = "0" + tt3; //return (tt1 + "/" + tt2 + "/" + tt3); return ye; } catch (System::Exception ^e1) { return ddat.Month; } } System::String ^GDatetoPersianDate(System::String ^strdat) { try { System::DateTime ddat = DateTime(int::Parse(strdat->Substring(0, 4)), int::Parse(strdat->Substring(5, 2)), int::Parse(strdat->Substring(8, 2))); int da, mo, ye, ld; System::String ^tt1, ^tt2, ^tt3; array ^buf1, ^buf2; buf1 = gcnew array(12); buf2 = gcnew array(12); buf1[0] = 0; buf1[1] = 31; buf1[2] = 59; buf1[3] = 90; buf1[4] = 120; buf1[5] = 151; buf1[6] = 181; buf1[7] = 212; buf1[8] = 243; buf1[9] = 273; buf1[10] = 304; buf1[11] = 334; buf2[0] = 0; buf2[1] = 31; buf2[2] = 60; buf2[3] = 91; buf2[4] = 121; buf2[5] = 152; buf2[6] = 182; buf2[7] = 213; buf2[8] = 244; buf2[9] = 274; buf2[10] = 305; buf2[11] = 335; // if (ddat.ToString()==null) // return (" "); if ((ddat.Year % 4) != 0) { da = buf1[ddat.Month - 1] + ddat.Day; if (da > 79) { da = da - 79; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { if (ddat.Year > 1996 && (ddat.Year % 4) == 1) ld = 11; else ld = 10; da = da + ld; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } else { da = buf2[ddat.Month - 1] + ddat.Day; if (ddat.Year >= 1996) ld = 79; else ld = 80; if (da > ld) { da = da - ld; if (da <= 186) { switch (da % 31) { case 0: mo = da / 31; da = 31; break; default: mo = safe_cast(da / 31) + 1; da = da % 31; break; } ye = ddat.Year - 621; } else { da = da - 186; switch (da % 30) { case 0: mo = (da / 30) + 6; da = 30; break; default: mo = safe_cast(da / 30) + 7; da = da % 30; break; } ye = ddat.Year - 621; } } else { da = da + 10; switch (da % 30) { case 0: mo = (da / 30) + 9; da = 30; break; default: mo = safe_cast(da / 30) + 10; da = da % 30; break; } ye = ddat.Year - 622; } } tt1 = ye.ToString()->Trim(); tt2 = mo.ToString()->Trim(); if (tt2->Length == 1) tt2 = "0" + tt2; tt3 = da.ToString()->Trim(); if (tt3->Length == 1) tt3 = "0" + tt3; return (tt1 + "/" + tt2 + "/" + tt3); } catch(...) { return ""; } } int GetWeek(System::String ^strdat) { int W = 1; int dys = 0; int Week1 = 0; array ^str = strdat->Split('/'); DateTime FirstDayOfYear = this->PersianDatetoGDate(str[0]->ToString() + "/01/01"); switch (FirstDayOfYear.DayOfWeek) { case DayOfWeek::Saturday: Week1 = 7; break; case DayOfWeek::Sunday: Week1 = 6; break; case DayOfWeek::Monday: Week1 = 5; break; case DayOfWeek::Tuesday: Week1 = 4; break; case DayOfWeek::Wednesday: Week1 = 3; break; case DayOfWeek::Thursday: Week1 = 2; break; case DayOfWeek::Friday: Week1 = 1; break; } int m = int::Parse(str[1]->ToString()); int d = int::Parse(str[2]->ToString()); if (m < 7) { m--; dys = m * 31 + d; } else { if (m == 12) { dys = 5 * 30 + 6 * 31 + d; } else { m--; dys = m * 30 + d; } } int Rem = 0; Math::DivRem((dys - Week1), 7, Rem); if (Rem > 0) { W = ((dys - Week1) / 7) + 2; } else { W = ((dys - Week1) / 7) + 1; } return W; } int GetYear(System::String ^strdat) { array ^str = gcnew array(3); str = strdat->Split('/'); return int::Parse(str[0]->ToString()); } System::String ^GetDate(int Year, int Week, int DayInWeek) { int Day = 1; int DayInMoth = 1; int month = 1; int Week1 = 0; System::String ^startDate =""; DateTime FirstDayOfYear = this->PersianDatetoGDate(Year.ToString()+"/01/01"); switch (FirstDayOfYear.DayOfWeek) { case DayOfWeek::Saturday: Week1 =7; break; case DayOfWeek::Sunday: Week1 = 6; break; case DayOfWeek::Monday: Week1 = 5; break; case DayOfWeek::Tuesday: Week1 = 4; break; case DayOfWeek::Wednesday: Week1 = 3; break; case DayOfWeek::Thursday: Week1 = 2; break; case DayOfWeek::Friday: Week1 = 1; break; } Day = (Week-2) * 7 + DayInWeek+Week1; if (Day <= 186) { month = (Day / 31) + 1; DayInMoth = Day % 31; if (DayInMoth == 0) { month--; DayInMoth = 31; } } else { Day -= 186; month = (Day / 30) + 7; DayInMoth = Day % 30; if (DayInMoth == 0) { month--; DayInMoth = 30; } } if (month > 9 && DayInMoth > 9) startDate = Year.ToString() + "/" + month.ToString() + "/" + DayInMoth.ToString(); if (month < 10 && DayInMoth > 9) startDate = Year.ToString() + "/0" + month.ToString() + "/" + DayInMoth.ToString(); if (month > 9 && DayInMoth < 10) startDate = Year.ToString() + "/" + month.ToString() + "/0" + DayInMoth.ToString(); if (month < 10 && DayInMoth < 10) startDate = Year.ToString() + "/0" + month.ToString() + "/0" + DayInMoth.ToString(); return startDate; } };