/// <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(" ", " ").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); }