#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;
}
};