استخدام مكتبة JodaTime للتعامل مع التاريخ الهجري

احمد الجعيدمنذ 7 سنوات

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

  • المتطلبات :
    ١ - كوب قهوة 
    ٢ - اندرويد ستديو ويفضل ان تقوم بالتحديث الي الاصدار 2 لتتمتع بالمحاكي السريع 
  • انشئ مشروع جديد:

بداية كل بداية وثورة تقنية هو انشاء مشروع جديد قم بتسمية المشروع كما تشاء وبعد ذلك قم باختيار Empty Activity .
قم باضافة هذا السطر في gradle.builde وهو خاص بمكتبة JodaTime.


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'joda-time:joda-time:2.9.3'
}
  • تصميم واجهة التطبيق :
    سنقوم بتصميم واجهة بسيطة باستخدام Material Desing لعرض :
    - عرض تاريخ اليوم بالهجري.
    - المتبقي على شهر رمضان ،بعض المناسبات .
    - تحويل التاريخ من الميلادي للهجري.

device-2016-04-21-120617.png

الشفرة البرمجية الخاصة بالواجهه :


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.ahmed.hijri.MainActivity">

    <android.support.v7.widget.GridLayout
        android:id="@+id/choice_grid"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:padding="4dp"
        app:alignmentMode="alignBounds"
        app:columnCount="2"
        app:rowOrderPreserved="false"
        app:useDefaultMargins="true">

        <android.support.v7.widget.CardView
            android:layout_width="0dp"
            android:layout_height="150dp"
            android:gravity="center"
            app:layout_columnWeight="1"
            app:layout_gravity="fill_horizontal">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@color/colorAccent"
                    android:orientation="vertical"
                    android:padding="10dp">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:text="ميلادي"
                        android:textColor="@color/md_white_1000"
                        android:textSize="18sp"
                        android:textStyle="bold" />


                </LinearLayout>

                <TextView
                    android:id="@+id/gey_date"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:textColor="@color/md_grey_500"
                    android:textSize="24sp"
                    android:textStyle="bold"
                    tools:text="April 20 2016" />
            </LinearLayout>
        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:layout_width="0dp"
            android:layout_height="150dp"
            android:gravity="center"
            app:layout_columnWeight="1"
            app:layout_gravity="fill_horizontal">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@color/colorAccent"
                    android:orientation="vertical"
                    android:padding="10dp">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:text="هجري"
                        android:textColor="@color/md_white_1000"
                        android:textSize="18sp"
                        android:textStyle="bold" />


                </LinearLayout>

                <TextView
                    android:id="@+id/hijri_date"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:textColor="@color/md_grey_500"
                    android:textSize="24sp"
                    android:textStyle="bold"
                    tools:text="April 20 2016" />
            </LinearLayout>
        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Tile3"
            app:layout_columnSpan="2"
            app:layout_columnWeight="1"
            app:layout_gravity="fill_horizontal"
            app:layout_rowWeight="1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@color/colorAccent"
                    android:orientation="vertical"
                    android:padding="10dp">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:text="متبقي على رمضان"
                        android:textColor="@color/md_white_1000"
                        android:textSize="18sp"
                        android:textStyle="bold" />


                </LinearLayout>

                <TextView
                    android:id="@+id/ramadan_date"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tv_heading"
                    android:layout_marginTop="20dp"
                    android:gravity="center"
                    android:text="345"
                    android:textColor="@color/md_grey_500"
                    android:textSize="67sp"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/tv_heading"
                    android:layout_marginBottom="20dp"
                    android:gravity="center"
                    android:text="يوم"
                    android:textColor="@color/md_grey_500"
                    android:textSize="17sp"
                    android:textStyle="bold" />
            </LinearLayout>
        </android.support.v7.widget.CardView>


    </android.support.v7.widget.GridLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/action"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="15dp"
        android:src="@drawable/ic_date_range_black_24dp" />
</FrameLayout>
  • كتابة الشفرة البرمجية للـActivity :
    قمنا سابقاً بانشاء Activity فارغ والان سنقوم بكتابة الاوامر الخاصة بمكتبة Joda وشرحها بشكل ميسر وبسيط .

DateTime.now()

هنا لعرض التاريخ الميلادي بصيغه كاملة مع الوقت.
لكن لو فرضاً اردنا تخصيص الوقت بصيغه معينه تناسب التطبيق الخاص بنا . مثلا اريد التاريخ بهذه الصيغه :
"الجمعة ٢٢ ابريل ٢٠١٦ ميلادي"
ركز معي في الجدول التالي وقم بتحديد ماذا تريد ان تعرض :

الرمز   شرح القيمة المستردة مثال
G التقويم الحالي "هجري ، ميلادي ، الخ" نص AH,Ad
C القرن الحالي رقم ٢٠
Y السنة الحالية في القرن سنة 1437
x نحتاجه اذا صادف ان السنة بدأت من نصف الاسبوع سنة 1437
w رقم الاسبوع في weekyear "المشروحة في الاعلى" رقم ٢٧
e رقم اليوم في الاسبوع رقم ٢
E اسم اليوم في الاسبوع نص الاثنين
y  سنة  رقم  1437
D  رقم اليوم في السنة  رقم  ١١٤
M  رقم الشهر في السنة رقم   ٩
d  رقم اليوم في الشهر  رقم  ١١
a لمعرفة الوقت    نص  ص او م
K  الساعة في اليوم (٠-١١)  رقم  ٠
h  رقم الساعة في نصف اليوم (١ - ١٢ )  رقم  ١٢
H  الساعة في اليوم ( ٠ - ٢٣ )  رقم  ١٣
k  الساعة صحيحة في اليوم ( ١ - ٢٤ )  رقم  ٢٤
m  الدقيقة في الساعة  رقم  ٣٠
s  الثانية في الدقيقة  رقم  ٥٥
S جزء من الثانية    رقم  ٤٥٦
z المنطقة الزمنية  نص  PST
Z  المنطقة الزمنية بحسب ID  منطقة زمنية  SA/Ryadth


الان ومن خلال اطلاعك على الجدول ستقوم بتحديد الصيغة وستكون بهذ الشكل :


DateTime.now().toString("E dd MMMM YYYY G")

حددت اليوم من  الاسبوع ثم اليوم من الشهر واسم الشهر وكذلك السنة وبعد ذلك اضفت نوع التقويم

  • عرض التاريخ الهجري الحالي :
    الان درسنا يقوم على هذه النقطة وهو عرض التاريخ الهجري وسيكون بالاعتماد على التاريخ الميلادي الحالي : 
    
    DateTime dtIslamic = DateTime.now().withChronology(IslamicChronology.getInstance());
    بهذا السطر فقط نستطيع عرض التاريخ الهجري وستقوم انت اخي المتابع معي بكتابة الصيغة التي تعجبك  .
  • تحويل التواريخ :
    - من ميلادي الى هجري :
    
     DateTime date = new DateTime(year, monthOfYear + 1, dayOfMonth, , , );
            DateTime dtIslamic = date.withChronology(IslamicChronology.getInstance());
            result.setText(dtIslamic.toString("E dd MMMM yyyy G"));
    - من هجري الى ميلادي :
  • بعض التلميحات لاستخدام JodaTime :
    - عرض عدد الايام المتبقية بين تاريخين :
    
    Days.daysBetween(new LocalDate(DateTime.now()), new LocalDate(dtIso)).getDays();
    في الكود السابق كتبت اولاً التاريخ الحالي الذي ساقوم بالحساب ابتداءً منه وبعد ذلك كتبت تاريخ النهاية وستقوم المكتبة بحساب عدد الايام.
    ستجد في المثال المرفق طريقة عرض عدد الايام المتبقية على الشهر الفضيل عسى ان يبلغنا الله لافاقدين ولا مفقودين.
    قيس على المثال السابق "الشهور والاسابيع والايام والدقائق والثواني "
    - تحديد تاريخ معين والمنطقة الزمنية :
    تستطيع تحديد التاريخ والوقت والمنطقة الزمنية باستخدام المكتبة وتخصيصها.
    
    DateTime cestTime = new DateTime(2013, 6, 10, 2, , DateTimeZone.forID("Europe/Berlin"));
    - التحقق من هل التاريخ قبل او بعد التاريخ الحالي :
    توجد دالة تدعى isBefore وهي للتاكد هل التاريخ هذا قبل ام بعد وتستطيع مثلا استخدامها اذا اردت من المستخدم تحديد تاريخ مستقبلي مثلاً.
  • التطبيق :
    https://github.com/ahmedoid/Hijri
  • ختاماً :
    اتمنى اني وفقت في ايصال المعلومة بشكل بسيط وسلس وان شاء الله القادم افضل
كلمات دليلية:
0
إعجاب
3458
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (2)

ghamdikar:

موضوع ممتاز جدا

ولكن كيف نستطيع ان نجعل التقويم الهجري بدلا من التقويم الميلادي عند الضغط على datepicker 

شكرا لك

Mohammad Laif:

مقال رائع وشرح ممتاز, تتشكر عليه.

دائماً كان التعامل مع التاريخ برمجياً اصعب من التعامل مع ورقة امتحان الرياضات بالنسبه لي ?. فالحمد لله على هذه المكتبه الرائعه.

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !