كيفية تحويل سلسلة تاريخ التقويم الفارسي إلى DateTime؟

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

  •  11-12-2019
  •  | 
  •  

سؤال

أستخدم هذه الرموز لتحويل التاريخ والوقت الحالي وطرحه مع التاريخ والوقت الذي يكتبه المستخدمون في مربع النص.لكنه يعطي خطأ أثناء التحويل.

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

سيعطي هذا السطر خطأ أثناء تحويل التاريخ والوقت من السلسلة إلى التاريخ والوقت:DateTime d1 = DateTime.Parse(str);

الرجاء مساعدتي في حل هذه المشكلة.

شكرا لك مقدما

هل كانت مفيدة؟

المحلول 4

لقد حلت هذه المشكلة.كان ذلك بسبب وجود استثناء في بعض الأشهر، لذا إذا كنت تريد طرح تاريخين من بعضهما البعض، فيجب عليك تحويلهما إلى التقويم الغريغوري، ثم يمكنك طرحهما ورؤية النتيجة.

هنا الرموز :

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 

نصائح أخرى

لا حاجة لتحليل التاريخ هنا.

يحرر:

في الأصل أردت فقط أن أشير إلى الخطأ في معالجة OP بهذه الإجابة.لكنني أعتقد أن الإجابة الكاملة ستكون أفضل (على الرغم من التأخير :)) ونعم أعلم أن تمثيل التاريخ المتوسط ​​لا يبدو وكأنه موعد فارسي.ولكن هذا ليس ما هو مطلوب.يعطي هذا الرمز الفرق المناسب بين التاريخ الحالي والتاريخ الذي يضعه المستخدم.

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

مجرد استخدام ToDateTime الطريقة على PersianCalendar فصل:

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

ثم للحصول على السلسلة الخاصة بك بهذا التنسيق، ما عليك سوى القيام بما يلي:

string str = dateT.ToShortDateString();

يبدو أن مشكلتك الفعلية تكمن في تحليل التاريخ الذي أدخله المستخدم بتنسيق التقويم الفارسي.لذلك، إذا دخل المستخدم 1391/2/31 تريد أن تكون قادرًا على تحليل ذلك.اليوم (19 مايو 2012). 1391/2/30 لذلك تريد أخيرًا عرض شيء من هذا القبيل 1 day remaining.

هذا السؤال لديه تم سؤاله من قبل.ومع ذلك، فإن الإجابة المقبولة هناك تحاول فقط استخدامها

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

والتي لن تعمل لموعد مثل 1391/2/31.لذلك أعتقد أنه سيتعين عليك تنفيذ التحليل بنفسك.

دون تنفيذ أي فحص للأخطاء، وبافتراض أن المستخدم يستخدم التنسيق دائمًا yyyy/mm/dd يمكنك استخدام:

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

ستحتاج إلى التحقق مما إذا كان التعبير العادي قد عثر بالفعل على أي تطابقات.سيكون عليك أيضًا التحقق مما إذا كان pc.ToDateTime لا يلقي خطأ.لسوء الحظ، لا يبدو أن هناك أي شيء مثل ذلك DateTime.TryParse للتقويم الفارسي.

على أية حال، لا تحتاج إلى تحليل اليوم إلى تقويم فارسي، ما عليك سوى تحليل إدخال المستخدم.

قد تكون مهتم ايضا ب المكتبة الفارسية - التعامل مع التواريخ والتقويمات ومنتقيات التاريخ, مع أن المقال قديم جداً (2007).

هنا حيث التوثيق هو صديقك:

فئة التقويم الفارسي

منشئ التاريخ والوقت (Int32، Int32، Int32، التقويم)

هذا هو الرمز الدقيق الذي ستحتاجه:

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

في النهاية، ماذا تحاول أن تفعل؟ما هي النتائج التي تتوقعها textBox10؟إذا كنت تريد عدد الأيام بين التاريخين، فما عليك سوى القيام بذلك (d2 - pDate).ToString("d") وسوف تحصل على الفرق في أيام.ربما إذا شرحت أكثر قليلاً ما تحاول القيام به، بدلاً من الطريقة التي تحاول القيام بها، فمن المحتمل أن نتمكن من مساعدتك بشكل أكبر.

يحرر:أدركت للتو ما كان يقوله كومكمي.السطر الذي قد يسبب المشكلة هنا:

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

بدلاً من ذلك، سنحتاج إلى تغييره لاستخدام المعلومات الثقافية أيضًا:

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

يحرر:أنت على صواب، فهو يسمح فقط بتحليل التاريخ بالتنسيق الفارسي، لكنه لا يتم التحقق من صحته وفقًا لتقويم معين.لكي يعمل هذا بشكل صحيح، سيتعين عليك تحليل التاريخ يدويًا وإنشاء مثيل لـ DateTime جديد باستخدام التقويم الفارسي المقدم:

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

عليك فقط التأكد من أن الإدخال يتطابق بالتأكيد مع التنسيق الذي تحدده، وإلا فلن تكون هناك طريقة لتحليل التاريخ والوقت بدقة.

يمكنك استخدام هذا الرمز:

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

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

إذا قمت بطرح واحد من الآخر تحصل على TimeSpan.

  TimeSpan diff = today - userDate;

يمكنك استخدام خصائص هذه الفترة الزمنية لإظهارها بالطريقة التي تريدها.

لإدارة نموذج التحويل/إلى التقويم الفارسي، لديك الحل الجيد هنا:

.NET كيفية تحليل سلسلة تاريخ للغة الفارسية (تقويم جلالي) إلى كائن DateTime؟

مراجع:

التاريخ والوقت.اليوم

الفترة الزمنية

إليك الرمز الذي أستخدمه:

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

يمكن القيام بذلك بسهولة أكبر باستخدام توقيت نودا:

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

يمكنك أيضًا استخدام مكتبة .net التالية لاستخدام التقويم الفارسي بسهولة مثل DateTime:

التقويم الفارسي (PersianDateTime) في C#

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

جرب هذا الكود:هذا الرمز عبارة عن رمز تم تحريره بواسطة "grzegorz W" ولكن الكود الخاص به ينشئ خطأ على سبيل المثال عندما يقوم المستخدم بإدخال التاريخ = "1394/06/31" والخطأ هو "معلمات السنة والشهر واليوم تصف تاريخ ووقت غير قابل للتمثيل"

الكود أدناه على ما يرام:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top