Wie konvertiere ich die Datumszeichenfolge des persischen Kalenders in DateTime?

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

  •  11-12-2019
  •  | 
  •  

Frage

Ich verwende diese Codes zum Konvertieren der aktuellen Datums- und Uhrzeitangabe und Minus der Datums- und Uhrzeitangabe, die Benutzer in ein Textfeld eingeben.Beim Konvertieren wird jedoch ein Fehler ausgegeben.

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

Diese Zeile gibt einen Fehler beim Konvertieren von Datums- / Uhrzeitangabe von Zeichenfolge in Datums- / Uhrzeitangabe aus :DateTime d1 = DateTime.Parse(str);

Bitte helfen Sie mir, dieses Problem zu lösen.

Danke im Voraus

War es hilfreich?

Lösung 4

Ich habe das Problem gelöst.wenn Sie also zwei Datumszeiten voneinander abziehen möchten, sollten Sie beide in den Gregorianischen Kalender konvertieren, dann können Sie sie abziehen und das Ergebnis sehen.

hier sind die Codes :

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 

Andere Tipps

Das Datum muss hier nicht analysiert werden.

BEARBEITEN:

Ursprünglich wollte ich mit dieser Antwort nur auf Fehler bei der OP-Verarbeitung hinweisen.Aber ich denke, eine vollständige Antwort wäre besser (trotz der Verzögerung :)) Und ja, ich weiß, dass die Darstellung des Zwischendatums nicht wie das persische Datum aussieht.Aber es ist nicht das, was benötigt wird.Dieser Code gibt den richtigen Unterschied zwischen dem aktuellen Datum und dem Datum an, das der Benutzer eingibt.

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

Verwenden Sie einfach die ToDateTime methode auf der PersianCalendar Klasse:

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

Um dann Ihre Zeichenfolge in diesem Format zu erhalten, tun Sie einfach:

string str = dateT.ToShortDateString();

Ihr eigentliches Problem scheint darin zu liegen, das vom Benutzer eingegebene Datum im persischen Kalenderformat zu analysieren.Also, wenn der Benutzer eingegeben hat 1391/2/31 sie möchten das analysieren können.Heute (19.Mai 2012) ist 1391/2/30 Sie möchten also endlich so etwas anzeigen wie 1 day remaining.

Diese Frage hat wurde schon mal gefragt.Die akzeptierte Antwort dort versucht jedoch nur zu verwenden

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

Was für ein Date wie nicht funktioniert 1391/2/31.Ich denke also, Sie müssten das Parsen selbst implementieren.

Ohne eine Fehlerprüfung zu implementieren und vorausgesetzt, der Benutzer verwendet immer das Format yyyy/mm/dd sie könnten verwenden:

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

Sie müssten überprüfen, ob der reguläre Ausdruck tatsächlich Übereinstimmungen gefunden hat.Sie müssten auch überprüfen, ob pc.ToDateTime wirft keinen Fehler aus.Leider scheint es so etwas nicht zu geben DateTime.TryParse für den persischen Kalender.

Auf jeden Fall müssen Sie heute nicht in einen persischen Kalender analysieren, sondern nur die Benutzereingaben analysieren.

Das könnte Sie auch interessieren Farsi-Bibliothek - Arbeiten mit Datumsangaben, Kalendern und Datumsauswahl, obwohl der Artikel sehr alt ist (2007).

Hier ist die Dokumentation Ihr Freund:

Persischer Kalenderkurs

DateTime Konstruktor (Int32, Int32, Int32, Kalender)

Dies ist der genaue Code, den Sie benötigen würden:

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

Was versuchst du letztendlich zu tun?Was sind die Ergebnisse, die Sie erwarten textBox10?Wenn Sie die Anzahl der Tage zwischen den beiden Daten wünschen, dann tun Sie einfach (d2 - pDate).ToString("d") und Sie werden den Unterschied in Tagen sehen.Vielleicht, wenn Sie ein wenig weiter erklären, WAS Sie versuchen zu tun, anstatt WIE Sie es versuchen, können wir Ihnen möglicherweise weiterhelfen.

Bearbeiten:Ich habe gerade verstanden, was comecme sagte.Die Zeile, die das Problem verursachen würde, ist hier:

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

Stattdessen müssten wir es ändern, um auch die Kulturinformationen zu verwenden:

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

Bearbeiten:Sie haben Recht, es erlaubt nur das Parsen des Datums im persischen Format, validiert jedoch nicht nach einem bestimmten Kalender.Damit dies ordnungsgemäß funktioniert, müssen Sie das Datum manuell analysieren und eine neue DateTime mit dem mitgelieferten PersianCalendar instanziieren:

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

Sie müssen nur sicherstellen, dass die Eingabe definitiv mit dem von Ihnen angegebenen Format übereinstimmt, da es sonst keine Möglichkeit gibt, die Datums- und Uhrzeitangabe konsistent genau zu analysieren.

Sie können diesen Code verwenden:

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

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

Wenn Sie eine von der anderen subtrahieren, erhalten Sie eine Zeitspanne.

  TimeSpan diff = today - userDate;

Sie können die Eigenschaften dieser Zeitspanne verwenden, um sie so anzuzeigen, wie Sie möchten.

Um das Konvertierungsformular / in persischen Kalender zu verwalten, haben Sie hier eine gute Lösung:

.NET Wie analysiere ich eine Datumszeichenfolge für Persisch (Jalali-Kalender) in ein DateTime-Objekt?

Verweis:

Datum / Uhrzeit.Heute

Zeitspanne

Hier ist ein Code, den ich benutze :

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

Dies kann viel einfacher gemacht werden mit Noda Zeit:

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

Sie können auch die folgende .net-Bibliothek verwenden, um PersianCalendar so einfach wie DateTime zu verwenden:

Persischer Kalender(PersianDateTime) in C#

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

probieren Sie diesen Code aus:dieser Code ist bearbeiteter Code, der von "grzegorz W" gepostet wurde, aber sein Code generiert einen Fehler, z. B. wenn das Datum der Benutzereingabe = "1394/06/31" ist und der Fehler "Parameter für Jahr, Monat und Tag beschreiben eine nicht darstellbare Datums- und Uhrzeitangabe" lautet. "

der folgende Code ist in Ordnung:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top