Question

J'ai utiliser ces codes pour la conversion de courant de type datetime et moins, avec la date l'heure laquelle les utilisateurs de ce type dans une zone de texte.Mais il donne une erreur lors de la conversion.

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

Cette ligne permettra d'accorder une erreur lors de la conversion de type datetime de la corde à jour de temps :DateTime d1 = DateTime.Parse(str);

Merci de m'aider à résoudre ce problème.

Merci d'avance

Était-ce utile?

La solution 4

J'ai résolu ce problème.C'était à cause de l'exception depuis quelques mois, donc si vous voulez moins deux fois de date les uns des autres, vous devez convertir à la fois au calendrier grégorien, vous pouvez les minimiser et voir le résultat.

Voici les 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 

Autres conseils

Pas besoin d'analyser la date ici.

EDIT:

À l'origine, je voulais seulement signaler une erreur dans le traitement OP avec cette réponse. Mais je pense qu'une réponse complète serait mieux (malgré le retard :)) Et oui, je sais que la représentation de la date intermédiaire ne ressemble pas à la date persane.Mais ce n'est pas ce qui est nécessaire.Ce code donne une différence appropriée entre la date actuelle et la date à laquelle l'utilisateur met.

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

Utilisez simplement le ToDateTime méthode sur la PersianCalendar classe:

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

Ensuite, pour obtenir votre texte dans ce format, il suffit de faire:

string str = dateT.ToShortDateString();

Vous réel problème semble résider dans l'analyse de la date que l'utilisateur a entré dans le calendrier persan format.Donc, si l'utilisateur a entré 1391/2/31 vous voulez être en mesure d'analyser cela.Aujourd'hui (19 Mai 2012) 1391/2/30 si finalement vous souhaitez afficher quelque chose comme 1 day remaining.

Cette question a été posée avant.Cependant, la accepté de répondre, il essaie juste d'utiliser

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

Qui ne marchera pas pour un jour de 1391/2/31.Donc, je pense que vous auriez à mettre en œuvre le traitement vous-même.

Sans la mise en œuvre de tout contrôle d'erreur, et en supposant que l'utilisateur utilise toujours le format yyyy/mm/dd vous pouvez utiliser:

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

Vous auriez besoin de vérifier si la regex actuellement trouvé de correspondances.Il faudrait aussi vérifier si pc.ToDateTime ne jetez pas une erreur.Malheureusement, il ne semble pas exister de quelque chose comme DateTime.TryParse pour le Calendrier persan.

De toute façon, vous n'avez pas besoin d'analyser aujourd'hui dans un Calendrier persan, vous avez besoin seulement d'analyser l'entrée de l'utilisateur.

Vous pourriez également être intéressé par Persan de la Bibliothèque - Travailler avec des Dates, des Calendriers, et DatePickers, même si l'article est très vieux (2007).

Ici est l'endroit où la documentation est votre ami:

PersianCalendar Classe

DateTime Constructeur (Int32 Int32 Int32, Calendrier)

C'est exactement le code que vous auriez besoin:

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

En fin de compte, qu'essayez-vous de faire?Quels sont les résultats que vous attendez en textBox10?Si vous souhaitez que le nombre de jours entre les deux dates, puis il suffit de faire (d2 - pDate).ToString("d") et vous obtiendrez la différence en jours.Peut-être que si vous l'avez expliqué un peu plus loin CE que vous essayez de faire, au lieu de COMMENT vous essayez de le faire, nous pouvons éventuellement vous aider.

Edit:Viens de réaliser ce que comecme disait.La ligne qui serait la cause de la question est ici:

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

Au lieu de cela, nous aurions besoin de changer d'utiliser également la culture de l'information ainsi:

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

Edit:Vous avez raison, il ne permet l'analyse de la date de la perse format, mais ne valide pas selon un calendrier particulier.Afin de le faire fonctionner correctement, vous allez avoir du fil à analyser manuellement la date et l'instancier un nouveau type DateTime avec le PersianCalendar fourni:

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

Vous avez juste à vous assurer que l'entrée définitivement correspond au format que vous spécifiez, autrement il n'y a pas de façon de toujours analyser le DateTime avec précision.

Vous pouvez utiliser ce code:

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

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

Si vous ajoutez un de l'autre, vous obtenez une tempier.

  TimeSpan diff = today - userDate;

Vous pouvez utiliser les propriétés de cette période pour leur montrer comme vous le souhaitez.

Pour gérer le formulaire de conversion / sur le calendrier persan, vous avez une bonne solution ici:

.NET Comment analyser une chaîne de date pour Persian (calendrier Jalali) dans un objet DateTime?

Références:

DateTime.today

Timespan

Voici un code que j'utilise:

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

Ceci peut être fait beaucoup plus facile en utilisant Time 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();

Vous pouvez également utiliser la bibliothèque .NET suivante pour utiliser PersianCalendar aussi facile que DateTime:

Calendrier persan (PersiandateTime) en C #

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

Essayez ce code: Ce code est modifié de code posté par "grzegorz w" mais son code génère une erreur par exemple lorsque la date de saisie de l'utilisateur="1394/06/31" et une erreur est "Année, mois et des paramètres de jour décrivent une dateTime non représentable"

ci-dessous le code 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);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top