Pergunta

Eu uso esses códigos para converter a data e hora atual e subtraí-los com a data e hora que os usuários digitam em uma caixa de texto.Mas dá um erro durante a conversão.

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","");

Esta linha causará um erro ao converter data e hora de string para data e hora:DateTime d1 = DateTime.Parse(str);

Por favor me ajude a resolver este problema.

desde já, obrigado

Foi útil?

Solução 4

Eu resolvi esse problema.foi por causa de uma exceção em alguns meses, então se você quiser menos duas datas uma da outra, você deve converter ambas para o calendário gregoriano, então você pode menos-las e ver o resultado.

aqui estão os códigos:

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 

Outras dicas

Não há necessidade de analisar a data aqui.

EDITAR:

Originalmente, eu queria apenas apontar erros no processamento do OP com esta resposta.Mas acho que uma resposta completa seria melhor (apesar do atraso :)) E sim, eu sei que a representação intermediária da data não se parece com a data persa.Mas não é isso que é necessário.Este código fornece a diferença adequada entre a data atual e a data inserida pelo usuário.

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

Basta usar o ToDateTime método no PersianCalendar aula:

PersianCalendar p = new PersianCalendar();
DateTime now = DateTime.Now;
DateTime dateT = p.ToDateTime(now.Year, now.Month, now.Day, 0, 0, 0, 0);

Então, para colocar sua string nesse formato, basta fazer:

string str = dateT.ToShortDateString();

Seu problema real parece estar na análise da data que o usuário inseriu no formato de calendário persa.Então, se o usuário digitou 1391/2/31 você quer ser capaz de analisar isso.Hoje (19 de maio de 2012) é 1391/2/30 então você finalmente deseja exibir algo como 1 day remaining.

Esta questão tem foi perguntado antes.No entanto, a resposta aceita apenas tenta usar

string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate, 
    "yyyy/MM/dd", persianCulture);

O que não funcionará para um encontro como 1391/2/31.Então acho que você mesmo teria que implementar a análise.

Sem implementar nenhuma verificação de erros e assumindo que o usuário sempre usa o formato yyyy/mm/dd você poderia usar:

// 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");

Você precisaria verificar se o regex realmente encontrou alguma correspondência.Você também teria que verificar se pc.ToDateTime não gera um erro.Infelizmente, parece não existir nada parecido DateTime.TryParse para o calendário persa.

De qualquer forma, você não precisa analisar hoje em um calendário persa, basta analisar a entrada do usuário.

Você também pode estar interessado em Biblioteca Farsi - Trabalhando com Datas, Calendários e DatePickers, embora o artigo seja muito antigo (2007).

É aqui que a documentação é sua amiga:

Classe PersianCalendar

Construtor DateTime (Int32, Int32, Int32, Calendário)

Este é o código exato que você precisa:

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","");

Em última análise, o que você está tentando fazer?Quais são os resultados que você espera textBox10?Se você quiser o número de dias entre as duas datas, basta fazer (d2 - pDate).ToString("d") e você receberá a diferença em dias.Talvez se você explicar um pouco mais O QUE está tentando fazer, em vez de COMO está tentando fazer, possamos ajudá-lo ainda mais.

Editar:Acabei de perceber o que comecme estava dizendo.A linha que causaria o problema está aqui:

DateTime d2 = DateTime.Parse(textBox9.Text);

Em vez disso, precisaríamos alterá-lo para usar também as informações culturais:

CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime d2 = DateTime.Parse(textBox9.Text, persianCulture)

Editar:Você está correto, só permite analisar a data no formato persa, mas não valida de acordo com um calendário específico.Para que isso funcione corretamente, você terá que analisar manualmente a data e instanciar um novo DateTime com o PersianCalendar fornecido:

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

Você apenas precisa ter certeza de que a entrada corresponde definitivamente ao formato especificado, caso contrário, não há como analisar o DateTime de forma consistente e precisa.

Você pode usar este código:

  DateTime today = DateTime.Today; // excludes h/m/s

  DateTime userdate = DateTime.Parse(textBox9.Text);

Se você subtrair um do outro, obterá um TimeSpan.

  TimeSpan diff = today - userDate;

Você pode usar as propriedades desse intervalo de tempo para mostrá-los da maneira que desejar.

Para gerenciar o formulário de conversão/para calendário persa, você tem uma boa solução aqui:

.NET Como analisar uma string de data para persa (calendário Jalali) em um objeto DateTime?

Referências:

DataHora.Hoje

Intervalo de tempo

Aqui está um código que estou usando:

  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;
        }

Isso pode ser feito muito mais facilmente usando Hora de Noda:

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

Você também pode usar a seguinte biblioteca .net para usar PersianCalendar tão facilmente quanto DateTime:

Calendário Persa (PersianDateTime) em C#

var persianDateTime = PersianDateTime.Now;
persianDateTime.EnglishNumber = true;
Console.Write(persianDateTime.ToString());

tente este código:este código é um código editado postado por "grzegorz W", mas seu código gera um erro, por exemplo, quando a data de entrada do usuário = "1394/06/31" e o erro é "Os parâmetros de ano, mês e dia descrevem um DateTime não representável"

o código abaixo está ok:

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top