public static string ToPersianDateTime(this DateTime gregorianDate, string dateSeparator = "/", bool includeHourMinute = true, bool showLeftAlignedHourMinute = true, string timeSeparator = ":")
{
var gregorianYear = gregorianDate.Year;
var gregorianMonth = gregorianDate.Month;
var gregorianDay = gregorianDate.Day;
var persianCalendar = new PersianCalendar();
var persianYear = persianCalendar.GetYear(new DateTime(gregorianYear, gregorianMonth, gregorianDay, new GregorianCalendar()));
var persianMonth = persianCalendar.GetMonth(new DateTime(gregorianYear, gregorianMonth, gregorianDay, new GregorianCalendar()));
var persianDay = persianCalendar.GetDayOfMonth(new DateTime(gregorianYear, gregorianMonth, gregorianDay, new GregorianCalendar()));
return includeHourMinute ?
(showLeftAlignedHourMinute ? string.Format(CultureInfo.InvariantCulture, "{0}{6}{1} {2}{3}{4}{3}{5}", gregorianDate.Hour, gregorianDate.Minute, persianYear, dateSeparator, persianMonth.ToString("00", CultureInfo.InvariantCulture), persianDay.ToString("00", CultureInfo.InvariantCulture), timeSeparator)
: string.Format(CultureInfo.InvariantCulture, "{2}{3}{4}{3}{5} {0}{6}{1}", gregorianDate.Hour, gregorianDate.Minute, persianYear, dateSeparator, persianMonth.ToString("00", CultureInfo.InvariantCulture), persianDay.ToString("00", CultureInfo.InvariantCulture), timeSeparator))
: string.Format(CultureInfo.InvariantCulture, "{0}{1}{2}{1}{3}", persianYear, dateSeparator, persianMonth.ToString("00", CultureInfo.InvariantCulture), persianDay.ToString("00", CultureInfo.InvariantCulture));
}