انجمن‌های فارس وب

نسخه کامل: تبديل تاريخ شمسي به ميلادي و برعكس در فلش
شما در حال بازدید از بایگانی ارسال های انجمن هستید این نسخه کامل نیست : برای مشاهده نسخه کامل اینجا کلیک کنید
سلام

همينطور كه همه گي مي دونيد تبديل تاريخ شمسي به ميلادي و برعكس هميشه برا ما يه مشكل به حساب مي ياد ممم من يه كد خوب پيدا كردم براتون گذاشتم شايد روزي به كارتون بياد چشمک




class Shamsi {
    function Shamsi() {
    }
    function Divides(a:Number, b:Number):Number {
        return (int(a/b));
    }
    function MiladiToShamsi(YYYY_Miladi:Number, MM_Miladi:Number, DD_Miladi:Number):Array {
        var Month_Miladi:Array = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        var Day_Miladi:Array = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
        var YYYY_Temp_Miladi:Number = int(YYYY_Miladi-1600);
        var Month_Temp_Miladi:Number = int(MM_Miladi-1);
        var Day_Temp_Miladi:Number = int(DD_Miladi-1);
        var DD_Miladi_no:Number = int(int(365)*YYYY_Temp_Miladi+Divides(YY YY_Temp_Miladi+3, 4)-Divides((YYYY_Temp_Miladi+99), 100)+Divides((YYYY_Temp_Miladi+399), 400));
        for (var i = 0; i<Month_Temp_Miladi; ++i) {
            DD_Miladi_no += Month_Miladi[i];
        }
        if (Month_Temp_Miladi>1 && ((YYYY_Temp_Miladi%4 == 0 && YYYY_Temp_Miladi%100 != 0) || (YYYY_Temp_Miladi%400 == 0))) {
            DD_Miladi_no++;
        }
        DD_Miladi_no += Day_Temp_Miladi;
        var Day_Result_Milady:Number = DD_Miladi_no-80-(12-5);
        var Result_Milady:Number = Divides(Day_Result_Milady, 12053);
        Day_Result_Milady = Day_Result_Milady%12053;
        var Year_Result_Milady:Number = 979+33*Result_Milady+4*Divides(Day_Resul t_Milady, 1461);
        Day_Result_Milady %= 1461;
        if (Day_Result_Milady>=366) {
            Year_Result_Milady += Divides(Day_Result_Milady-1, 365);
            Day_Result_Milady = (Day_Result_Milady-1)%365;
        }
        for (var i = 0; i<11 && Day_Result_Milady>=int(Day_Miladi[i]); ++i) {
            Day_Result_Milady -= Day_Miladi[i];
        }
        var Month_Result_Milady:Number = i+1;
        var day_Result_Milady:Number = Day_Result_Milady+1;
        return new Array(Year_Result_Milady, Month_Result_Milady, day_Result_Milady);
    }
    function ShamsiToMiladi(j_y:Number, j_m:Number, j_d:Number):Array {
        var Month_Miladi:Array = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
        var Day_Miladi:Array = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
        var Year_Result_Milady:Number = j_y-979;
        var Month_Result_Milady:Number = j_m-1;
        var day_Result_Milady:Number = j_d-1;
        var Day_Result_Milady:Number = 365*Year_Result_Milady+Divides(Year_Resu lt_Milady, 33)*8+Divides(Year_Result_Milady%33+3, 4);
        for (var i = 0; i<int(Month_Result_Milady); ++i) {
            Day_Result_Milady += Day_Miladi[i];
        }
        Day_Result_Milady += day_Result_Milady;
        var DD_Miladi_no:Number = Day_Result_Milady+80+(12-5);
        var YYYY_Temp_Miladi:Number = 1600+400*Divides(DD_Miladi_no, 146097);
        DD_Miladi_no = DD_Miladi_no%146097;
        var leap:Boolean = true;
        if (DD_Miladi_no>=36525) {
            DD_Miladi_no--;
            YYYY_Temp_Miladi += 100*Divides(DD_Miladi_no, 36524);
            DD_Miladi_no = DD_Miladi_no%36524;
            if (DD_Miladi_no>=365) {
                DD_Miladi_no++;
            } else {
                leap = false;
            }
        }
        YYYY_Temp_Miladi += 4*Divides(DD_Miladi_no, 1461);
        DD_Miladi_no %= 1461;
        if (DD_Miladi_no>=366) {
            leap = false;
            DD_Miladi_no--;
            YYYY_Temp_Miladi += Divides(DD_Miladi_no, 365);
            DD_Miladi_no = DD_Miladi_no%365;
        }
        for (var i = 0; DD_Miladi_no>=Month_Miladi[i]+(i == 1 && leap); i++) {
            DD_Miladi_no -= Month_Miladi[i]+(i == 1 && leap);
        }
        var Month_Temp_Miladi:Number = i+1;
        var Day_Temp_Miladi:Number = DD_Miladi_no+1;
        return new Array(YYYY_Temp_Miladi, Month_Temp_Miladi, Day_Temp_Miladi);
    }
}




فكر نمي كنم كدش سخت باشه ولي اگه مشكلي بود در خدمتم . لبخند


منبع : سايت مجيد آنلاين
موفق باشيد چشمک

ظاهرا" فقط به درد فلش کار ها میخوره :دی
چون الان مثلا" من نمیدونم اینجا حتی کجا باید اینزرت کرد! نمیدونم خواسته ی غیر منطقی ای میشه اگه بخوام یه کم هم توضیح بدی یا نه...!؟
سلام

اگه بگي تو چه برنامه اي غير فلش مي خواهي بهتره !!
چون اگه php مي خواهي كه حتما كامپوننتش هست (حتما php كاراي سايت مي تونن كمكت كنن) اگه .Net  مي خواهي كه در 2003 ش dll داره و در 2005 خودش شمسي رو ساپورت مي كنه ، اگه در چيزه ديگه اي مي خواهي بگو من يا بقيه دوستان اگه تونستيم كمكت مي كنيم.

ولي اگه همين فلش رو هم توضيح خواستي بگو در خدمتم . D:
من به طور خاص و برای برنامه ی خاصی نمیخوام... چون این کدها رو تو انجمن فلش گذاشتی میخواستم اگه ممکنه یه کم هم توضیح بدی برای اونایی که شاید تو فلش تازه کار هستن... تا برای اونا هم قابل استفاده باشه...

همه که مثل شما استاد نیستن که (;
سلام

اولا جناب CaCTuS لطف داري نمي خواد مبالغه كني.

دوما : توضيح كد بالا :


اين كد تنها در فلش استفاده نمي شه،‌هرجايي كه با كدهاي خانواده C كار كنه و اجازه تعريف كلاس رو بده قابل پياده سازي است .

در ضمن اگه نخواستيد كلاس بسازيد مي توانيد از توابع به تنهايي استفاده كنيد ولي هر بار بايد جداگانه آن را استفاده كنيد.

در ابتدا بايد بگم اين كد ها براي ايجاد يك كلاس براي تغيير تاريخ است. بعبارتي شما اين كلاس رو يه بار ايجاد كرده و بارها استفاده مي كنيد.
(برا يايجاد كلاس هم كافي است كه بعد از New قسمت بخشي كه كلاس رو ساپورتمي كنه رو انتخاب نماييد.)


در اين كد ما دو تا تابع اصلي داريم يكي  MiladiToShamsi و ديگري ShamsiToMiladi
كه هر دوتاشون سه تا ورودي (روز ، ماه و سال البته با فرمت شمسي يا ميلادي) رو دارن و خروجي به صورت آرايه مي باشد كه قرار است تاريخ خروجي با فرمت ميلادي يا شمسي باشد.

[مي دونيد كه لغت كليدي Var براي تعريف متغيير مي باشد.]

سپس در تابع MiladiToShamsi اعدادي كه به عنوان ورودي گرفته را با كمك دستورهاي if به شمسي تبديل كرده (يعن يتنها از فرمول تبديل تاريخ كه دستي هم استفاده مي كنيم بهره برده ،‌خيلي كار سختي نيست اگه بررسي كنيد متوجه مي شويد) آره
و همينطور در تابع ShamsiToMiladi

تابع Devid هم تنها كاري كهمي كنه دو عدد ورودي را با هم تقسيم كرده و خارج قسمت رو به عنوان خروجي مي دهد.

ديگهههههه

تابع Shamsi هم سازنده كلاس است. (اگر به اسم كلاس دقت كنيد همنام آن است) اگر با روش .O.O كار كرده باشيد حتما مفهوم آن را مي دانيد.
ولي مختصر مي توان گفت اگر شما بخواهيد شي اي از اين كلاس تعريف كنيد نياز به ورودي خاصي ندارد.

اميدوارم كافي باشه هوم


موفق باشيد.
بسيار خوب ...

CaCTuS نحوه ي استفاده ي اين كد رو در فلش خواستن كه با اجازه ي همه در مورد اين مبحث توضيحاتي مي دم :

توضيحات شما قشنگ بود ، اما بعضا" جملاتي توش به كار رفته كه امكان منحرف شدن كاربر رو به دنبال داره . شي گرائي و كلاسها (در خانواده C) مختص #C و ++C هستند و نه متغير ها و نه تعريف كلاس در اونها به شكل اسكريپ فوق تعريف نمي شن ! اين تعريف مخصوص Action Script فلش هستش (نسخه 2) و از اونجائي كه ما كار وب رو دنبال مي كنيم لزومي نداره در مورد نحوه ي تعريف متغير ها در برنامه هاي خانواده C رو توضيح بدم .

همونطور كه قبلا" هم اشاره كردم ، لزوما" همه ي منابع يا بحث ها موثق نيستند (حتي همين توضيحات) ، اين اسكريپت هم داراي اشكلاتي هستش كه در آخر توضيح مي دم ، به خط زير نگاه كنيد (حدودا" خط 13)

var DD_Miladi_no:Number = int(int(365)*YYYY_Temp_Miladi+Divides(YY YY_Temp_Mi ladi+3, 4)-Divides((YYYY_Temp_Miladi+99), 100)+Divides((YYYY_Temp_Miladi+399), 400));

فاصله بين YYYY_Temp_Mi ladi+3 رو بر ميداريم (YYYY_Temp_Miladi+3)

خوب ، حالا كل اسكريپت رو (به همراه برطرف كردن مشكل بالا) تو يه اديتور مثل Notepad انتقال داده و با نام Shamsi و پسوند as ذخيره مي كنيم . (Shamsi.as) اين يك فايل Action Script هستش كه كلاس Shamsi در اون تعريف شده و اسكريپت هاي داراي كلاس رو مي بايست به اين صورت ذخيره و از فايل فلش فراخواني كرد .

برنامه ي فلش رو باز كنيد ، فايل fla. رو تو همون پوشه اي كه Shamsi.as رو ذخيره كرديد ، به نام دلخواه ذخيره كنيد .

يك Movie Clip ايجاد كنيد و زمان نام گذاري و تنظيمان اون گزينه ي Advanced رو فعال كنيد . گزينه ي Export For ActionScript رو فعال كرده ، در قسمت Identifier نامي دلخواه (چون با هيچ آبجكتي كار نداريم) و در قست AS 2.0 class نام كلاس مربوطه ، يعني Shamsi رو بنويسيد .

حالا Movie Clip مربوطه رو از Stage (فضاي كار) حذف كنيد و در فريم اول اسكريپت زير رو وارد كنيد (انتخاب فريم ، فعال كردن پالت Action) اگه در مورد اسكريپت زير سوالي بود حتما" بپرسيد .

var emrooz:Shamsi=new Shamsi();
var tarikh:Date=new Date();

trace (emrooz.MiladiToShamsi(tarikh.getFullYear(),tarikh.getMonth(),tarikh.getDate()));
trace (emrooz.ShamsiToMiladi(1386,7,8));


خوب ... حالا با فرمان trace و اجراي فيلم فلش (CTRL+Enter) مي بايست تاريخ هاي شمسي به ميلادي و ميلادي به شمسي رو داشته باشيم (امروز 9/7/1386 مصادف با 1/10/2007) كه به اشتباه با مقادير زير روبرو مي شيم :

1386,6,2
2007,10,8

اگه به كد بالا شك داريد مي تونيد تابع رو به صورت مقادير دستي امتجان كنيد ، كه باز هم همون مقادير اشتباه حاصل مي شه :

trace (emrooz.MiladiToShamsi(2007,10,1));

كه باز هم با تاريخ شمسي اشتباه روبرو مي شيم .

با تشكر .

یه عالمه ممنون از هر دوتاتون... اینجوری بهتر شد :)
حالا برای تعداد بیشتری قابل استفاده ست...
Bonyanalam عزير از توضيحات كاملت ممنون
البته يه چيز رو توجه كنيد كه شايد در دادن خروجي نهايي اشتباه داشته باشه (كه با تغيير اندكي در اعداد و فرمول آن قابل حل است)‌ ولي تنها هدف از قرار دادن اين آموزش اين نيست كه بدون بررسي آن در فايل ها ازش بشه استفاده كرد.
بيشتر هدف آموزشي داره .

توضيح :  در برنامه نويسي تمام زبان هايي كه از پايه برنامه نويسي C استفاده مي كنند با اصطلاح خانواده C مي شناسن (مثل action script و #C , . . . ) وگرنه همه خبر دارن كه C خودش Object Oriented نيست و تعريف متغيير در آن به اين صورت نيست ولي به عنوان اصطلاح استفاده مي شه.
مسلما منظور من استفاده اين كد در Borland C ‌نبوده ممم

باز هم از توضيحاتت ممنون

CaCTuS نوشته است:
یه عالمه ممنون از هر دوتاتون... اینجوری بهتر شد :)
حالا برای تعداد بیشتری قابل استفاده ست...

بيائيم فرهنگ استفاده از دكمه ي تشكر رو براي پست هائي كه لايق هستند جا بياندازيم .

Melika نوشته است:
در برنامه نويسي تمام زبان هايي كه از پايه برنامه نويسي C استفاده مي كنند با اصطلاح خانواده C مي شناسن (مثل action script و #C , . . . )

برنامه هاي خانواده ي C شامل C و ++C و #C و Java هستند ، Action Script فقط مختص استفاده در برنامه فلش طراحي شده و هيچ ربطي به خانواده C نداره !

Melika نوشته است:
وگرنه همه خبر دارن كه C خودش Object Oriented نيست و تعريف متغيير در آن به اين صورت نيست ولي به عنوان اصطلاح استفاده مي شه.


متوجه نشدم ؟ ولي به عنوان اصطلاح استفاده مي شه ؟!

Bonyanalam نوشته است:
بيائيم فرهنگ استفاده از دكمه ي تشكر رو براي پست هائي كه لايق هستند جا بياندازيم .


رئیس!
من غیر از تشکر حرف دیگه ای هم زدم! یادم بنداز یه چیزی رو واست بگم در این رابطه ;)

صفحات: 1 2
مرجع آدرس ها