Как преобразовать строку даты персидского календаря в DateTime?
Вопрос
Я использую эти коды для преобразования текущей даты и времени и вычитаю из нее дату и время, которые пользователи вводят в текстовое поле.Но это выдает ошибку при преобразовании.
PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime date = new DateTime();
date = DateTime.Parse(DateTime.Now.ToShortDateString());
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
string str = string.Format("{0}/{1}/{2}", year, month, day);
DateTime d1 = DateTime.Parse(str);
DateTime d2 = DateTime.Parse(textBox9.Text);
string s = (d2 - d1).ToString().Replace(".00:00:00", "");
textBox10.Text = (d2 - d1).ToString().Replace(".00:00:00","");
Эта строка выдаст ошибку при преобразовании datetime из string в date time :DateTime d1 = DateTime.Parse(str);
Пожалуйста, помогите мне решить эту проблему.
Заранее спасибо
Решение 4
Я решил эту проблему.Это было из-за исключения в течение нескольких месяцев, поэтому, если вы хотите, если вы хотите минус два раза преобразования друг от друга, вы должны преобразовать как к Gregorian Calendar, тогда вы можете замить их и увидеть результат.
Вот коды:
PersianCalendar p = new PersianCalendar();
string PersianDate1 = textBox1.Text;
string[] parts = PersianDate1.Split('/', '-');
DateTime dta1 = p.ToDateTime(Convert.ToInt32(parts[0]), Convert.ToInt32(parts[1]), Convert.ToInt32(parts[2]), 0, 0, 0, 0);
string PersianDate2 = textBox2.Text;
string[] parts2 = PersianDate2.Split('/', '-');
DateTime dta2 = p.ToDateTime(Convert.ToInt32(parts2[0]), Convert.ToInt32(parts2[1]), Convert.ToInt32(parts2[2]), 0, 0, 0, 0);
string s = (dta2 - dta1).ToString().Replace(".00:00:00", "");
textBox3.Text = s; // Show the result into the textbox
. Другие советы
Нет необходимости разбирать дату здесь.
Редактировать:
Первоначально я хотел указать ошибку в операционной обработке с этим ответом.
Но я думаю, что полный ответ будет лучше (несмотря на задержку :))
И да, я знаю, что промежуточное представление даты не похоже на персидскую дату.Но это не то, что нужно.Этот код дает правильную разницу между текущей датой и датой, в которой пользователь вкладывается.
.string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, 1);
currentDate = currentDate.AddDays(day - 1);
// validation omitted
System.String[] userDateParts = userInput.Split(new[] { "/" }, System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, 1);
userDate = userDate.AddDays(userDay - 1);
System.TimeSpan difference = currentDate.Subtract(userDate);
Просто используйте ToDateTime
метод на основе PersianCalendar
класс:
PersianCalendar p = new PersianCalendar();
DateTime now = DateTime.Now;
DateTime dateT = p.ToDateTime(now.Year, now.Month, now.Day, 0, 0, 0, 0);
Затем, чтобы получить вашу строку в этом формате, просто выполните:
string str = dateT.ToShortDateString();
Ваша реальная проблема, по-видимому, заключается в анализе даты, введенной пользователем в формате персидского календаря.Итак, если пользователь ввел 1391/2/31
вы хотите иметь возможность разобрать это.Сегодня (19 мая 2012 года) 1391/2/30
итак, вы, наконец, хотите отобразить что-то вроде 1 day remaining
.
Этот вопрос имеет меня уже спрашивали раньше.Однако принятый там ответ просто пытается использовать
string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate,
"yyyy/MM/dd", persianCulture);
Что не подойдет для такого свидания, как 1391/2/31
.Поэтому я думаю, вам придется выполнить синтаксический анализ самостоятельно.
Без какой-либо проверки ошибок и при условии, что пользователь всегда использует формат yyyy/mm/dd
вы могли бы использовать:
// Convert Persian Calendar date to regular DateTime
var persianDateMatch = System.Text.RegularExpressions.Regex.Match(
persianTargetTextBox.Text, @"^(\d+)/(\d+)/(\d+)$");
var year = int.Parse(persianDateMatch.Groups[1].Value);
var month = int.Parse(persianDateMatch.Groups[2].Value);
var day = int.Parse(persianDateMatch.Groups[3].Value);
var pc = new System.Globalization.PersianCalendar();
var target = pc.ToDateTime(year, month, day, 0, 0, 0, 0);
var difference = target - DateTime.Today;
differenceLabel.Text = difference.TotalDays.ToString("0");
Вам нужно было бы проверить, действительно ли регулярное выражение нашло какие-либо совпадения.Вы также должны были бы проверить, есть ли pc.ToDateTime
не выдает ошибку.К сожалению, похоже, что ничего подобного не существует DateTime.TryParse
для персидского календаря.
В любом случае, вам не нужно анализировать сегодняшний день в персидском календаре, вам нужно только проанализировать пользовательский ввод.
Вас также может заинтересовать Библиотека фарси - Работа с датами, календарями и указателями дат, несмотря на то, что статья очень старая (2007).
Вот где документация - ваш друг:
Конструктор DateTime (Int32, Int32, Int32, Календарь)
Это именно тот код, который вам нужен:
PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime today = DateTime.Today;
DateTime pDate = new DateTime(p.GetYear(today), p.GetMonth(today), p.GetDayOfMonth(today), p);
DateTime d2 = DateTime.Parse(textBox9.Text);
// THIS NEEDS TO BE EXPLAINED
textBox10.Text = (d2 - pDate).ToString().Replace(".00:00:00","");
В конечном счете, что вы пытаетесь сделать?Каких результатов вы ожидаете в textBox10
?Если вам нужно количество дней между двумя датами, то просто сделайте (d2 - pDate).ToString("d")
и вы почувствуете разницу в днях.Возможно, если бы вы немного подробнее объяснили, ЧТО вы пытаетесь сделать, вместо того, как вы пытаетесь это сделать, мы, возможно, смогли бы помочь вам в дальнейшем.
Редактировать:Только что понял, о чем говорил comecme.Строка, которая могла бы вызвать проблему, находится здесь:
DateTime d2 = DateTime.Parse(textBox9.Text);
Вместо этого нам нужно было бы изменить его, чтобы также использовать информацию о культуре:
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime d2 = DateTime.Parse(textBox9.Text, persianCulture)
Редактировать:Вы правы, это позволяет анализировать дату только в персидском формате, но не проверяет в соответствии с конкретным календарем.Чтобы заставить это работать должным образом, вам придется вручную проанализировать дату и создать новый экземпляр DateTime с помощью предоставленного PersianCalendar:
DateTime d2;
if(Regex.IsMatch(textBox9.Text, "^dddd/dd/dd$"))
{
d2 = new DateTime(
int.Parse(textBox9.Substring(0,4)),
int.Parse(textBox9.Substring(5, 2)),
int.Parse(textBox9.Substring(8, 2)),
p);
}
Вам просто нужно убедиться, что входные данные определенно соответствуют указанному вами формату, в противном случае нет способа последовательно и точно проанализировать дату и время.
Вы можете использовать этот код:
DateTime today = DateTime.Today; // excludes h/m/s
DateTime userdate = DateTime.Parse(textBox9.Text);
.
Если вы подкойте один из другого, вы получаете TimePAN.
TimeSpan diff = today - userDate;
.
Вы можете использовать свойства этого времени, чтобы показать им, как вам нравится.
Для управления формой преобразования / к персидскому календарю у вас есть хорошее решение здесь:
Ссылки:
Вот код, который я использую:
public DateTime ConvertPersianToEnglish(string persianDate)
{
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };
DateTime d1 = DateTime.ParseExact(persianDate, formats,
CultureInfo.CurrentCulture, DateTimeStyles.None);
PersianCalendar persian_date = new PersianCalendar();
DateTime dt = persian_date.ToDateTime(d1.Year, d1.Month, d1.Day, 0, 0, 0, 0, 0);
return dt;
}
. Это можно сделать намного проще с помощью Noda Time :
using System.Globalization;
using NodaTime;
using NodaTime.Text;
...
CultureInfo culture = CultureInfo.CreateSpecificCulture("fa-IR");
CalendarSystem calendar = CalendarSystem.GetPersianCalendar();
LocalDate template = new LocalDate(1, 1, 1, calendar);
LocalDatePattern pattern = LocalDatePattern.Create("yyyy/M/d", culture, template);
LocalDate result = pattern.Parse("1391/2/30").Value;
// if you need a DateTime, then:
DateTime dt = result.AtMidnight().ToDateTimeUnspecified();
. Вы также можете использовать следующую библиотеку .NET, чтобы использовать Persiancalendar так просто, как DateTime:
Персидский календарь (первядно) в C #
var persianDateTime = PersianDateTime.Now;
persianDateTime.EnglishNumber = true;
Console.Write(persianDateTime.ToString());
. Попробуйте этот код: Этот код отредактирован код, который размещен «Grzegorz W», но его код генерирует ошибку, например, когда дата ввода пользователя= «1394/06/31» и ошибка «1394/06/31» и ошибка «год», месяц и дневных параметров описывает невоспитанное dateTime ".
Под код ниже:
string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, day,p);
System.String[] userDateParts = userInput.Split(new[] { "/" }, System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, userDay,p);
System.TimeSpan difference = currentDate.Subtract(userDate);
.