Domanda

Io uso questi codici per convertire il datetime corrente e meno con l'ora di data che gli utenti digitano in una casella di testo.Ma dà un errore durante la conversione.

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

Questa linea accornerà un errore durante la conversione datetime dalla stringa a data ora: DateTime d1 = DateTime.Parse(str);

Aiutami a risolvere questo problema.

Grazie in anticipo

È stato utile?

Soluzione 4

Ho risolto quel problema.Era a causa di eccezione in alcuni mesi, quindi se vuoi meno due volte data l'uno dall'altro dovresti convertire sia al calendario gregoriano, allora puoi meno e vedere il risultato.

Ecco i codici:

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 
.

Altri suggerimenti

Non è necessario analizzare la data qui.

Modifica:

Originariamente volevo solo sottolineare l'errore nell'elaborazione OP con questa risposta. Ma penso che una risposta completa sia migliore (nonostante il ritardo :)) E sì, so che la rappresentazione data intermedia non sembra una data persiana.Ma non è ciò che è necessario.Questo codice fornisce una corretta differenza tra la data corrente e la data in cui l'utente inserisce.

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 utilizzare il metodo ToDateTime sulla classe PersianCalendar:

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

Quindi per ottenere la stringa in quel formato, basta fare:

string str = dateT.ToShortDateString();
.

Il tuo problema effettivo sembra mentire nello analizzare la data in cui l'utente inserito in formato calendario persiano. Quindi, se l'utente ha inserito 1391/2/31 che vuoi essere in grado di analizzare. Oggi (19 maggio 2012) è 1391/2/30 in modo da voler finalmente visualizzare qualcosa come 1 day remaining.

Questa domanda ha è stato chiesto prima . Tuttavia, la risposta accettata ci prova solo di usare

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

che non funzionerà per una data come 1391/2/31. Quindi penso che dovresti implementare l'analisi te stesso.

Senza implementare qualsiasi controllo degli errori e supponendo che l'utente utilizza sempre il formato yyyy/mm/dd che è possibile utilizzare:

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

Dovresti verificare se il regex ha riscontrato circa eventuali partite. Dovresti anche controllare se pc.ToDateTime non getta un errore. Sfortunatamente, non sembra esistere nulla come DateTime.TryParse per il calendario persiano.

Comunque, non è necessario analizzare oggi in un calendario persiano, devi solo analizzare l'input dell'utente.

Potresti anche essere interessato a Libreria Farsi - Lavorare con date, calendari e datepicker , anche se l'articolo è molto vecchio (2007).

Ecco dove la documentazione è il tuo amico:

Classe PersianCalendar

Constructotor DateTime (INT32, INT32, INT32, Calendario) < / P >.

Questo è il codice esatto che avresti bisogno:

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

In definitiva, cosa stai cercando di fare? Quali sono i risultati che ti aspetti in textBox10? Se si desidera il numero di giorni tra le due date, allora basta fare (d2 - pDate).ToString("d") e avrai la differenza in giorni. Forse se hai spiegato un po 'oltre quello che stai cercando di fare, invece di come stai cercando di farlo, possiamo aiutarti ulteriormente.

Modifica: Ho appena realizzato cosa stava dicendo Comecme. La linea che potrebbe causare il problema è qui:

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

Invece, dovremmo cambiarlo per utilizzare anche le informazioni sulla coltura:

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

Modifica: sei corretto, consente solo di analizzare la data nel formato persiano, ma non è valida secondo un particolare calendario. Per far funzionare correttamente questo, dovrai analizzare manualmente la data e istanziare un nuovo datetime con il persiano fornito:

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

Devi solo assicurarti che l'input corrisponda sicuramente il formato specificato, altrimenti non c'è modo di analizzare in modo coerente il datetime con precisione.

È possibile utilizzare questo codice:

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

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

Se lo sussulta l'uno dall'altro ottieni un TimeSpan.

  TimeSpan diff = today - userDate;
.

È possibile utilizzare le proprietà della durata di questa volta per mostrare loro il modo in cui ti piace.

Per gestire il modulo di conversione / calendario persiano, hai una buona soluzione qui:

.NET come analizzare una stringa data per Persian (Jalali Calendar) in un oggetto DateTime?

Riferimenti:

datetime.today

TimeSpan

Ecco un codice che sto 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;
        }
.

Questo può essere fatto molto più facile usare tempo 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();
.

È inoltre possibile utilizzare la seguente libreria .NET per utilizzare PersianCalendar come DateTime:

calendario persiano (persianotimetime) in c #

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

Prova questo codice: Questo codice è un codice modificato che ha pubblicato da "Grzegorz w" ma il suo codice genera errori ad esempio quando la data di ingresso dell'utente="1394/06/31" ed errore è "Anno, mese e parametri del giorno descrivono un DateTime non rappresentabile" .

Sotto il codice è 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);
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top