# Native Code > برنامه نویسی موبایل > Android Studio >  کار بار تاریخ شمسی و میلادی در جاوا (اندروید)

## persiancoders.com

استفاده از تاریخ شمسی و تبدیل تاریخ میلادی به شمسی و بالعکس یکی از مهمترین بخش های برنامه های فارسی زبان است .
در این پست ۳ کلاس قرار خواهم داد که در مجموع با استفاده از آن ها می  توانید به راحتی تاریخ میلادی را به شمسی و بالعکس تبدیل کرده و 
همچنین اعمالی از قبیل نمایش روز و ماه به صورت متنی (مثلا دوم آبان ماه) ،  روی آن انجام دهید و در پروژه هایی که با جاوا می نویسید استفاده نمایید.
 یک پکیج در پروژه خود ایجاد کنید (مثلا Date )  و کلاس های پیوست شده را داخل آن قرار دهید.(ShamsiCalendar وShamsiCalendar و ChangeDate):
Date.rar

حال در هرجای پروژه که نیاز داشته باشید ، می توانید تاریخ را تبدیل کرده  یا اعمالی روی آن انجام دهید .در ادامه مثال هایی برای بیش از ۱۵ تابع  موجود در این کلاس ها بهمراه نتیجه ی اجرای آن ها ذکر خواهد شد . شما نیز  می توانید از توابع ShamsiCalendar و FDate که در مثال زیر موجود نیست ،  استفاده نمایید.
import Date.ChangeDate;
import Date.FDate;


/**
 * Created by Hamed on 06/03/2015.
 */

public class Home {
    public static void main(String[] args) {
        System.out.println("Current Date :   "+ ChangeDate.getCurrentDate());
        System.out.println("Shamsi To Miladi :   "+ ChangeDate.changeFarsiToMiladi("1393/12/15"));
        System.out.println("Mildai To Shamsi :   "+ ChangeDate.changeMiladiToFarsi("2015/03/07"));
        System.out.println("kam kardane tedadi saal az tarikhe fe'li :   "+ ChangeDate.decreaseCurrentYear(3));
        System.out.println("kam kardane tedadi saal az tarikhe Morede Nazar :   "+ ChangeDate.decreaseYear("1390/12/15", 3));
        System.out.println("Afzayesh e saal :   "+ ChangeDate.increaseCurrentYear(2));
        System.out.println("Afzayesh e saal (tarikhe entekhabi) :   "+ ChangeDate.increaseYear("1390/12/15",2));
        System.out.println("Date and Time :   "+ ChangeDate.getCurrentDateTimeString());
        System.out.println("Time :   "+ ChangeDate.getCurrentTime());
        System.out.println("Rooze Jaari :   "+ ChangeDate.getCurrentDay());
        System.out.println("Maahe Jaari :   "+ ChangeDate.getCurrentMonth());
        System.out.println("Saale Jaari :   "+ ChangeDate.getCurrentYear());
        System.out.println("tarikhe shamsi be horoof :   "+ ChangeDate.getDayMounthYear());  // Ba vorood be getDayMounthYear mitavanid dastoorate daryaafte naam rooz o maah ra moshahede konid
        System.out.println("Invert :   "+ ChangeDate.invertDate("1393/12/15"));
        FDate fdate = new FDate(System.currentTimeMillis());
        fdate.minusDay(5);
        System.out.println("Minus5 day :   "+ fdate);
        fdate.plusDay(8);
        System.out.println("Plus 8 day :   "+ fdate);


    }
}
نتیجه ی اجرای کد بالا ، بصورت زیر خواهد بود :
Current Date :   1393/12/15
Shamsi To Miladi :   2015/03/06
Mildai To Shamsi :   1393/12/16
kam kardane tedadi saal az tarikhe fe'li :   1390/12/15
kam kardane tedadi saal az tarikhe Morede Nazar :   1387/12/15
Afzayesh e saal :   1395/12/15
Afzayesh e saal (tarikhe entekhabi) :   1392/12/15
Date and Time :   1393/12/15 19:59:17
Time :   19:59:17
Rooze Jaari :   15
Maahe Jaari :   12
Saale Jaari :   1393
tarikhe shamsi be horoof :   جمعه پانزدهم اسفند ماه 1393
Invert :   15/12/1393
Minus5 day :   1393/12/10
Plus 8 day :   1393/12/18

----------


## persiancoders.com

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

ابتدا یک textview بر روی صفحه xml با آی دی MyDate ایجاد می کنیم :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/MyDate"/>
</LinearLayout>

کلاس های مورد نظر را در پکیجی به نام Date درون پروژه قرار می دهیم :

حال در کلاس MainActivity شئ مربوط به متن (Textview) را تعریف کرده و متن داخل آن را برابر تاریخ امروز قرار می دهیم :
   TextView tv = (TextView) findViewById(R.id.MyDate);

        tv.setText(ChangeDate.getDayMounthYear()  );


حال می توانید از امکانات کلاس های فوق در برنامه هایتان استفاده کنید یا یک تقویم زیبا و حرفه ای در اندروید بسازید .

----------


## dasssnj

*تاپیک به بخش اندروید انتقال پیدا کرد .* *(قابل دسترسی در هر دو بخش جاوا و اندروید)*

----------


## storm_saeed

یه توصیه بهتون بکنم
کلا از کلاس های کار با تاریخ خود جاوا استفاده نکنید به شدت کتابخونه های بدیه از Joda-Time استفاده کنید

----------


## mohsen.hex

عالی بوووووود

----------


## rezasa341

با سلام در لینک زیر کامپوننتی DatePicker shamsi وجود دارد که میتوان به  پروژه java , Netbeans اضافه نمود و در پروژه ها به راحتی از آن استفاده  کرد :چشمک:  :تشویق:  :تشویق: 

http://sunfile.sellfile.ir/prod-4207...+Netbeans.html

----------


## Muhammad-Ali

> استفاده از تاریخ شمسی و تبدیل تاریخ میلادی به شمسی و بالعکس یکی از مهمترین بخش های برنامه های فارسی زبان است .
> در این پست ۳ کلاس قرار خواهم داد که در مجموع با استفاده از آن ها می  توانید به راحتی تاریخ میلادی را به شمسی و بالعکس تبدیل کرده و 
> همچنین اعمالی از قبیل نمایش روز و ماه به صورت متنی (مثلا دوم آبان ماه) ،  روی آن انجام دهید و در پروژه هایی که با جاوا می نویسید استفاده نمایید.
>  یک پکیج در پروژه خود ایجاد کنید (مثلا Date )  و کلاس های پیوست شده را داخل آن قرار دهید.(ShamsiCalendar وShamsiCalendar و ChangeDate):
> Date.rar
> 
> حال در هرجای پروژه که نیاز داشته باشید ، می توانید تاریخ را تبدیل کرده  یا اعمالی روی آن انجام دهید .در ادامه مثال هایی برای بیش از ۱۵ تابع  موجود در این کلاس ها بهمراه نتیجه ی اجرای آن ها ذکر خواهد شد . شما نیز  می توانید از توابع ShamsiCalendar و FDate که در مثال زیر موجود نیست ،  استفاده نمایید.
> import Date.ChangeDate;
> import Date.FDate;
> ...


سلام
متاسفانه موقع تاریخ میلادی به شمسی یک روز کم میکنه. دارم میگردم ببینم مشکل کجاست ولی هنوز پیدا نکردم.
یک کلاس بدون مشکل سراغ ندارید؟ چندتا کلاس استفاده کردم اما همشان مشکل داشتند. یکی تو شمسی مشکل داره یکی تو میلادی و . . .  :متفکر:

----------


## Muhammad-Ali

فعلا متد
*public static* String miladiToShamsi_persiancoders_com(Date miDate){
*int* btw;
  btw=(*int*)_miBetween_(miDate,*MI_ORIGIN_DATE*);
*return* _plusDay_(*SH_ORIGIN_DATE*,btw+1);
}
رو دستکاری کردم و به btw یدونه اضافه کردم. تا ببینیم بعد چی میشه.

----------


## hedayatix

> سلام
> متاسفانه موقع تاریخ میلادی به شمسی یک روز کم میکنه. دارم میگردم ببینم مشکل کجاست ولی هنوز پیدا نکردم.
> یک کلاس بدون مشکل سراغ ندارید؟ چندتا کلاس استفاده کردم اما همشان مشکل داشتند. یکی تو شمسی مشکل داره یکی تو میلادی و . . .





دقیق متوجه نشدم یعنی الان تاریخ امروز رو اشتباه محاسبه می کنه؟ معمولا 4 سال در میون در سال های کبیسه یک روز اختلاف بین روزهای شمسی و میلادی وجود داره، شاید مشکل همینه؟

----------


## Muhammad-Ali

> دقیق متوجه نشدم یعنی الان تاریخ امروز رو اشتباه محاسبه می کنه؟ معمولا 4 سال در میون در سال های کبیسه یک روز اختلاف بین روزهای شمسی و میلادی وجود داره، شاید مشکل همینه؟


آره، موقع تبدیل میلادی به شمسی یک روز کم می کنه.
خیلی از کلاسها رو بررسی کردم، اما هر کدام مشکلاتی داشتند. این کلاس کاربردش خیلی خوبه. فقط همین مشکلش حل بشه عالی میشه.

----------


## persiancoders.com

سر یه مسئله ای داشتم از این کلاس استفاده میکردم من هم به همین مشکل برخوردم
درحال حاضر اینجوری حل شد :
این کد رو به خط 809 فایل ShamsiCalendar اضافه کنید:
miDate = DateUtils.addHours(miDate, 1);

یعنی خطوط 808 تا 813 به این شکل خواهد شد (متد miladiToShamsi )
public static String miladiToShamsi(Date miDate) {
    miDate = DateUtils.addHours(miDate, 1);
    int btw;
    btw = (int) miBetween(miDate, MI_ORIGIN_DATE);
    return plusDay(SH_ORIGIN_DATE, btw);
}

----------


## moottii

کاربران جاوا میتونن از این library استفاده کنند. Immutable هست و API مشابه با Date and Time در جاوا 8 داره:
https://github.com/mfathi91/persian-date-time

----------


## babaweb

خیلی ممنون عالی بود دست مریزاد

----------


## ehsancoyg

:لبخند گشاده!:  :لبخند گشاده!: 


> استفاده از تاریخ شمسی و تبدیل تاریخ میلادی به شمسی و بالعکس یکی از مهمترین بخش های برنامه های فارسی زبان است .
> در این پست ۳ کلاس قرار خواهم داد که در مجموع با استفاده از آن ها می  توانید به راحتی تاریخ میلادی را به شمسی و بالعکس تبدیل کرده و 
> همچنین اعمالی از قبیل نمایش روز و ماه به صورت متنی (مثلا دوم آبان ماه) ،  روی آن انجام دهید و در پروژه هایی که با جاوا می نویسید استفاده نمایید.
>  یک پکیج در پروژه خود ایجاد کنید (مثلا Date )  و کلاس های پیوست شده را داخل آن قرار دهید.(ShamsiCalendar وShamsiCalendar و ChangeDate):
> Date.rar
> 
> حال در هرجای پروژه که نیاز داشته باشید ، می توانید تاریخ را تبدیل کرده  یا اعمالی روی آن انجام دهید .در ادامه مثال هایی برای بیش از ۱۵ تابع  موجود در این کلاس ها بهمراه نتیجه ی اجرای آن ها ذکر خواهد شد . شما نیز  می توانید از توابع ShamsiCalendar و FDate که در مثال زیر موجود نیست ،  استفاده نمایید.
> import Date.ChangeDate;
> import Date.FDate;
> ...

----------


## AliBalali

من میخوام تاریخی رو ارسال کنم و معادل تاریخ شمسی به حروف رو دریافت کنم . راهنمایی میفرمائید ؟

----------


## AliBalali

من خودم این کار رو با دستکاری در کد های کلاس changeDate انچام دادم . اگه کسی لازم داشت میتونه استفاده کنه

ChangeDate.rar

تنها تغییر اینه که برای هر فراخوانی باید یک String از تاریخی که میخواهید رو ارسال کنید و اگه تاریخ فعلی رو میخواهید باید null رو ارسال کنید .


ChangeDate.getDayMounthYear("1397/06/12");    /// دوشنبه دوازدهم شهریور ماه 1397
ChangeDate.getDayMounthYear(null);    /// اطلاعات روز جاری را برمی گرداند 

  *برای مثال من یک for تعریف کردم که یک ماه رو برام برمیگردونه* 



 if (MONTH<=6) first_half = 31 ;     // getMONTH from the user or database or ...
else first_half= 30 ;

for(int i=1; i<=first_half;i++)
{
String my Date = YEAR+"/"+changeDate.zero(MONTH)+"/"+ChangeDate.zero(i);   // get Year from the user or detabase or ...
Log.i("Date",ChangeDate.getDayMonthYear(myDate));
}

first_half رو گذاشتم و قبلش باید بهش گفتم که اگه در شش ماهه اول سال بودی مقدار 31 رو برگردون وگرنه 30 ؛ البته برای اسفند که سال کبیسه باشه یا نه کدی ننوشتم و فقط میخواستم کاربرد تغییراتم در کلاس رو با مثال توضیح بدم.
در خط بعدی تاریخی  که ممکنه از کاربر یا از سشن ها و یا از دیتا بیس گرفتم رو به رشته تبدیل میکنیم تا در تابع استفاده کنیم . ولی همونطور که میبینید یه تابع دیگه به نام zero فراخوانی شده که برای این هستش که اگه روز یا ماه کمتر از 10 باشه به صورت تک رقمی وارد تاریخ میشه که باید یک صفر قبلش وارد بشه و دو رقمی باشه مثلا 6 میشه 06

----------

