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

لا يخفى علينا جميعا أن التاريخ الهجري هو التاريخ المعتمد والرسمي في تعاملاتنا الحكومية وهو بداية هجرة النبي صلى الله عليه وسلم وقد نحتاج لاضافته في احد مشاريعنا لتحديد المواعيد أو شي اخر.
ولكن لايوجد دعم رسمي للتاريخ الهجري في جافا القديمة ولكن تم ذلك في الإصدار الثامن الذي لم يعتمد في الاندرويد الا لبعض ال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
    الشفرة البرمجية الخاصة بالواجهه :

    <?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, 0, 0, 0);
            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, 0, DateTimeZone.forID("Europe/Berlin"));
    

    – التحقق من هل التاريخ قبل او بعد التاريخ الحالي :
    توجد دالة تدعى isBefore وهي للتاكد هل التاريخ هذا قبل ام بعد وتستطيع مثلا استخدامها اذا اردت من المستخدم تحديد تاريخ مستقبلي مثلاً.

  • التطبيق :
    https://github.com/ahmedoid/Hijri
  • ختاماً :
    اتمنى اني وفقت في ايصال المعلومة بشكل بسيط وسلس وان شاء الله القادم افضل ?❤️.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

4 أفكار عن “استخدام مكتبة JodaTime للتعامل مع التاريخ الهجري”

  1. نسيت تضيف شغلة هنا

    تحويل التواريخ :
    – من ميلادي الى هجري :

    DateTime date = new DateTime(year, monthOfYear + 1, dayOfMonth, 0, 0, 0);
    DateTime dtIslamic = date.withChronology(IslamicChronology.getInstance());
    result.setText(dtIslamic.toString(“E dd MMMM yyyy G”));
    1
    2
    3
    DateTime date = new DateTime(year, monthOfYear + 1, dayOfMonth, 0, 0, 0);
    DateTime dtIslamic = date.withChronology(IslamicChronology.getInstance());
    result.setText(dtIslamic.toString(“E dd MMMM yyyy G”));
    – من هجري الى ميلادي :
    بعض التلميحات لاستخدام JodaTime :

    اللي هي من هجري الى ميلادي