صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 18

الموضوع: تحويل التاريخ الرقمي الى نص

  1. #1
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613

    تحويل التاريخ الرقمي الى نص



    احاول إنشاء نظام بسيط يقوم بتحويل التاريخ بصيغة unix الى نص على شاكلة ..
    كود:
    1 minute ago
    3 hours ago
    5 days ago
    2 weeks ago
    7 months ago
    2 years ago
    ..
    وتوصلت الى هذا الحل ..
    كود PHP:
    date_default_timezone_set('asia/riyadh');

    function 
    unix_time2text($unix_time) {
        
    $seconds time() - $unix_time;
        
        
    // by seconds
        
    $minute 60;
        
    $hour $minute 60;
        
    $day $hour 24;
        
    $week $day 7;
        
    $month $day 30;
        
    $year $month 12;
        
        
    // seconds
        
    if ($seconds == 1) {
            
    $text '1 second ago';
        } elseif (
    $seconds $minute) {
            
    $text $seconds.' seconds ago';
        
    // minutes
        
    } elseif ($seconds >= $minute and $seconds < ($minute 2)) {
            
    $text '1 minute ago';
        } elseif (
    $seconds $hour) {
            
    $text = (round($seconds/$minute)-1).' minutes ago';
        
    // hours
        
    } elseif ($seconds >= $hour and $seconds < ($hour 2)) {
            
    $text '1 hour ago';
        } elseif (
    $seconds $day) {
            
    $text = (round($seconds/$hour)-1).' hours ago';
        
    // days
        
    } elseif ($seconds >= $day and $seconds < ($day 2)) {
            
    $text '1 day ago';
        } elseif (
    $seconds $week) {
            
    $text round($seconds/$day).' days ago';
        
    // weeks
        
    } elseif ($seconds >= $week and $seconds < ($week 2)) {
            
    $text '1 week ago';
        } elseif (
    $seconds $month) {
            
    $text round($seconds/$week).' weeks ago';
        
    // months
        
    } elseif ($seconds >= $month and $seconds < ($month 2)) {
            
    $text '1 month ago';
        } elseif (
    $seconds $year) {
            
    $text round($seconds/$month).' months ago';
        
    // years
        
    } elseif ($seconds >= $year and $seconds < ($year 2)) {
            
    $text '1 year ago';
        } else {
            
    $text round($seconds/$year).' years ago';
        }
        
        return 
    '['.date('d/m/Y h:i:s a'$unix_time).'] '.$text."\n";
    }

    echo 
    '<pre>';

    // years
    for ($i 00$i 03$i++) {
        
    // h, i, s, m, d, Y
        
    echo unix_time2text(mktime(000000date('m'), date('d'), ((date('Y')-02)+$i)));
    }

    echo 
    "\n";

    // months
    for ($i 00$i 12$i++) {
        echo 
    unix_time2text(mktime(000000, (01+$i), date('d'), date('Y')));
    }

    echo 
    "\n";

    // weeks and days
    for ($i 00$i 30$i++) {
        echo 
    unix_time2text(mktime(000000, (date('m')-01), (01+$i), date('Y')));
    }

    echo 
    "\n";

    // hours
    for ($i 00$i 24$i++) {
        echo 
    unix_time2text(mktime((01+$i), 0000date('m'), (date('d')-01), date('Y')));
    }

    echo 
    "\n";

    // minutes
    for ($i 00$i 60$i++) {
        echo 
    unix_time2text(mktime(((date('h')+12)-01), (01+$i), 00date('m'), (date('d')-1), date('Y')));
    }

    echo 
    "\n";

    // seconds
    for ($i 00$i 60$i++) {
        echo 
    unix_time2text(mktime((date('h')+12), (date('i')-01), (01+$i), date('m'), (date('d')-1), date('Y')));
    }

    echo 
    '</pre>'
    فأود معرفة رأيكم في الحل .. ومدى دقّته ، واذا كان هناك طريقة أفضل لحل مثل هذه المسألة ..





    التعديل الأخير تم بواسطة dev11 ; 04-12-2008 الساعة 03:41 AM
    __________________
    مدونة؟


  2. #2
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    في الحقيقة أعجبتني الدالة ..

    لم أطّلع على الكود كاملاً .. لكن لدي ملاحظة ، في هذه الجزئية :
    كود PHP:
        } elseif ($seconds >= $minute and $seconds < ($minute 2)) { 
            
    $text '1 minute ago'
        } elseif (
    $seconds $hour) { 
            
    $text = (round($seconds/$minute)-1).' minutes ago'
    لماذا لم تلجأ إلى نفس أسلوب round مع القسمة من البداية ؟ أعتقد أنك تستطيع دمجهما مع وضع شرط مثلاً إذا كانت نتيجة الـ round = 0 هذا يعني أن الوقت " أقل من دقيقة - Less than a minute " .. أعتقد أن هذا مناسب أكثر .. حيث أن الدقيقة في كودك هي إلى ما قبل تمام الدقيقتين .. مع أنك لم تتبع نفس الأسلوب في باقي الشروط .. أتمنى أن تكون الفكرة قد وصلت ..

    عمل طيّب جداً ..

    أرق التحيات، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  3. #3
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    السبب في ذلك هو ان فرق الدقائق ليس بالفرق الكبير ، نفس الطريقة بالنسبة للثواني والساعات ، بمعنى لو انني قلت ..
    كود:
    1 minute ago
    2 minutes ago
    فالفارق بينهما ليس مؤثرا ، بينما ..
    كود:
    1 year ago
    2 years ago
    الفارق كبير جدا ومؤثر ، فلذلك لم نقم بنفس الطريقة المتبعة مع الدقائق وأخواتها ، الكلام هنا ينطبق على الايام والاسابيع والشهور ايضا ..

    الحل لايزال ينقصه بعض الدقة .. بمعنى انه ليس دقيقا 100% .. النقطة التي أشرت اليها استاذي اشرف بالاضافة الى نقطة اخرى وهي عدد ايام الشهر هي محور النظام كله ..

    جزيل الشكر لك استاذي أشرف .. واود لو تقوم بتدعيم فكرتك ببعض الاسطر من الاوامر لكي تكون اكثر وضوحا ، شكرا لك مرة اخرى ..





    التعديل الأخير تم بواسطة dev11 ; 07-12-2008 الساعة 04:29 PM

  4. #4
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    السبب في ذلك هو ان فرق الدقائق ليس بالفرق الكبير ، نفس الطريقة بالنسبة للثواني والساعات ، بمعنى لو انني قلت ..
    كود:
    1 minute ago
    2 minutes ago
    فالفارق بينهما ليس مؤثرا ، بينما ..
    كود:
    1 year ago
    2 years ago
    الفارق كبير جدا ومؤثر ، فلذلك لم نقم بنفس الطريقة المتبعة مع الدقائق وأخواتها ، الكلام هنا ينطبق على الايام والاسابيع والشهور ايضا ..

    الحل لايزال ينقصه بعض الدقة .. بمعنى انه ليس دقيقا 100% .. النقطة التي أشرت اليها استاذي اشرف بالاضافة الى نقطة اخرى وهي عدد ايام الشهر هي محور النظام كله ..

    جزيل الشكر لك استاذي أشرف .. واود لو تقوم بتدعيم فكرتك ببعض الاسطر من الاوامر لكي تكون اكثر وضوحا ، شكرا لك مرة اخرى ..
    شكراً لتجاوبك عزيزي ..

    أعتقد أنك فهمت مقصدي لا داعيَ لأن أدعّم ذلك بأمثلة <<< serious headache ..

    لكن في نفس الوقت الدقة مطلوبة فكلما زادت دقة الدالة زاد مؤهلها إلى ساحة العمل ..

    النقطة التي أشرت اليها استاذي اشرف بالاضافة الى نقطة اخرى وهي عدد ايام الشهر هي محور النظام كله ..
    اعذرني لم أفهم عن ماذا تتحدث بالضبط في " عدد أيام الشهر " .. هل هناك أية نقطة تود الحديث حولها بخصوص هذا الموضوع؟

    على الجانب الآخر، أقترح عليك أن تضيف ياراميتراً آخر .. يكون اختياري أي له قيمة مثلاً تساوي 0 افتراضية ، بحيث يحمل هذا الباراميتر الوقت الحالي الذي يريد المبرمج مقارنة الوقت الأول به .. حيث أن بعض المبرمجين يستخدمون طرائق غير time() للحصول على الوقت ..

    في حال ترك الباراميتر فارغاً سيتم استخدام دالة time() افتراضياً ..

    بالمناسبة، لدي تصوّر آخر للدالة بحيث تقوم بنفس المهمة بأداء أعلى .. حيث أنها كما تعلم حالياً تحوي كماً كثيراً من الشروط التي تخفّض من الأداء .. أعتقد أني أملك فكرة مشابهة أو تعديلات على الكود بمستوى جيّد من الأداء .. لكني سأأجلها إلى وقت لاحق إن شاء الرحمن ..

    دعني أرى ردك على ما تقدّم وإن شاء الله إن سمحت الفرصة سأشاركك في تطوير الدالة هنا بما أملك ..

    وأضحى مبارك وكل عام وأنتَ بخير ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  5. #5


    أقوم لدي بمقارنة date("d") لل time() مع date("d") للوقت الخاص بالمقالة مثلاُ
    وأستخدم switch
    لو كان 0 اليوم
    لو كان 1 ( يوم )
    2 يومين
    3 3 أيام إلخ حتي 6 أيام

    بعد ذلك أقارن بين شهر وشهر وأستخدم أيضا switch وهكذا
    فحسب ما قرأت switch أسرع
    وتحت الحالة بعمل return يعني لو طلعت الحالة ترجع بالقيمة ولا تكمل باقي الدالة





    __________________
    السيف أصدق أنباء من الكتب

  6. #6
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    جميل جدا ، بالنسبة لعدد ايام الشهر فهي ليست ثابته في جميع الشهور لذلك علينا تحديد القيمة بشكل صحيح لزيادة دقة الحل ، فكرة الباراميتر الاضافي جميلة .. وكل ماسبق تنفيذه ليس بالامر الصعب ان شاء الله .. لا يزال لدي شكوك حول مدى دقة الحل ، بقية ما تم ذكره يتعلق بالاداء والسرعة وهذا جيد .. لكن لابد من التأكد من صحة ودقة طريقة الحساب اولا ، ولامانع من الاثنين معا ، جزيل الشكر لكم جميعا ..






  7. #7
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    عزيزي dev11 ،، إذا كنت تملك رقم الشهر الذي تريده والعام في كل مرة .. فيمكنك استخدام:
    كود PHP:
    date('t'); 
    فهي كفيلة بإعطائك عدد الأيام في الشهر ..

    وإن لم ترغب بذلك يمكنك أيضاً إنشاء دالتك الخاصة .. بحيث ( الأشهر من 1 إلى 12 ) :
    31 يوم
    28 يوم
    31 يوم
    30 يوم
    31 يوم
    30 يوم
    31 يوم
    31 يوم
    30 يوم
    31 يوم
    30 يوم
    31 يوم

    مع ضرورة التحقق من شهر 2 إن كانت السنة كبيسة Leap Year سيكون عندها 29 يوماً .. وخوارزمية السنة الكبيسة موجودة في النت ..

    أطيب التحيات، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  8. #8
    عضو فعال
    تاريخ التسجيل
    Aug 2007
    المشاركات
    1,431

  9. #9
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    بالضبط ، بالنسبة لتحسين الأداء أعتقد ان استخدامswitch ‎‏ افضل في هذه الحالة كما ذكر الاستاذ "المجروح" لكنني لا اتفق معه في استخدام return ‎‏ في جميع الحالات .. السبب هو ان switch ‎‏ تتبع هذا النهج مسبقا .. بمعنى ان النظام سيسند القيمة التي طابقت الحالة دون النظر الى الحالات الاخرى ، استخدام return‏ سيزيد من حجم الدالة بدون فائدة حيث ان استخدامها مرة واحدة بعد switch‏ يكفي .. هل توجد طريقة اخرى لتحسين الاداء ؟

    السؤال هنا : هل نعتمد طريقة الحساب ؟ ( هل هي خالية من الاخطاء المنطقية ؟ )

    انا الان بعيد عن شاشة الحاسوب وعندما اعود ساطبق كل ما تم ذكره ان شاء الله ، او اذا كان لدى احدكم القدرة فليقم بذلك ، شكرا لكم جميعا ..






  10. #10


    خذ تحليل مبدأي للفكرة مع العلم اني سأستخدم الدالة الناتجة مكان اللي لدي فلنعمل سوياً
    لن أكتب كل الدالة ولكني سأعطيك فكرة جيدة

    الأول هنجيب الفرق بين التوقيتين time و زمن الموضوع

    نضعه في متغير وليكن $diff_time

    نجيب كمان الشهر عن طريق

    كود PHP:
    $month date"m"$topic_time); 
    الأن نعمل التالي

    دالة شرطية بالشكل التالي

    لو كان الزمن $diff_time أقل من 3600
    ( switch للتعامل مع الدقائق )

    لو كان الزمن $diff_time اكبر من 3600 وأقل من 24 * 3600
    ( switch للتعامل مع الساعات )

    لو كان الزمن $diff_time أكبر من 24 * 3600 وأقل من 7 * 3600 * 24
    switch للتعامل مع الأيام

    لو كان أكبر من 7 وأقل من 14 ( أسبوع ) ثم لو كان بين 14 و 21

    لو كان أكبر من 21 وأقل من 31 وفي نفس الوقت $month في المصفوفة ( 1,3,5,7,8,10,12 ) ( بنستخدم inarray
    نروح لدالة

    وهكذا

    يبقي الشرط بيتنفذ مرة واحدة ثم يرسلنا ل switch نتعامل معها بالتفصيل الممل كونها أسرع





    __________________
    السيف أصدق أنباء من الكتب

  11. #11
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    أعتقد أن الدالة وصلت الى صورتها النهائية .. بالنسبة لإستخدام switch فقمت بتعيينها للقيمة true ..
    كود PHP:
    function unix_time2text($unix_time$time null) {
        if (
    is_int($unix_time) == false) {
            return 
    null;
        }
        
        if (
    $time == null) {
            
    $time time();
        } else {
            if (
    is_int($time) == false) {
                return 
    null;
            }
        }

        
    // $time must be bigger than $unix_time..
        
    if ($time $unix_time) {
            return 
    null;
        }

        
    $seconds $time $unix_time;

        
    // by seconds..
        
    $minute 60;
        
    $hour 3600// $minute * 60
        
    $day 86400// $hour * 24
        
    $week 604800// $day * 7

        // for the current month..
        
    $month $day date('t'$time);

        
    $year = (date('L'$time) == 1) ? 31622400 31536000;
        
    // 1 : ($day * 29) + ((4 * ($day * 30)) + (7 * ($day * 31)))
        // 0 : ($day * 28) + ((4 * ($day * 30)) + (7 * ($day * 31)))

        
    switch (true) {
            
    // seconds
            
    case ($seconds == 0) :
                
    $text 'this second';
                break;
            case (
    $seconds == 1) :
                
    $text '1 second';
                break;
            case (
    $seconds $minute) :
                
    $text $seconds.' seconds';
                break;
            
    // minutes
            
    case ($seconds 120) : // $minute * 2
                
    $text '1 minute';
                break;
            case (
    $seconds $hour) :
                
    $text round($seconds/$minute).' minutes';
                break;
            
    // hours
            
    case ($seconds 7200) : // $hour * 2
                
    $text '1 hour';
                break;
            case (
    $seconds $day) :
                
    $text round($seconds/$hour).' hours';
                break;
            
    // days
            
    case ($seconds 172800) : // $day * 2
                
    $text '1 day';
                break;
            case (
    $seconds $week) :
                
    $text round($seconds/$day).' days';
                break;
            
    // weeks
            
    case ($seconds 1209600) : // $week * 2
                
    $text '1 week';
                break;
            case (
    $seconds $month) :
                
    $text round($seconds/$week).' weeks';
                break;
            
    // months
            
    case ($seconds < ($month 2)) :
                
    $text '1 month';
                break;
            case (
    $seconds $year) :
                
    $text round($seconds/$month).' months';
                break;
            
    // years
            
    case ($seconds < ($year 2)) :
                
    $text '1 year';
                break;
            default :
                
    $text round($seconds/$year).' years';
                break;
        }

        return 
    $text;

    أمثلة ..
    كود PHP:
    date_default_timezone_set('asia/riyadh');

    function 
    u2t($unix_time) {
        
    $result unix_time2text($unix_time);
        if (
    $result == null) {
            echo 
    "null..\n";
        } else {
            echo 
    '['.date('d-m-Y h:i:s a'$unix_time).'] '.$result." ago..\n";
        }
    }

    function 
    u2te($unix_time$time) {
        
    $result unix_time2text($unix_time$time);
        if (
    $result == null) {
            echo 
    "null..\n";
        } else {
            echo 
    '[from ['.date('d-m-Y h:i:s a'$unix_time).'] to ['.date('d-m-Y h:i:s a'$time).']] '.$result."..\n";
        }
    }

    echo 
    '<pre>';

    // seconds
    u2t(time());
    u2t(time() - 01);
    u2t(time() - 30);
    u2t(time() - 59);

    echo 
    "\n";

    // minutes
    u2t(time() - 60);
    u2t(time() - (60 30));
    u2t(time() - (60 59));

    echo 
    "\n";

    // hours
    u2t(time() - (60 60));
    u2t(time() - (60 60 12));
    u2t(time() - (60 60 23));

    echo 
    "\n";

    // days
    u2t(time() - (60 60 24));
    u2t(time() - (60 60 24 2));
    u2t(time() - (60 60 24 6));

    echo 
    "\n";

    // weeks
    u2t(time() - (60 60 24 7));
    u2t(time() - (60 60 24 2));
    u2t(time() - (60 60 24 3));
    u2t(time() - (60 60 24 4));

    echo 
    "\n";

    // months
    u2t(time() - (60 60 24 date('t')));
    u2t(time() - (60 60 24 date('t') * 02));
    u2t(time() - (60 60 24 date('t') * 06));
    u2t(time() - (60 60 24 date('t') * 11));

    echo 
    "\n";

    // years
    u2t(time() - (60 60 24 date('t') * 12));
    u2t(time() - (60 60 24 date('t') * 12 02));
    u2t(time() - (60 60 24 date('t') * 12 05));
    u2t(time() - (60 60 24 date('t') * 12 10));

    echo 
    "\n\n";

    // extra parameter.. (first_parameter < second_parameter)
    u2te(mktime(101040771990), mktime(101060771990));
    u2te(mktime(101040771993), mktime(101260771993));
    u2te(mktime(101040772005), mktime(1410607212005));
    u2te(mktime(101040772002), mktime(141060772002));
    u2te(mktime(000772007), mktime(0001262007));
    u2te(mktime(000112003), mktime(000332006));

    echo 
    '</pre>'
    ايضاً قمت بازالة -1 بمعنى انه سيتم وضع الزمن بالضبط بدون اي تغيير.. اي ملاحظات او اقتراحات ؟ بالاضافة الى طرق لتحسين الاداء ؟

    - تم تحديث الدالة





    التعديل الأخير تم بواسطة dev11 ; 13-12-2008 الساعة 01:26 AM سبب آخر: تحديث الدالة
    __________________
    مدونة؟

  12. #12


    مادمت قلت

    كود PHP:
     $time null 
    فيمكنك فقط القول

    كود PHP:
    IF ( !$TIME 
    وعكسها
    كود PHP:
    IF ( $TIME 
    أيضا
    كود PHP:
    $seconds $time $unix_time
    راعي أنه قد يكون أرسل للدالة $time أصغر مما سينتج عدد ثواني بالسالب

    أيضا

    كود PHP:
    $month $day date('t'); 
    هذه ستحسب الشهور حسب TIME() ولكنك قد تكون أرسلت لها $time خاص
    يعني أعتقد المفروض تكون

    كود PHP:
    $month $day date('t'$time); 
    وكذلك date('L')

    سأراجع الدالة بعد تركيبها وأعود بإذن الله





    __________________
    السيف أصدق أنباء من الكتب

  13. #13
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    النقطة الأولى ليس لها تأثير .. ( عدة طرق تؤدي الى نتيجة واحدة ) ، بالنسبة للنقطة الثانية فمن الممكن اضافة شرط لتفادي هذه المشكلة ( الدالة time لا تعمل قبل العام 1970 ) ، ومعك حق في النقطة الثالثة فقد غفلت عنها ، شكراً جزيلاً لك ، لقد قمت بتحديث الدالة بهذه الملاحظات ..





    التعديل الأخير تم بواسطة dev11 ; 12-12-2008 الساعة 11:42 PM
    __________________
    مدونة؟

  14. #14


    النقطة الأولى ليس لها تأثير .. ( عدة طرق تؤدي الى نتيجة واحدة ) ، بالنسبة للنقطة الثانية فمن الممكن اضافة شرط لتفادي هذه المشكلة ( الدالة time لا تعمل قبل العام 1970 ) ، ومعك حق في النقطة الثالثة فقد غفلت عنها ، شكراً جزيلاً لك ، لقد قمت بتحديث الدالة بهذه الملاحظات ..
    هلا بالغالي
    أنا ماقصدت بالنقطة الأولي التعديل علي الكود ولكني فقط أردت التوضيح لك فنحن غرضنا الأول هو إفادة بعضنا البعض
    فهي طريقة أبسط في الكتابة فقط

    وإلا فكان يمكنني مثلا كتابة الدالة وخلاص ولكني تعمدت تركك تكتبها لنصل لأفضل شيئ بالتعاون
    وها أنت فعلتها افضل مما قلت أنا بجعلها تنازلية من الشرط الأضيق للأوسع


    بارك الله فيك





    __________________
    السيف أصدق أنباء من الكتب

  15. #15
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    حياك الله أخي الكريم ، أي ملاحظات أخرى ؟





    __________________
    مدونة؟





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض