PDA

View Full Version : کار بار تاریخ شمسی و میلادی در جاوا (اندروید)



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

حال در هرجای پروژه که نیاز داشته باشید ، می توانید تاریخ را تبدیل کرده یا اعمالی روی آن انجام دهید .در ادامه مثال هایی برای بیش از ۱۵ تابع موجود در این کلاس ها بهمراه نتیجه ی اجرای آن ها ذکر خواهد شد . شما نیز می توانید از توابع 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
پنج شنبه 28 اسفند 1393, 12:22 عصر
در این پست کوتاه می خواهیم تاریخ روز را با استفاده از پست بالا به شمسی نمایش دهیم .

ابتدا یک 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 درون پروژه قرار می دهیم :

http://persiancoders.com/wp-content/uploads/date_package.jpg
حال در کلاس MainActivity شئ مربوط به متن (Textview) را تعریف کرده و متن داخل آن را برابر تاریخ امروز قرار می دهیم :

TextView tv = (TextView) findViewById(R.id.MyDate);

tv.setText(ChangeDate.getDayMounthYear() );


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

dasssnj
پنج شنبه 28 اسفند 1393, 16:46 عصر
تاپیک به بخش اندروید انتقال پیدا کرد . (قابل دسترسی در هر دو بخش جاوا و اندروید)

storm_saeed
پنج شنبه 28 اسفند 1393, 20:15 عصر
یه توصیه بهتون بکنم
کلا از کلاس های کار با تاریخ خود جاوا استفاده نکنید به شدت کتابخونه های بدیه از Joda-Time (http://www.joda.org/joda-time/) استفاده کنید

mohsen.hex
شنبه 24 بهمن 1394, 12:06 عصر
عالی بوووووود

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

http://sunfile.sellfile.ir/prod-420701-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA+% D8%AA%D9%82%D9%88%DB%8C%D9%85+%D9%81%D8%A7%D8%B1%D 8%B3%DB%8C+%D8%B4%D9%85%D8%B3%DB%8C+DatePicker+%D8 %AF%D8%B1+%D8%AC%D8%A7%D9%88%D8%A7+java+Netbeans.h tml

Muhammad-Ali
چهارشنبه 19 خرداد 1395, 15:23 عصر
استفاده از تاریخ شمسی و تبدیل تاریخ میلادی به شمسی و بالعکس یکی از مهمترین بخش های برنامه های فارسی زبان است .
در این پست ۳ کلاس قرار خواهم داد که در مجموع با استفاده از آن ها می توانید به راحتی تاریخ میلادی را به شمسی و بالعکس تبدیل کرده و
همچنین اعمالی از قبیل نمایش روز و ماه به صورت متنی (مثلا دوم آبان ماه) ، روی آن انجام دهید و در پروژه هایی که با جاوا می نویسید استفاده نمایید.
یک پکیج در پروژه خود ایجاد کنید (مثلا Date ) و کلاس های پیوست شده را داخل آن قرار دهید.(ShamsiCalendar وShamsiCalendar و ChangeDate):
129586

حال در هرجای پروژه که نیاز داشته باشید ، می توانید تاریخ را تبدیل کرده یا اعمالی روی آن انجام دهید .در ادامه مثال هایی برای بیش از ۱۵ تابع موجود در این کلاس ها بهمراه نتیجه ی اجرای آن ها ذکر خواهد شد . شما نیز می توانید از توابع 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
سلام
متاسفانه موقع تاریخ میلادی به شمسی یک روز کم میکنه. دارم میگردم ببینم مشکل کجاست ولی هنوز پیدا نکردم.
یک کلاس بدون مشکل سراغ ندارید؟ چندتا کلاس استفاده کردم اما همشان مشکل داشتند. یکی تو شمسی مشکل داره یکی تو میلادی و . . . :متفکر:

Muhammad-Ali
چهارشنبه 19 خرداد 1395, 16:38 عصر
فعلا متد

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
پنج شنبه 20 خرداد 1395, 00:15 صبح
سلام
متاسفانه موقع تاریخ میلادی به شمسی یک روز کم میکنه. دارم میگردم ببینم مشکل کجاست ولی هنوز پیدا نکردم.
یک کلاس بدون مشکل سراغ ندارید؟ چندتا کلاس استفاده کردم اما همشان مشکل داشتند. یکی تو شمسی مشکل داره یکی تو میلادی و . . . :متفکر:




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

Muhammad-Ali
یک شنبه 23 خرداد 1395, 13:40 عصر
دقیق متوجه نشدم یعنی الان تاریخ امروز رو اشتباه محاسبه می کنه؟ معمولا 4 سال در میون در سال های کبیسه یک روز اختلاف بین روزهای شمسی و میلادی وجود داره، شاید مشکل همینه؟
آره، موقع تبدیل میلادی به شمسی یک روز کم می کنه.
خیلی از کلاسها رو بررسی کردم، اما هر کدام مشکلاتی داشتند. این کلاس کاربردش خیلی خوبه. فقط همین مشکلش حل بشه عالی میشه.

persiancoders.com
شنبه 02 اردیبهشت 1396, 17:13 عصر
سر یه مسئله ای داشتم از این کلاس استفاده میکردم من هم به همین مشکل برخوردم
درحال حاضر اینجوری حل شد :
این کد رو به خط 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
پنج شنبه 02 آذر 1396, 11:56 صبح
کاربران جاوا میتونن از این library استفاده کنند. Immutable هست و API مشابه با Date and Time در جاوا 8 داره:
https://github.com/mfathi91/persian-date-time

babaweb
جمعه 06 بهمن 1396, 01:39 صبح
خیلی ممنون عالی بود دست مریزاد

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

حال در هرجای پروژه که نیاز داشته باشید ، می توانید تاریخ را تبدیل کرده یا اعمالی روی آن انجام دهید .در ادامه مثال هایی برای بیش از ۱۵ تابع موجود در این کلاس ها بهمراه نتیجه ی اجرای آن ها ذکر خواهد شد . شما نیز می توانید از توابع 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

AliBalali
یک شنبه 11 شهریور 1397, 01:20 صبح
من میخوام تاریخی رو ارسال کنم و معادل تاریخ شمسی به حروف رو دریافت کنم . راهنمایی میفرمائید ؟

AliBalali
دوشنبه 12 شهریور 1397, 21:23 عصر
من خودم این کار رو با دستکاری در کد های کلاس changeDate انچام دادم . اگه کسی لازم داشت میتونه استفاده کنه

148807

تنها تغییر اینه که برای هر فراخوانی باید یک 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