/// <summary>
        /// نمایش فارسی روز دریافتی شمسی
        /// مانند سه شنبه ۲۱ دی ۱۳۹۵
        /// </summary>
        public static string ToPersianDateTextify(int persianYear, int persianMonth, int persianDay)
        {
            if (persianYear <= 99)
            {
                persianYear += 1300;
            }

            var strDay   = PersianCulture.GetPersianWeekDayName(persianYear, persianMonth, persianDay);
            var strMonth = PersianCulture.PersianMonthNames[persianMonth];

            return($"{strDay} {persianDay} {strMonth} {persianYear}".ToPersianNumbers());
        }
        private static string toFriendlyPersianDate(this DateTime dt, DateTime comparisonBase, bool appendHhMm)
        {
            var persianDate = dt.ToPersianYearMonthDay();

            //1388/10/22
            var persianYear  = persianDate.Year;
            var persianMonth = persianDate.Month;
            var persianDay   = persianDate.Day;

            //13:14
            var hour = dt.Hour;
            var min  = dt.Minute;
            var hhMm =
                $"{hour.ToString("00", CultureInfo.InvariantCulture)}:{min.ToString("00", CultureInfo.InvariantCulture)}";

            var date         = new PersianCalendar().ToDateTime(persianYear, persianMonth, persianDay, hour, min, 0, 0);
            var diff         = date - comparisonBase;
            var totalSeconds = Math.Round(diff.TotalSeconds);
            var totalDays    = Math.Round(diff.TotalDays);

            var suffix = " بعد";

            if (totalSeconds < 0)
            {
                suffix       = " قبل";
                totalSeconds = Math.Abs(totalSeconds);
                totalDays    = Math.Abs(totalDays);
            }

            var dateTimeToday = DateTime.Today;
            var yesterday     = dateTimeToday.AddDays(-1);
            var today         = dateTimeToday.Date;
            var tomorrow      = dateTimeToday.AddDays(1);

            hhMm = appendHhMm ? $"، ساعت {hhMm}" : string.Empty;

            if (today == date.Date)
            {
                // Less than one minute ago.
                if (totalSeconds < 60)
                {
                    return("هم اکنون");
                }

                // Less than 2 minutes ago.
                if (totalSeconds < 120)
                {
                    return($"یک دقیقه{suffix}{hhMm}");
                }

                // Less than one hour ago.
                if (totalSeconds < 3600)
                {
                    return(string.Format(CultureInfo.InvariantCulture, "{0} دقیقه",
                                         ((int)Math.Floor(totalSeconds / 60))) + suffix + hhMm);
                }

                // Less than 2 hours ago.
                if (totalSeconds < 7200)
                {
                    return($"یک ساعت{suffix}{hhMm}");
                }

                // Less than one day ago.
                if (totalSeconds < 86400)
                {
                    return
                        (string.Format(
                             CultureInfo.InvariantCulture,
                             "{0} ساعت",
                             ((int)Math.Floor(totalSeconds / 3600))
                             ) + suffix + hhMm);
                }
            }

            if (yesterday == date.Date)
            {
                return($"دیروز {PersianCulture.GetPersianWeekDayName(persianYear, persianMonth, persianDay)}{hhMm}");
            }

            if (tomorrow == date.Date)
            {
                return($"فردا {PersianCulture.GetPersianWeekDayName(persianYear, persianMonth, persianDay)}{hhMm}");
            }

            var dayStr = $"، {ToPersianDateTextify(persianYear, persianMonth, persianDay)}{hhMm}";

            if (totalSeconds < 30 * TimeConstants.Day)
            {
                return($"{(int)Math.Abs(totalDays)} روز{suffix}{dayStr}");
            }

            if (totalSeconds < 12 * TimeConstants.Month)
            {
                int months = Convert.ToInt32(Math.Floor((double)Math.Abs(diff.Days) / 30));
                return(months <= 1 ? $"1 ماه{suffix}{dayStr}" : $"{months} ماه{suffix}{dayStr}");
            }

            var years         = Convert.ToInt32(Math.Floor((double)Math.Abs(diff.Days) / 365));
            var daysMonths    = (double)Math.Abs(diff.Days) / 30;
            var nextMonths    = Convert.ToInt32(Math.Truncate(daysMonths)) - (years * 12) - 1;
            var nextMonthsStr = nextMonths <= 0 ? "" : $"{(years >= 1 ? " و " : "")}{nextMonths} ماه";

            if (years < 1)
            {
                return($"{nextMonthsStr}{suffix}{dayStr}");
            }

            return($"{years} سال{nextMonthsStr}{suffix}{dayStr}");
        }