الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

من يحل مشكلتي مع التاريخ الهجري وله الدعاء (مشروعي متوقف عليها)

بدأه Shummry في 26 سبتمبر 2013 · 12 رد · 4,954 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

 

في البداية أحب أن أشكر جميع الأخوة القائمين على هذا المنتدى الرائع

 

وبدون إطالة أود طرح مشكلتي

 

مشكلتي تتمثل في أني عندما أقوم بتعريف متغير من نوع "تاريخ" كالتالي

Dim dd as date

تبدأ المشكلة عندما أريد اسناد تاريخ لهذا المتغير

 

فعندما يكون التاريخ المعتمد للبرنامج هو التاريخ الهجري (سواء عن طريق الوندوز أو عن طريق أمر ( Globalization.CultureInfo )  )

 

فإن هذا المتغير لن يقبل بأي حال من الأحوال التواريخ التالية

 

30/2

30/4

30/6

30/8

30/10

30/12

 

يعني بالعربي لن يقبل يوم 30 من أي شهر زوجي من أشهر السنة الهجرية

 

 

----------------------------

 

أحب أن انوه الى أنني تغلبت على هذه المشكلة بإجبار البرنامج على اعتماد التاريخ الميلادي ولو شكليا فقط عن طريق الأمر

Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("ar-eg")

انحلت المشكلة ولكن بقي أن شهر 2 لن يقبل يوم 30 وفي أغلب الأحيان لن يقبل حتى 29

 

يعني 30/2 لن يتم قبوله وهذه مشكلة

 

كيف يمكنني جعل المتغير يقبل أي قيمة تاريخ فكما هو معروف التاريخ الهجري قد يكون 30 يوم لأي شهر

 

وانا أحتاج الى استخدام التاريخ الهجري في برنامجي

 

مع العلم بأنه عند اعتماد التاريخ الهجري للبرنامج لن يقبل يوم 30 من الأشهر الزوجية 2-4-6-8-10-12

 

أتمنى تكون وصلت الفكرة

 

واذا فيه أحد ما فهم المقصود او استصعب عليه أمر ما مما ذكرته لا يتردد في طرح تساؤله 

 

لأني أقوم على مشروع الآن والبرنامج متوقف عند هذه النقطة

 

تحياتي للجميع

 

مرفق صورة الخطأ

 

post-94066-0-98963900-1380167809_thumb.j

#2

السلام عليكم ..

Windows Hijri Calendar

Farsi Library - Working with Dates, Calendars, and DatePickers رابط (يقولون انه يمكن استخدام العربي )

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

السلام عليكم 

 

فقط عدل على الكود ليصبح كتالي

 

dd = formate(textbox1.text & " / " & texbox2.text & " / " & textbox3.text , "dd/mm/yyyy")

 

هكذا سوف يقبل التاريخ لان متغير dd من نوع تاريخ والقيمة التي اسندت اليه من نوع نص وهذا لا يجوز يجب ان تسند اليه قيمة تاريخ فقط

بهذا الكود يكون قد تم تحويل النص الى تاريخ

 

بالتوفيق

تم تعديل هذه المشاركة بواسطة عبدالرحمن المرشود في 27 سبتمبر 2013 في 00:31

بسم الله الذي لا يضر مع اسمه شيء بالارض ولا بالسماء وهو السميع العليم

#4
عبدالرحمن المرشود كتب:

السلام عليكم 

 

فقط عدل على الكود ليصبح كتالي

 

dd = formate(textbox1.text & " / " & texbox2.text & " / " & textbox3.text , "dd/mm/yyyy")

 

هكذا سوف يقبل التاريخ لان متغير dd من نوع تاريخ والقيمة التي اسندت اليه من نوع نص وهذا لا يجوز يجب ان تسند اليه قيمة تاريخ فقط

بهذا الكود يكون قد تم تحويل النص الى تاريخ

 

بالتوفيق

 

 

وعليكم السلام

 

كيف يكون تاريخ (30/2/1434) نص وليس تاريخ

 

أرجو منك أخي الكريم ان تقوم بعمل برنامج لديك بحيث تقوم بتعريف متغير من نوع تاريخ وتسند إ‘ليه قيمة التاريخ (30/2/1434)

 

وجزاك الله خير

 

** بالنسبة للكود الذي أرفقته لا يعمل (للمعلومية فقط وهذا اصلا ليس طلبي

 

دالة format متخصصة فقط في ترتيب التاريخ وليس تحويله من نوع الى آخر وشكرا

تم تعديل هذه المشاركة بواسطة Shummry في 27 سبتمبر 2013 في 10:08

#5
حسام الشامي كتب:

السلام عليكم ..

Windows Hijri Calendar

Farsi Library - Working with Dates, Calendars, and DatePickers رابط (يقولون انه يمكن استخدام العربي )

 

 

أشكرك أخوي على الإضافة لكن الاداة اللي انت حطيته مكتوبة بالسي شارب + ما قدرت افتحة عندي لأن فيه مشكلة بالملفات المرفقة مع الأداة ومشكلة توافق + استخدمت ملف exe حق الاداة (شهر صفر 29 يوم فقط على مر السنوات وهذا غير معقول)

 

تحياتي لك

#6
Shummry كتب:

أشكرك أخوي على الإضافة لكن الاداة اللي انت حطيته مكتوبة بالسي شارب + ما قدرت افتحة عندي لأن فيه مشكلة بالملفات المرفقة مع الأداة ومشكلة توافق + استخدمت ملف exe حق الاداة (شهر صفر 29 يوم فقط على مر السنوات وهذا غير معقول)

 

تحياتي لك

السلام عليكم ..

الأداة بالــ #C  و لكنها عبارة عن DLL  يتم إضافتها كــ reference  لمشروع الــ VB.NET  . هي (HijriDate.DLL)

معك حق بالنسبة لشهر صفر , و يبدو أن هناك خطأ بالكود قمت بتصحيحه , و ارسلت تعليق لصاحب الأداة .

الكود بحاجة لتدقيق أكثر , حتى نتأكد أنه خالي من اي أخطاء أخرى .

HijriDate.rar

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

أشكرك أخي حسام على ما تقدمه

 

ولكن يبدو الى الآن الى أن الأداة لا يوجد بها شهر صفر يحتوي على 30 يوم على مر السنين

 

دعنا من هذا الأن

 

ما أريده الآن هو أن ان تقوم بتعريف متغير في الفيجوال بيسك من نوع تاريخ وتقوم باسناد تاريخ 30/2 لأي سنة لهذا المتغير (تحت أي تقويم) سواء الميلادي أو الهجري او حتى الإغريقي أو الهيروغليفي

 

اريد أن يقبل المتغير من نوع date التاريخ 30/2

 

لكي أقوم بإجراء مقارنات عليه وإضافة أيام وغيرها من دوال التواريخ
 

ولك الشكر الجزيل (حرم الله وجهك عن النار)

#8

السلام عليكم ..

بارك الله بك اخي ..

  1. من لوحة التحكم ثم region and language  قم باختيار الــ Format  بـــ Arabic Sauda arabia  حتى يظهر التاريخ الهجري في الــ DateTimePicker
  2. إسناد التاريخ 30 - 2  مع أي سنة لمتحول من نوع Date  يعطي خطأ .
  3. و لكن جرب الكود التالي , اجو أن يكون مفيدا ...  
    Dim hijriCalendar As New HijriCalendar
            Dim dateHijri As New Date(1434, 2, 29, hijriCalendar)
            dateHijri = hijriCalendar.AddDays(dateHijri, 1)
            DateTimePicker1.Value = dateHijri
            MsgBox("Internal Day =" & DateTimePicker1.Value.Day)
            MsgBox("Day=" & DateTimePicker1.Value.ToString("dd"))
            MsgBox("Month=" & DateTimePicker1.Value.ToString("MMMM"))
            MsgBox("Year=" & DateTimePicker1.Value.ToString("yyyy"))

بانتظار ردود الخبراء على الموضوع .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#9

أشكرك أخي حسام على الإضافات الرائعة والمحاولات المشكورة

 

بالنسبة للكود الذي ادرجته لا يفي بالغرض المطلوب

 

وقد وجدت حلا عقيما ولكنه يفي بالمطلوب مؤقتا

 

الحل كالتالي :

 

عند تحويل تقوم البرنامج الى التقويم الهجري عن طريق هذا الأمر

Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("ar-sa")

 فإن البرنامج لن يقبل يوم 30 للأشهر الزوجية 2-4-6-8-10-12

 

 

 

وعند تحويل التقويم الى ميلادي (مصر)

Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("ar-eg")

فإن البرنامج لن يقبل تاريخي 29/2   و   30/2

 

 

وعند استخدام التقويم العربي عن طريق هذا الأمر

Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("ar")

فإن البرنامج لن يقبل يوم 30 للأشهر الفردية 1-3-5-7-9-11

 

لذلك كان الحل كالتالي

 

التبديل بين التقويمين الميلادي والعربي على حسب التاريخ المعطى

 

فإذا كلن التاريخ المغطى هو 29/2 أو 30/2 فإنه سيتم تحويل تقوم البرنامج الى العربي (ar) فقط

 

وإلا سيتم اعتماد التاريخ الميلادي المصري (ar-eg)

 

طبعا عن طريق جملة If

 

أرجو من الإخوة الخبراء عدم البخل على بالنصح في حال خرجو بخوارزمية أفضل مما ذكرت

 

ولكم خالص شكري وتقديري

 

تحياتي

#10

السؤال المهم هنا ..  ماذا تريد ان تعمل بالتاريخ ؟ ..

 

هل سيتم حفظه في قاعدة بيانات ام ستتم مقارنته مع تاريخ آخر ؟

 

يجب ان تعلم انك في قاعدة البيانات لايمكنك حفظ تاريخ هجري

 

 

 

 

 

عموماً هذه داله تقوم بتحويل التاريخ الهجري (حسب تقويم أم القرى) الى التاريخ الميلادي

    Public Function UmAlQuraToMelady(ByVal DateStr As String) As Date
        'داله لتحويل التاريخ الهجري حسب تقويم أم القرى إلى التاريخ الميلادي  
        Try
            Dim Ar As Globalization.CultureInfo = New Globalization.CultureInfo("ar-SA")
            System.Threading.Thread.CurrentThread.CurrentCulture = Ar
            Ar.DateTimeFormat.Calendar = New Globalization.UmAlQuraCalendar
            UmAlQuraToMelady = New DateTime(CDate(DateStr).Year, CDate(DateStr).Month, CDate(DateStr).Day)
            Ar.DateTimeFormat.Calendar = New Globalization.GregorianCalendar
        Catch ex As Exception
            'MsgBox("التاريخ غير مطابق لتقويم أم القرى", MsgBoxStyle.MsgBoxRight, "خطأ")
            'UmAlQuraToMelady = Nothing
        End Try
    End Function

 

 

 

وهنا العكس .. من الميلادي الى الهجري (ام القرى)

    Public Function GregorianToUmAlQura(ByVal DateString As String) As String
        'داله لتحويل التاريخ الميلادي إلى التاريخ  الهجري حسب تقويم أم القرى  
        Try
            Dim UmAlQuraDT As New System.Globalization.UmAlQuraCalendar
            Dim GregorianDT As Date = DateString
            Dim hijDay As String = UmAlQuraDT.GetDayOfMonth(DateString)
            Dim hijMonth As String = UmAlQuraDT.GetMonth(DateString)
            Dim hijYear As String = UmAlQuraDT.GetYear(DateString)

            If Val(hijDay) < 10 Then
                hijDay = "0" & hijDay
            End If
            If Val(hijMonth) < 10 Then
                hijMonth = "0" & hijMonth
            End If
            GregorianToUmAlQura = hijYear.ToString + "/" + hijMonth.ToString + "/" + hijDay.ToString
        Catch ex As Exception
            GregorianToUmAlQura = Nothing
            'MsgBox("التاريخ غير مطابق لتقويم أم القرى", MsgBoxStyle.MsgBoxRight, "خطأ")
        End Try
    End Function

شخصياً هذا ما أقوم به في كل البرامج التي أعمل عليها

#11

أشكرك أخي السعودي على التوضيح

 

إجابة لأسئلتك

 

ما أريد فعله بالتاريخ هو التالي:

 

1- مقارنته مع عدة تواريخ

 

2- حساب الفرق بين تاريخ وآخر بالأيام

 

3- التحويل بين التواريخ الميلادية والهجرية

 

4- حفظه في قاعدة البيانات (يتم حفظه كتاريخ هجري) مثلا 10/10/1433 يتم حفظه في قاعدة البيانات بشكله الحالي ولا يهمني تعامل قاعدة البيانات معه سواء هجري أو ميلادي لأن التفرقه بين النوعين يتم داخل البرنامج

 

 

 

كل الأمور السابقة لا يوجد لدي مشكلة فيها (كما لا يمكنني اعتماد التاريخ الميلادي في البرنامج لأن الجهة المشغلة للبرنامج تعتمد التاريخ الهجري والهجري فقط) رغم أن المدخلات قد تأتي بتاريخ ميلادي وهنا يأتي دور دالة التحويل

 

المشكلة كما قلت لم أجد تقويم واحد يقبل جميع انواع التواريخ كما وضحت سابقا

 

فــــــ

 

تقويم ar-sa لايقبل يوم 30 للأشهر الزوجية وهذا غير منطقي (قد يكون لدينا في شهر 4(ربيع الثاني) 30 يوم) وهذا مالا يقبله هذا النوع من التقاويم

 

و

 

وتقويم ar-eg لا يقبل 29 و 30 لشهر 2 وهذا كذلك غير منطقة للتاريخ الهجري (رغم أن ar-eg هو تقويم ميلادي ولكن استخدمه هنا لأنه يقبل 30 لجميع الأشهر ما عدا 2)

 

وتقويم ar لا يقبل يوم 30 للأشهر الفردية وهذه كذلك غير منطقى فقد يكون لدينا في شهر 5(جمادى الأولى) 30 يوم وهذا ما لا يقبله هذا النوع  (المميز في هذا التقويم أنه يقبل تاريخي 30/2 و 29/2 )

 

لذلك أضحى الحل في التبديل بين التقويمين ar-eg  و  ar    على حسب التاريخ المعطى 

 

 

تحياتي لك

#12

لحد الان لم اجد الجواب الشافي

#13

جزاك الله خيرا

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…