رفتن به مطلب
  • 0

استفاده از کد تبدیل میلادی به هجری (جاوا) در b4a


hojjatborohan

سوال

کسی میتونه این کد رو به کتابخانه تبدیل کنه یا ازش توی b4a از طریق javaobject  استفاده کنه اگه کسی میتونه لطفا کمک کنه

import java.util.Calendar;
/**
 * Gregorian-Hijri Dates Converter
 * 
 * 
 * This Code is used to convert Gregorian dates to Hijri Dates 
 * 
 *
 */
 
public class DateHigri {
     
     
    static double gmod(double n,double  m) {
        return ((n % m) + m) % m;
    }
 
    static double[] kuwaiticalendar(boolean adjust) {
        Calendar today = Calendar.getInstance();
        int adj=0;
        if(adjust){
            adj=0;
        }else{
            adj=1;
        }
         
        if (adjust) {
            int adjustmili = 1000 * 60 * 60 * 24 * adj;
            long todaymili = today.getTimeInMillis() + adjustmili;
            today.setTimeInMillis(todaymili);
        }
        double day = today.get(Calendar.DAY_OF_MONTH);
        double  month = today.get(Calendar.MONTH);
        double  year = today.get(Calendar.YEAR);
         
        double  m = month + 1;
        double  y = year;
        if (m < 3) {
            y -= 1;
            m += 12;
        }
 
        double a = Math.floor(y / 100.);
        double b = 2 - a + Math.floor(a / 4.);
     
        if (y < 1583)
            b = 0;
        if (y == 1582) {
            if (m > 10)
                b = -10;
            if (m == 10) {
                b = 0;
                if (day > 4)
                    b = -10;
            }
        }
 
        double jd = Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + day
                + b - 1524;
         
        b = 0;
        if (jd > 2299160) {
            a = Math.floor((jd - 1867216.25) / 36524.25);
            b = 1 + a - Math.floor(a / 4.);
        }
        double bb = jd + b + 1524;
        double cc = Math.floor((bb - 122.1) / 365.25);
        double dd = Math.floor(365.25 * cc);
        double ee = Math.floor((bb - dd) / 30.6001);
        day = (bb - dd) - Math.floor(30.6001 * ee);
        month = ee - 1;
        if (ee > 13) {
            cc += 1;
            month = ee - 13;
        }
        year = cc - 4716;
 
        double wd = gmod(jd + 1, 7) + 1;
 
        double iyear = 10631. / 30.;
        double epochastro = 1948084;
        double epochcivil = 1948085;
 
        double shift1 = 8.01 / 60.;
 
        double z = jd - epochastro;
        double cyc = Math.floor(z / 10631.);
        z = z - 10631 * cyc;
        double j = Math.floor((z - shift1) / iyear);
        double iy = 30 * cyc + j;
        z = z - Math.floor(j * iyear + shift1);
        double im = Math.floor((z + 28.5001) / 29.5);
        if (im == 13)
            im = 12;
        double id = z - Math.floor(29.5001 * im - 29);
 
        double[]  myRes = new double[8];
 
        myRes[0] = day; // calculated day (CE)
        myRes[1] = month - 1; // calculated month (CE)
        myRes[2] = year; // calculated year (CE)
        myRes[3] = jd - 1; // julian day number
        myRes[4] = wd - 1; // weekday number
        myRes[5] = id; // islamic date
        myRes[6] = im - 1; // islamic month
        myRes[7] = iy; // islamic year
 
        return myRes;
    }
    static String writeIslamicDate() {
        String[] wdNames = {"Ahad", "Ithnin", "Thulatha", "Arbaa", "Khams",
                "Jumuah", "Sabt"};
        String[] iMonthNames = {"Muharram", "Safar", "Rabi'ul Awwal",
                "Rabi'ul Akhir", "Jumadal Ula", "Jumadal Akhira", "Rajab",
                "Sha'ban", "Ramadan", "Shawwal", "Dhul Qa'ada", "Dhul Hijja"};
        // This Value is used to give the correct day +- 1 day
        boolean dayTest=true;
        double[] iDate = kuwaiticalendar(dayTest);
        String outputIslamicDate = wdNames[(int) iDate[4]] + ", " + iDate[5] + " "
                + iMonthNames[(int) iDate[6]] + " " + iDate[7] + " AH";
         
        return outputIslamicDate;
    }
}

 

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

11 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

سلام

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

 

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

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

 

کتابخانه  manampersiandateultimate یک روز عقب تر نمایش میده و اینکه اخر ماه رو 00 نشون میده

کتابخانه ی hijriconverter هم یک روز جلوتر میزنه و اگه بخوام -1 کنم باماه تداخل میندازه

 

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

برای بالا آوردن تاپیک از به روز رسانی استفاده کنید دوست عزیز.:areuok:

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

AnswerCenterHigriDate.zip

دریافت فایل

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

خوب اگه دو روز جلوتره به چه کاری میاد؟

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

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

آقای شاهپیری عزیز دستتان درد نکنه ، واقعا عالیه :Laie_60B:

در 2 ساعت قبل، hojjatborohan گفته است :

خوب اگه دو روز جلوتره به چه کاری میاد؟

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

در تقویم قمری واقعا این مشکل برای همه هست حتی دقت کنید تقویمی همچون باد صبا هم درماه مبارک رمضان همین مشکل رو داره واونو بصورت توصیه کاربران به اتصال به اینترنت ورفعش بصورت آنلاین و... مرتفع میکنه

 

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

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

 

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

 

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

 

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

2_Ghamari-Shamsi-Miladi_Converter.rar

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

سلام ممنونم از پاسختون 

اما مشکل فقط برای این نیست ک 1 روز عقب افتاده ماه رمضان!!!کلا تاریخ هم اگه درست باشه کار نمیکنه مثلا از 27 شوال یهو میره روی 29 شوال این مشکل توی کتابخانه hijriconverter و توی manam persian date ultimate این مشکل هست ک کلا 1 یا 2 روز عقب جلو میزنه و توی بعضی از ماه ها بجای 30 میزنه 00!!!!

 

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

در 5 ساعت قبل، hojjatborohan گفته است :

سلام ممنونم از پاسختون 

اما مشکل فقط برای این نیست ک 1 روز عقب افتاده ماه رمضان!!!کلا تاریخ هم اگه درست باشه کار نمیکنه مثلا از 27 شوال یهو میره روی 29 شوال این مشکل توی کتابخانه hijriconverter و توی manam persian date ultimate این مشکل هست ک کلا 1 یا 2 روز عقب جلو میزنه و توی بعضی از ماه ها بجای 30 میزنه 00!!!!

 

سلام خواهش میکنم

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

 

ولی در کل فرمول تبدیل میلادی به قمری وشمسی را که بصورت برنامه ای آماده در فایل php   در پست قبلی ضمیمه شد را می توانیدبجای آن استفاده کرده و خودتان از صفر برنامه یا کتابخانه ای بی عیب ونقص هایی که شمرده اید طراحی واستفاده نمایید، این فرمولهای داخل فایل php   برای سایت  http://123.scr.ir/  هست که سایت شناخته شده ای دراینخصوص هست وکدهایش به  سهولت بسیار قابل تبدیل به کدهای B4A هست . 

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

<?php

/**
*Convert Georgian to Ghamari date
*نویسنده: ناشناس Edit: 123.scr.ir
*تبديل تاريخ  ميلادي به هجري قمري
*/
function gregorian_to_ghamari($year,$month,$day,$mod=''){
 if($year > 1582 or ($year==1581 and $month > 9 and $day > 14)){
	$int1=(int)(($month-14)/12);
	$jd=(int)((1461*($year+4800+$int1))/4)+(int)((367*($month-2-(12*($int1))))/12)-(int)((3*((int)(($year+4900+$int1)/100)))/4)+$day-32075;
 }else{
	$jd=(367*$year)-(int)((7*($year+5001+(int)(($month-9)/7)))/4)+(int)((275*$month)/9)+$day+1729777;
 }
 $l=$jd-1948440+10632;
 $n=(int)(($l-1)/10631);
 $l=$l-10631*$n+354;
 $j=(((int)((10985-$l)/5316))*((int)((50*$l)/17719)))+(((int)($l/5670))*((int)((43*$l)/15238)));
 $l=$l-((int)((30-$j)/15))*((int)((17719*$j)/50))-((int)($j/16))*((int)((15238*$j)/43))+29;
 $month=(int)((24*$l)/709);
 $day=$l-(int)((709*$month)/24);
 $year=(30*$n)+$j-30;
 return($mod=='')?array($year,$month,$day):$year.$mod.$month.$mod.$day;
}

/**
*Convert Ghamari to Georgian date
*نویسنده: ناشناس Edit: 123.scr.ir
*تبديل تاريخ  هجري قمري به ميلادي
*/
function ghamari_to_gregorian($year,$month,$day,$mod=''){
 $jd=(int)(((11*$year)+3)/30)+(354*$year)+(30*$month)-(int)(($month-1)/2)+$day+1948440-385;
 if($jd > 2299160){
	$l=$jd+68569;
	$n=(int)((4*$l)/146097);
	$l=$l-(int)((146097*$n+3)/4);
	$i=(int)((4000*($l+1))/1461001);
	$l=$l-(int)((1461*$i)/4)+31;
	$j=(int)((80*$l)/2447);
	$day=$l-(int)((2447*$j)/80);
	$l=(int)($j/11);
	$month=$j+2-(12*$l);
	$year=(100*($n-49))+$i+$l;
 }else{
	$j=$jd+1402;
	$k=(int)(($j-1)/1461);
	$l=$j-(1461*$k);
	$n=(int)(($l-1)/365)-(int)($l/1461);
	$i=$l-(365*$n)+30;
	$j=(int)((80*$i)/2447);
	$day=$i-(int)((2447*$j)/80);
	$i=(int)($j/11);
	$month=$j+2-(12*$i);
	$year=(4*$k)+$n+$i-4716;
 }
 return($mod=='')?array($year,$month,$day):$year.$mod.$month.$mod.$day;
}

?>

 

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

در 7 ساعت قبل، hojjatborohan گفته است :

چک کردم درست کار میکنه اما باید یکی تبدیلش کنه به کد های b4a

دستور (int) در اینجا یعنی تبدیل به عدد صحیح ،یعنی عدد داخل پارنتز که بعدش هست رو کلا به عدد صحیح تبدیل میکنه، غیر از اون هم دستوری ظاهرا نیست که به B4A تبدیل بشه !وتقریبا عینا توی سورس  b4a قرار داده میشه

در دستور شرطی هم بجای then  از } استفاده کرده که بعد از ذکر شرط جایگزین کنید ، بجای End if هم در php از  { استفاده میشه  

array هم همان آرایه خودمونه! میگه سه مقدار توسط function یعنی تابع  بگیر وعملیات های جمع وتفریق وضرب وتقسیم رو روی اون اعمال کن و پاسخ اونو بصورت آرایه بازگردان.

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

بایگانی شده

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

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...