Как преобразовать строку даты персидского календаря в DateTime?

StackOverflow https://stackoverflow.com//questions/10655116

  •  11-12-2019
  •  | 
  •  

Вопрос

Я использую эти коды для преобразования текущей даты и времени и вычитаю из нее дату и время, которые пользователи вводят в текстовое поле.Но это выдает ошибку при преобразовании.

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).

Вот где документация - ваш друг:

Класс PersianCalendar

Конструктор 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;
.

Вы можете использовать свойства этого времени, чтобы показать им, как вам нравится.

Для управления формой преобразования / к персидскому календарю у вас есть хорошее решение здесь:

.NET Как разбирать строку даты для персидского (календарь Jalali) в объект dateTime?

Ссылки:

datetime.today

timepan

Вот код, который я использую:

  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);
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top