تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
خوارزمية : التحويل بين التاريخ الميلادي والتاريخ الهجري
#1
السلام عليكم إخواني الكرام
كيف حالكم ؟

هذا الموضوع ملك للأستاذ Mohammed Asaad وقد طلبت منه أن أنقل مشاركاته ووافق بحمد اللهSmile

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
في هذا الموضوع ساشرح ان شاء الله آليه التحويل بين التاريخ الميلادي والتاريخ الهجري

قبل الدخول في تفاصيل التحويل علينا معرفة بعض الامور :
  • [*=center]اليوم اليولياني(Julian Day):
اليوم اليولياني هو بمثابة عداد أيام مستمر منذ العام 4712 قبل الميلاد، فاليوم اليولياني الموافق ليوم 01/01/2002م مثلا هو 2452276.0، أي أن عدد الأيام منذ العام 4712 قبل الميلاد و حتى 01/01/2002 هو 2452276.0 يوما. و يبدأ اليوم اليولياني عند الساعة 12 ظهرا حسب توقيت جرينتش.
  • [*=center]نقول عن التقويم الميلادي انه غريغوري اذا كان بعد 15/10/1582م
    [*=center]نقول عن التقويم الميلادي انه يولياني اذا كان قبل 15/10/1582م
الآن ندخل الى آلية التحويل :

في البداية ما حدا يسالني عن الارقام التي دخلت في التحويل لاني شخصيا لا اعرف كيف جاءت
أولا:تحويل التاريخ الميلادي إلى هجري...






تتم عملية التحويل هنا على مرحلتين:
  • [*=center]تحويل التقويم الميلادي الى اليوم اليولياني
    [*=center]تحويل اليوم اليولياني الى التقويم الهجري
اولا: تحويل التاريخ الميلادي الى هجري:

هنا ايضا يتم تقسيم آلية التحويل الى قسمين حسب نوع التقويم الميلادي (يولياني ام غريغوري)
نختبر اذا كان التقويم الميلادي غريغوري ام لا
قلنا مسبقا ان التاريخ الميلادي يكون غريغوري اذا كانالتاريخ الميلادي بعد 15/10/1582م






دعونا نحلل شرط التقويم الغريغوري ..ليكون التقويم غريغوي يجب ان تتحقق احد الشروط التالية:
  • [*=center]السنة اكبر من 1582م
    [*=center]السنة تساوي1582م والشهر اكبر من 10
    [*=center]السنة تساوي 1582 والشهر يساوي 10 واليوم اكبر من 14
في البداية قمت بعمل بناءة من نوع Structure تمثل التاريخ وتحتوي ثلاثة اعضاء السنة والشهر واليوم.

كود :
Structure xDate
Dim Day As Integer
Dim Month As Integer
Dim Year As Integer
End Structure

والان قم بتصميم نموذج يحتوي على 6 TextBox وزر واحد
والان داخل اجراء الClick التابع للزر Button1
نقوم بحجز متغير جديد من نوع xDate وبعد ذلك نقوم باسناد القيم الثلاثة (اليوم والشهر والتاريخ)لاعضاءه الثلاثة

كود :
Dim mDate As xDate
Dim JD As Integer

كود :
mDate.Day = Int(TextBox1.Text)
mDate.Month = Int(TextBox2.Text)
mDate.Year = Int(TextBox3.Text)

وكما اسلفت هناك الية للتعامل مع الغريغوي والية اخرى للتعامل مع اليولياني:
وفي المرحلة التالية نقوم بتحويل التاريخ الميلادي الى اليولياني

كود :
If ((mDate.Year > 1582) Or ((mDate.Year = 1582) And (mDate.Month > 10)) Or ((mDate.Year = 1582) And (mDate.Month = 10) And (mDate.Day > 14))) Then
JD = Int((1461 * (mDate.Year + 4800 + Int((mDate.Month - 14) / 12))) / 4)
JD = JD + Int((365.5 * (mDate.Month - 2 - 12 * (Int((mDate.Month - 14) / 12)))) / 12)
JD = JD - Int((3 * (Int((mDate.Year + 4900 + Int((mDate.Month - 14) / 12)) / 100))) / 4)
JD = JD + mDate.Day - 32075
Else
JD = 365.5 * mDate.Year
JD = JD - Int((7 * (mDate.Year + 5001 + Int((mDate.Month - 9) / 7))) / 4)
JD = JD + Int((275 * mDate.Month) / 9) + mDate.Day + 1729777
End If

والان نقوم بتحويل التاريخ البولياني الى هجري وقم تم استخدام ارقام (لا اعلم من اين اتت) Smile

كود :
Dim L, N, J As Integer
L = JD - 1948440 + 10632
N = Int((L - 1) / 10631)
L = L - (10631 * N) + 354
J = (Int((10985 - L) / 5316)) * (Int((50 * L) / 17719))
J = J + (Int(L / 5670)) * (Int((43 * L) / 15238))
L = L - (Int((30 - J) / 15)) * (Int((17719 * J) / 50))
L = L - (Int(J / 16)) * (Int((15238 * J) / 43)) + 29
mDate.Month = Int((24 * L) / 709)
mDate.Day = L - Int((709 * mDate.Month) / 24)
mDate.Year = 30 * N + J - 30

في النهاية نقوم باسناد القيم الثلاثة الى الصناديق الثلاثة

كود :
TextBox4.Text = mDate.Day
TextBox5.Text = mDate.Month
TextBox6.Text = mDate.Year

هنا نكون قد انتهينا من تحويل التاريخ الميلادي الى هجري Smile


ثانيا:تحويل التاريخ الهجري إلى ميلادي...
نتبع نفس الالية بتحويل التقويم الهجري الى يولياني ثم الى ميلادي

كود :
Dim hDate As xDate
      Dim JD As Integer

كود :
JD = Int((11 * hDate.Year + 3) / 30) + 354 * hDate.Year + 30 *hDate.Month - Int((hDate.Month - 1) / 2) + hDate.Day + 1948440 - 385
Dim L, N, J, K,I As Integer

If (JD > 2299160) Then
L = JD + 68569
N = Int((4 * L) / 146097)
L = L- Int((146097 * N + 3) / 4)
I= Int((4000 * (L+ 1)) / 1461001)
L = L - Int((1461 * I) / 4) + 31
J = Int((80 * L) / 2447)
hDate.Day = L - Int((2447 *J) / 80)
l = Int(J / 11)
hDate.Month = J + 2 - 12 * L
hDate.Year = 100 * (N - 49) + I + L
Else
j = JD + 1402
k = Int((J - 1) / 1461)
L = J - 1461 * K
n = Int((l - 1) / 365) - Int(l / 1461)
I= L- 365 * N + 30
J= Int((80 * I) / 2447)
hDate.Day = I- Int((2447 * J) / 80)
I= Int(J/ 11)
hDate.Month = J+ 2 - 12 * I
hDate.Year = 4 * K+ N+ I- 4716
End If



وفي النهاية نقوم باستقراء الثلاثة قيم كما في السابق
واحب ان انوه ان هذه الخوارزمية هي الشائعة في جميع البرامج الدقيقة للتحويل
طبعا البعض حيقول انو في دوال جاهزة للتحويل لكن كما العادة احببت توضيح مبدأ التحويل Smile
والسلام عليكم
اللَّهُمَّ أَنْتَ رَبِّي ، لا إِلَه إِلاَّ أَنْتَ خَلَقْتَني وأَنَا عَبْدُكَ ، وأَنَا على عهْدِكَ ووعْدِكَ ما اسْتَطَعْتُ ، أَعُوذُ بِكَ مِنْ شَرِّ ما صنَعْتُ ، أَبوءُ لَكَ بِنِعْمتِكَ علَيَ ، وأَبُوءُ بذَنْبي فَاغْفِرْ لي ، فَإِنَّهُ لا يغْفِرُ الذُّنُوبِ إِلاَّ أَنْتَ .
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مقال] معلومات مهمة عن متغير التاريخ ( Date ) Dev Saeed 0 215 24-08-16, 10:44 AM
آخر رد: Dev Saeed
  التحويل من C# to VB والعكس بأداتين من مايكروسوفت أبو عمر 11 1,480 03-11-15, 12:52 AM
آخر رد: أبو عمر
  [VB.NET] التشفير باستخدام خوارزمية rsa alking-0999 10 1,386 08-07-15, 04:24 PM
آخر رد: مبرمج بلا حدود
  [VB.NET] برنامج تشفير خوارزمية rsa مضغوط ببرنامج winrar alking-0999 2 733 08-07-15, 01:49 PM
آخر رد: alking-0999
  معالجة الوقت والتاريخ RaggiTech 5 645 06-10-12, 01:07 AM
آخر رد: RaggiTech
  دالة التعامل مع التاريخ الهجري senior 0 707 04-10-12, 04:40 PM
آخر رد: senior
  التحويل من Infix الى postfix و prefix : الجزء الرابع محمد شريقي 0 6,928 04-10-12, 02:17 PM
آخر رد: محمد شريقي
  دالة لفحص التاريخ RaggiTech 0 350 03-10-12, 01:49 PM
آخر رد: RaggiTech
  التحويل بين أنواع البيانات باستخدام التضييق Explicit والتوسيع Implicit RaggiTech 0 339 02-10-12, 10:11 AM
آخر رد: RaggiTech
  استخلاص أجزاء التاريخ من صيغه تاريخ RaggiTech 0 442 02-10-12, 01:43 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم