Farzad Sarseifi

تبدیل تاریخ شمسی به میلادی و بالعکس در جاوا

8 ارسال در این موضوع قرار دارد

در این پست آموزشی قصد داریم نحوه تبدیلات تاریخ(شمسی،میلادی) را مورد بررسی قرار دهیم تا بتوانیم این امکان را در پیاده سازی نماییم.

برای اینکار یک کلاسی را استفاده میکنیم که مدیر وب سایت kamyarns آن را ایجاد کرده است و قصد داریم در این آموزش نحوه استفاده از این کلاس را آموزش دهیم

از طریق لینک زیر نیز میتوانید به کد دسترسی پیدا کنید

https://github.com/dc0d/Roozh/blob/master/Java/src/roozh/main/Roozh.java
 

ابتد کد زیر را به عنوان یک کلاس ( Class ) وارد پروژه خود کنید:

 



public class Roozh {

    private int day, month, year;

    private int jY, jM, jD;

    private int gY, gM, gD;

    private int leap, march;

    /**

     * Calculates the Julian Day number (JG2JD) from Gregorian or Julian

     * calendar dates. This integer number corresponds to the noon of the date

     * (i.e. 12 hours of Universal Time). The procedure was tested to be good

     * since 1 March, -100100 (of both the calendars) up to a few millions

     * (10**6) years into the future. The algorithm is based on D.A. Hatcher,

     * Q.Jl.R.Astron.Soc. 25(1984), 53-55 slightly modified by me (K.M.

     * Borkowski, Post.Astron. 25(1987), 275-279).

     *

     * @param year

     *            int

     * @param month

     *            int

     * @param day

     *            int

     * @param J1G0

     *            to be set to 1 for Julian and to 0 for Gregorian calendar

     * @return Julian Day number

     */

    private int JG2JD(int year, int month, int day, int J1G0) {

        int jd = (1461 * (year + 4800 + (month - 14) / 12)) / 4

                + (367 * (month - 2 - 12 * ((month - 14) / 12))) / 12

                - (3 * ((year + 4900 + (month - 14) / 12) / 100)) / 4 + day

                - 32075;

        if (J1G0 == 0)

            jd = jd - (year + 100100 + (month - 8) / 6) / 100 * 3 / 4 + 752;

        return jd;

    }

    /**

     * Calculates Gregorian and Julian calendar dates from the Julian Day number

     * (JD) for the period since JD=-34839655 (i.e. the year -100100 of both the

     * calendars) to some millions (10**6) years ahead of the present. The

     * algorithm is based on D.A. Hatcher, Q.Jl.R.Astron.Soc. 25(1984), 53-55

     * slightly modified by me (K.M. Borkowski, Post.Astron. 25(1987), 275-279).

     *

     * @param JD

     *            Julian day number as int

     * @param J1G0

     *            to be set to 1 for Julian and to 0 for Gregorian calendar

     */

    private void JD2JG(int JD, int J1G0) {

        int i, j;

        j = 4 * JD + 139361631;

        if (J1G0 == 0) {

            j = j + (4 * JD + 183187720) / 146097 * 3 / 4 * 4 - 3908;

        }

        i = (j % 1461) / 4 * 5 + 308;

        gD = (i % 153) / 5 + 1;

        gM = ((i / 153) % 12) + 1;

        gY = j / 1461 - 100100 + (8 - gM) / 6;

    }

    /**

     * Converts the Julian Day number to a date in the Jalali calendar

     *

     * @param JDN

     *            the Julian Day number

     */

    private void JD2Jal(int JDN) {

        JD2JG(JDN, 0);

        jY = gY - 621;

        JalCal(jY);

        int JDN1F = JG2JD(gY, 3, march, 0);

        int k = JDN - JDN1F;

        if (k >= 0) {

            if (k <= 185) {

                jM = 1 + k / 31;

                jD = (k % 31) + 1;

                return;

            } else {

                k = k - 186;

            }

        } else {

            jY = jY - 1;

            k = k + 179;

            if (leap == 1)

                k = k + 1;

        }

        jM = 7 + k / 30;

        jD = (k % 30) + 1;

    }

    /**

     * Converts a date of the Jalali calendar to the Julian Day Number

     *

     * @param Jy

     *            Jalali year as int

     * @param Jm

     *            Jalali month as int

     * @param Jd

     *            Jalali day as int

     * @return Julian day number

     */

    private int Jal2JD(int jY, int jM, int jD) {

        JalCal(jY);

        int jd = JG2JD(gY, 3, march, 1) + (jM - 1) * 31 - jM / 7 * (jM - 7)

                + jD - 1;

        return jd;

    }

    /**

     * This procedure determines if the Jalali (Persian) year is leap (366-day

     * long) or is the common year (365 days), and finds the day in March

     * (Gregorian calendar) of the first day of the Jalali year (jY)

     *

     * @param jY

     *            Jalali calendar year (-61 to 3177)

     */

    private void JalCal(int jY) {

        march = 0;

        leap = 0;

        int[] breaks = { -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,

                1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178 };

        gY = jY + 621;

        int leapJ = -14;

        int jp = breaks[0];

        int jump = 0;

        for (int j = 1; j <= 19; j++) {

            int jm = breaks[j];

            jump = jm - jp;

            if (jY < jm) {

                int N = jY - jp;

                leapJ = leapJ + N / 33 * 8 + (N % 33 + 3) / 4;

                if ((jump % 33) == 4 && (jump - N) == 4)

                    leapJ = leapJ + 1;

                int leapG = (gY / 4) - (gY / 100 + 1) * 3 / 4 - 150;

                march = 20 + leapJ - leapG;

                if ((jump - N) < 6)

                    N = N - jump + (jump + 4) / 33 * 33;

                leap = ((((N + 1) % 33) - 1) % 4);

                if (leap == -1)

                    leap = 4;

                break;

            }

            leapJ = leapJ + jump / 33 * 8 + (jump % 33) / 4;

            jp = jm;

        }

    }

    /**

     * Modified toString() method that represents date string

     *

     * @return Date as String

     */

    @Override

    public String toString() {

        return String.format("%04d-%02d-%02d", getYear(), getMonth(), getDay());

    }

    /**

     * Converts Gregorian date to Persian(Jalali) date

     *

     * @param year

     *            int

     * @param month

     *            int

     * @param day

     *            int

     */

    public void GregorianToPersian(int year, int month, int day) {

        int jd = JG2JD(year, month, day, 0);

        JD2Jal(jd);

        this.year = jY;

        this.month = jM;

        this.day = jD;

    }

    /**

     * Converts Persian(Jalali) date to Gregorian date

     *

     * @param year

     *            int

     * @param month

     *            int

     * @param day

     *            int

     */

    public void PersianToGregorian(int year, int month, int day) {

        int jd = Jal2JD(year, month, day);

        JD2JG(jd, 0);

        this.year = gY;

        this.month = gM;

        this.day = gD;

    }

    /**

     * Get manipulated day

     *

     * @return Day as int

     */

    public int getDay() {

        return day;

    }

    /**

     * Get manipulated month

     *

     * @return Month as int

     */

    public int getMonth() {

        return month;

    }

    /**

     * Get manipulated year

     *

     * @return Year as int

     */

    public int getYear() {

        return year;

    }

}

 

فراخوانی:

1-برای فراخوانی و استفاده از این کلاس کافیست ابتدا از آن یک شی جدید بسازید ، سپس تاریخ ها را وارد نمایید تا خروجی را براساس داده های وارد شده برگرداند.

Roozh jCal = new Roozh();

2- در مرحله بعدی باید تعیین نماییم قصد داریم چه تاریخی را تبدیل نماییم.این کلاس دارای دو تابع بدین صورت میباشد.

1-)تبدیل تاریخ شمسی به میلادی:

jCal.PersianToGregorian(Year,Month,Day);

2-)تبدیل تاریخ میلادی به شمسی:

jCal.GregorianToPersian(m_year, m_Month, m_day);

نکته:مقدار ورودی برای پارامترهای این توابع باید بصورت Int باشد

3-خروجی:

برای نمایش و بدست آوردن خروجی از این کلاس کافیست فقط از دستور زیر استفاده کنید:

jCal.toString();

convertDB.pdf

convertDB.pdf

 

 

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

یک دنیا تشکر استاد، مشکلم حل شد.

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

با سلام من این کار ها را انجام دادم ولی تاریخ ام به صورت در می آید 10-09-622- لطفا راهنمایی فرمایید

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام عالی بود من تازه وارد  این قضایا شدم ممنون که مطالب خوبی گذاشتید.

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام. یه تاریخ شمسی خاص رو چطوری تبدیل میکنید به میلادی؟ کد زیر درست نشون نمیده

pDate.gregorianToPersian(

                    G.currentPdateTime.getYear(),

                    G.currentPdateTime.getMonth(),

                    G.currentPdateTime.getDay());

            Log.e(" ------------ ", pDate.getYear() + " " + pDate.getMonth() + " " + pDate.getDay());

 

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام . ممنون از آموزش خوبتون. من تاریخ  و زمان کنونی سیستم رو تو یک فیلد datetime ذخیره کردم. چطور میشه اینو واسه نمایش به شمسی تبدیل کرد؟

مرسی

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سپاس فراوان بخاطر راهنمایی و اشتراک دانش

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در در 1393/09/07, 11:27:19، mohsen1230 گفته است :

با سلام من این کار ها را انجام دادم ولی تاریخ ام به صورت در می آید 10-09-622- لطفا راهنمایی فرمایید

احتمالا دارید اشتباه split میکنید

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط niloobani
      دوستان به یک برنامه نویس و توسعه دهنده ios و اندروید در یک شرکت معتبر نیاز دارم. لطفا در صورت داشتن شرایط پیام بدید
      http://banijob.com/company/پیشگامان-هوا-و-انرژی/jobs/APP-Developer
    • توسط AliMirzaei
      سلام
      من موقع ران کردن کد در ecilpse با اروری مواجه شدم! ممنون میشم مشکل من را حل کنید!
      مشکل در تصاویر زیر آمده است!
      مدل سیستم+نسخه JDK ,JRE + نسخه ecilpse در تصاویر آمده!
       
       
       





    • توسط b.kordtabar
      چگونه می توان در اپلیکیشن اندروید قابلیت آپ دیت اضافه کرد؟
    • توسط Omid Zakeri
      ویجت یک برنامه ی کوچک و یا یک کنترل از برنامه ی اندروید شما می باشد که در صفحه ی home  قرار گرفته است.  ویجت ها می توانند به راحتی در دسترس باشند، چرا که به شما اجازه می دهند تا برنامه های مورد علاقه ی خود را روی صفحه home قرار دهید تا به سرعت به آنها دسترسی داشته باشید. احتمالا چند ویجت متداول از جمله ویجت موسیقی، آب و هوا و ساعت، را دیده اید.
      ویجت ها می توانند انواع مختلفی داشته باشند از قبیل ویجت اطلاعات، ویجت های مجموعه، ویجت های کنترل و ویجت های چندگانه. اندروید یک چارچوب کامل به ما ارائه می دهد تا ویجت های خود را گسترش دهیم.
       
      Widget - XML file
      برای ایجاد یک ویجت کاربردی، ابتدا چیزی که نیاز دارید، شی Object AppWidgetProviderInfo است که شما در یک فایل XML ویجت جداگانه تعریف می کنید. برای انجام این کار، بر روی پروژه خود راست کلیک کرده و یک پوشه جدید به نام xml ایجاد کنید. حالا روی پوشه تازه ایجاد شده راست کلیک کرده و یک فایل XML جدید ایجاد کنید. نوع منبع فایل XML باید به AppWidgetProvider تنظیم شود. در فایل xml برخی از خواص را به صورت زیر تعریف می کنید:
      <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> Widget - Layout file
      حالا شما باید طرح ویجت خود را در فایل پیش فرض XML خود تعریف کنید. شما می توانید قطعات را برای تولید xml خودکار بکشید.
      Widget - Java file
      پس از تعریف طرح، در حال حاضر یک فایل JAVA جدید ایجاد کنید یا از موجود استفاده کنید و آن را با کلاس AppWidgetProvider گسترش دهید و روش بهروزرسانی آن را به صورت زیر تعریف کنید.
      در روش به روز رسانی، شما باید شیء دو کلاس را که PendingIntent و RemoteViews هستند تعریف کنید. نحو آن :
      PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);  
      Widget - Manifest file
      شما همچنین باید AppWidgetProvider را در فایل manifest خود به شرح زیر اعلام کنید:
      <receiver android:name="ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>  
      MainActivity.java
      package com.example.omidza.myapplication; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; import android.widget.Toast; public class MainActivity extends AppWidgetProvider{ public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { for(int i=0; i<appWidgetIds.length; i++){ int currentWidgetId = appWidgetIds[i]; String url = "http://www.tutorialspoint.com"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse(url)); PendingIntent pending = PendingIntent.getActivity(context, 0,intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main); views.setOnClickPendingIntent(R.id.button, pending); appWidgetManager.updateAppWidget(currentWidgetId,views); Toast.makeText(context, "widget added", Toast.LENGTH_SHORT).show(); } } } res/layout/activity_main.xml
      <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:transitionGroup="true"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:id="@+id/textView" android:layout_centerHorizontal="true" android:textColor="#ff3412ff" android:textSize="35dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Widget" android:id="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="61dp" android:layout_below="@+id/textView" /> </RelativeLayout> res/xml/mywidget.xml.
      <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> AndroidManifest.xml
      <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.omidza.myapplication" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".MainActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/mywidget"></meta-data> </receiver> </application> </manifest>  
    • توسط saeed1366412
      با سلام میخواستم بدون داخل صفحه xml چطوری اعداد به صورت توان دار داخل textview بنویسم 
       

  • دوره آموزشی اندروید ایران کانادا آموزش ویدئویی اندروید آموزش برنامه نویسی اندروید اندروید کاپ دوره آنلاین اندروید کتاب های آموزشی اندروید بسته آموزشی اندروید دوره برنامه نویسی اندروید آموزش Kotlin
  • فایل