/// <summary>
        /// پارس کردن رشته و تبدیل به نوع PersianDateTime
        /// </summary>
        /// <param name="persianDateTimeInString">متنی که باید پارس شود</param>
        /// <param name="dateSeperatorPattern">کاراکتری که جدا کننده تاریخ ها است</param>
        public static PersianDateTime Parse(string persianDateTimeInString, string dateSeperatorPattern = @"\/|-")
        {
            if (persianDateTimeInString == null) return new PersianDateTime();

            //Convert persian and arabic digit to english to avoid throwing exception in Parse method
            persianDateTimeInString = StringHelper.ConvertDigitsToLatin(persianDateTimeInString);

            string month = "", year, day,
                hour = "0",
                minute = "0",
                second = "0",
                miliSecond = "0";
            var amPmEnum = AmPmEnum.None;
            var containMonthSeperator = Regex.IsMatch(persianDateTimeInString, dateSeperatorPattern);

            persianDateTimeInString = ToEnglishNumber(persianDateTimeInString.Replace("&nbsp;", " ").Replace(" ", "-").Replace("\\", "-"));
            persianDateTimeInString = Regex.Replace(persianDateTimeInString, dateSeperatorPattern, "-");
            persianDateTimeInString = persianDateTimeInString.Replace("ك", "ک").Replace("ي", "ی");

            persianDateTimeInString = string.Format("-{0}-", persianDateTimeInString);

            // بدست آوردن ب.ظ یا ق.ظ
            if (persianDateTimeInString.IndexOf("ق.ظ", StringComparison.InvariantCultureIgnoreCase) > -1)
                amPmEnum = AmPmEnum.AM;
            else if (persianDateTimeInString.IndexOf("ب.ظ", StringComparison.InvariantCultureIgnoreCase) > -1)
                amPmEnum = AmPmEnum.PM;

            if (persianDateTimeInString.IndexOf(":", StringComparison.InvariantCultureIgnoreCase) > -1) // رشته ورودی شامل ساعت نیز هست
            {
                persianDateTimeInString = Regex.Replace(persianDateTimeInString, @"-*:-*", ":");
                hour = Regex.Match(persianDateTimeInString, @"(?<=-)\d{1,2}(?=:)", RegexOptions.IgnoreCase).Value;
                minute = Regex.Match(persianDateTimeInString, @"(?<=-\d{1,2}:)\d{1,2}(?=:?)", RegexOptions.IgnoreCase).Value;
                if (persianDateTimeInString.IndexOf(':') != persianDateTimeInString.LastIndexOf(':'))
                {
                    second = Regex.Match(persianDateTimeInString, @"(?<=-\d{1,2}:\d{1,2}:)\d{1,2}(?=(\d{1,2})?)", RegexOptions.IgnoreCase).Value;
                    miliSecond = Regex.Match(persianDateTimeInString, @"(?<=-\d{1,2}:\d{1,2}:\d{1,2}:)\d{1,4}(?=(\d{1,2})?)", RegexOptions.IgnoreCase).Value;
                    if (string.IsNullOrEmpty(miliSecond)) miliSecond = "0";
                }
            }

            if (containMonthSeperator)
            {
                // بدست آوردن ماه
                month = Regex.Match(persianDateTimeInString, @"(?<=\d{2,4}-)\d{1,2}(?=-\d{1,2}[^:])", RegexOptions.IgnoreCase).Value;

                // بدست آوردن روز
                day = Regex.Match(persianDateTimeInString, @"(?<=\d{2,4}-\d{1,2}-)\d{1,2}(?=-)", RegexOptions.IgnoreCase).Value;

                // بدست آوردن سال
                year = Regex.Match(persianDateTimeInString, @"(?<=-)\d{2,4}(?=-\d{1,2}-\d{1,2})", RegexOptions.IgnoreCase).Value;
            }
            else
            {
                foreach (PersianDateTimeMonthEnum item in Enum.GetValues(typeof(PersianDateTimeMonthEnum)))
                {
                    var itemValueInString = item.ToString();
                    if (!persianDateTimeInString.Contains(itemValueInString)) continue;
                    month = ((int)item).ToString();
                    break;
                }

                if (string.IsNullOrEmpty(month))
                    throw new Exception("عدد یا حرف ماه در رشته ورودی وجود ندارد");

                // بدست آوردن روز
                var dayMatch = Regex.Match(persianDateTimeInString, @"(?<=-)\d{1,2}(?=-)", RegexOptions.IgnoreCase);
                if (dayMatch.Success)
                {
                    day = dayMatch.Value;
                    persianDateTimeInString = Regex.Replace(persianDateTimeInString, string.Format("(?<=-){0}(?=-)", day), "");
                }
                else
                    throw new Exception("عدد روز در رشته ورودی وجود ندارد");

                // بدست آوردن سال
                var yearMatch = Regex.Match(persianDateTimeInString, @"(?<=-)\d{4}(?=-)", RegexOptions.IgnoreCase);
                if (yearMatch.Success)
                    year = yearMatch.Value;
                else
                {
                    yearMatch = Regex.Match(persianDateTimeInString, @"(?<=-)\d{2,4}(?=-)", RegexOptions.IgnoreCase);
                    if (yearMatch.Success)
                        year = yearMatch.Value;
                    else
                        throw new Exception("عدد سال در رشته ورودی وجود ندارد");
                }
            }

            //if (year.Length <= 2 && year[0] == '9') year = string.Format("13{0}", year);
            //else if (year.Length <= 2) year = string.Format("14{0}", year);

            var numericYear = int.Parse(year);
            var numericMonth = int.Parse(month);
            var numericDay = int.Parse(day);
            var numericHour = int.Parse(hour);
            var numericMinute = int.Parse(minute);
            var numericSecond = int.Parse(second);
            var numericMiliSecond = int.Parse(miliSecond);

            if (numericYear < 100)
                numericYear += 1300;

            switch (amPmEnum)
            {
                case AmPmEnum.PM:
                    if (numericHour < 12)
                        numericHour = numericHour + 12;
                    break;
                case AmPmEnum.AM:
                case AmPmEnum.None:
                    break;
            }

            return new PersianDateTime(numericYear, numericMonth, numericDay, numericHour, numericMinute, numericSecond, numericMiliSecond);
        }