web-dev-qa-db-fra.com

Comment convertir une chaîne de date de calendrier perse en DateTime?

J'utilise ces codes pour la conversion de la date et de l'heure actuelles et le diminue avec la date et l'heure que les utilisateurs saisissent dans une zone de texte. Mais cela 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 attribue une erreur lors de la conversion de date-heure de chaîne en date-heure: DateTime d1 = DateTime.Parse(str);

S'il vous plaît aidez-moi à résoudre ce problème.

Merci d'avance

15

J'ai résolu ce problème. certains mois, c’est une exception. Par conséquent, si vous souhaitez modifier l’heure de la date, vous devez convertir les deux dates en calendrier grégorien. Vous pouvez les afficher moins 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 
6

Pas besoin d'analyser la date ici.

MODIFIER:

Au départ, je voulais seulement signaler une erreur dans le traitement du PO avec cette réponse. Mais je pense qu'une réponse complète serait préférable (malgré le délai :)) Et oui, je sais que la représentation de date intermédiaire fait ne ressemble pas à Date Persian. Mais ce n'est pas ce qui est nécessaire. Ce code indique la différence entre la date actuelle et la date indiquée par l'utilisateur.

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);
14
Grzegorz W

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

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 chaîne dans ce format, faites simplement:

string str = dateT.ToShortDateString();
10
mattytommo

Votre problème actuel semble résider dans l’analyse de la date saisie par l’utilisateur au format calendrier persan. Donc, si l'utilisateur a entré 1391/2/31, vous voulez pouvoir analyser cela. Aujourd'hui (19 mai 2012), c'est 1391/2/30 et vous voulez enfin afficher quelque chose comme 1 day remaining.

Cette question a été posée avant . Cependant, la réponse acceptée essaie simplement d'utiliser 

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

Ce qui ne fonctionnera pas pour une date comme 1391/2/31. Donc, je pense que vous devriez implémenter l'analyse vous-même. 

Sans implémenter de vérification 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 devrez vérifier si l'expression rationnelle a trouvé des correspondances. Vous devez également vérifier si pc.ToDateTime ne génère pas d'erreur. Malheureusement, rien ne semble exister comme DateTime.TryParse pour le calendrier persan. 

Quoi qu'il en soit, vous n'avez pas besoin d'analyser aujourd'hui dans un calendrier persan, il vous suffit d'analyser les données saisies par l'utilisateur.

Vous pouvez également être intéressé par Bibliothèque farsi - Utilisation de dates, de calendriers et de DatePickers , même si l'article est très ancien (2007).

9
comecme

Voici où la documentation est votre amie:

Classe PersianCalendar

DateTime Constructor (Int32, Int32, Int32, Calendrier)

C'est le code exact dont 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 dans textBox10? Si vous voulez le nombre de jours entre les deux dates, faites simplement (d2 - pDate).ToString("d") et vous obtiendrez la différence en jours. Peut-être que si vous expliquez un peu plus CE QUE vous essayez de faire, au lieu de COMMENT vous essayez de le faire, nous pourrons éventuellement vous aider davantage.

Edit: Je viens de comprendre ce que disait le comecme. La ligne qui causerait le problème est ici:

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

Au lieu de cela, nous aurions besoin de le changer pour utiliser également les informations sur la culture:

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

Éditer: Vous avez raison, cela permet uniquement d'analyser la date au format persan, mais ne valide pas en fonction d'un calendrier particulier. Pour que cela fonctionne correctement, vous devrez analyser manuellement la date et instancier un nouveau 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 devez simplement vous assurer que l'entrée correspond parfaitement au format que vous spécifiez, sinon il n'y a aucun moyen d'analyser systématiquement le DateTime avec précision.

5
SPFiredrake

Vous pouvez utiliser ce code:

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

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

Si vous soustrayez l'un de l'autre, vous obtenez un TimeSpan.

  TimeSpan diff = today - userDate;

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

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

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

Références:

DateTime.Today

TimeSpan

1
JotaBe

Cela peut être fait beaucoup plus facilement avec 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();
1
Matt Johnson

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;
        }
1
Ehsan Akbar

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

Calendrier persan (PersianDateTime) en C #

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

essayez ce code: ce code est édité par "grzegorz W" mais son code génère une erreur, par exemple lorsque l'utilisateur saisit date = "1394/06/31" et que l'erreur est "Année, mois et jour paramètres décrivent un DateTime non représentable "

le code ci-dessous 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);
0
hojjat.mi