عکس پیش‌فرض نوشته

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

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

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

نمایش زمان نسبی با php

 

این ترفند در اکثر شبکه های اجتماعی استفاده میشود و به راحتی میتوانید استفاده های متعدد این نوع نمایش زمان به روز رسانی را در سطح وب مشاهده کنید.

روشی که برای محاسبه و نمایش زمان نسبی در این مطلب به شما آموزش میدهیم، یک روش کلی است و میتوانید در هر زبان برنامه نویسی (مثل ASP ، Java ، Python و …) آنرا به کار گیرید؛ ولی ما در اینجا این روش را با زبان برنامه نویسی PHP به شما آموزش خواهیم داد.

 

ابتدا باید یک آرایه مشابه آرایه زیر داشته باشیم:

$days = array(
	'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
	);

 

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

دقت کنید که اگر از کتابخانه ای برای کار با تاریخ و زمان استفاده میکنید، ممکن است با توجه به شماره گذاری روزهای هفته، ترتیب چینش این مقادیر در آرایه تغییر کند.

 

همانطور که میدانید در سیستم های کامپیوتری، زمان به صورت مجموع ثانیه های گذشته شده از ساعت 00:00 بامداد روز 1 January سال 1970 محاسبه میشود.

در PHP دو تابع، که تقریبا میتوان گفت پر کاربرد هم هستند، برای کار با زمان تعریف شده اند.

اولی، تابع time() هست که زمان کنونی سیستم را بر اساس همان ثانیه های گذشته شده به ما میدهد.

و تابع دوم، تابع date() هست که دو پارامتر میگیرد؛ پارامتر ورودی اول به صورت رشته و برای تعیین نوع فرمت نمایش تاریخ است و پارامتر دوم، ثانیه زمان مورد نظر است. این تابع با گرفتن این دو مقدار، تاریخ را بر اساس ثانیه گرفته شده به ما برمیگرداند.

 

فرض کنید تابع ما یک پارامتر که همان مقدار ثانیه ای زمان مورد است را به عنوان ورودی دریافت میکند. اسم این متغیر را $time میگذاریم.

ابتدا باید بررسی کنیم که آیا زمان وارد شده امروز است یا خیر ؟

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

if( date('d/m/Y', $time ) === date( 'd/m/Y' ))

 

توجه داشته باشید که پارامتر دوم تابع date به طور پیشفرض زمان کنونی است.

اگر زمان وارد شده امروز نباشد، چک میکنیم که آیا دیروز بوده یا نه ؟

if( date('d/m/Y', $time ) === date( 'd/m/Y', time() - 3600 * 24 ))

 

در بررسی بالا، زمان وارد شده را با زمان فعلی در روز قبل (24 ساعت قبل) مقایسه میکنیم.

 

اگر تایم مورد نظر، امروز و دیرور نباشد، باید بررسی کنیم که آیا مربوط به بیشتر از یک هفته قبل است یا خیر ؟

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

if( (time() - $time) < 3600 * 24 * 8 ){
        return 'Last ' . $days[ date( 'w', $time ) ];
    }else{
        return date( "j F Y", $time );
    }

 

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

function relativeTime($time){
    $days = array(
        'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
    );
    if( date('d/m/Y', $time ) === date( 'd/m/Y' )){
        return 'Today';
    }else if( date('d/m/Y', $time ) === date( 'd/m/Y', time() - 3600 * 24 )){
        return 'Yesterday';
    }else if( (time() - $time) < 3600 * 24 * 8 ){
        return 'Last ' . $days[date('w', $time)];
    }else{
        return date("j F Y", $time);
    }
}

 

در شرط های استفاده شده، در هنگام استفاده از تابع date، از فرمت d/m/Y استفاده شده است؛ شما میتوانید از هر نوع فرمت دیگری برای نمایش زمان استفاده کنید، فقط توجه داشته باشید که این نوع فرمت باید در دو طرف شرط تعریف شده یکسان باشد.

در صورتی که زمان وارد شده بیشتر از یک هفته قبل باشد، تاریخ معمولی آن با فرمت j F Y بازگردانده میشود. شما میتوانید این فرمت را نیز به دلخواه خود تغییر دهید و یا برای زیباتر شدن تابع، میتوان این فرمت را به عنوان ورودی تابع خود از کاربر گرفته و از آن استفاده کنید.

در نتیجه بدنه کلی تابع شما به این صورت تعریف خواهد شد:

function relativeTime( $time, $format ){ … }

 

همچنین میتوان برای پارامتر $format مقدار پیشفرض تعیین کرد تا در صورتی که کاربر این مقدار را وارد نکرد، مقدار پیشفرض استفاده شود.

function relativeTime( $time, $format = 'j F Y' ){ … }

 

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

روش دیگری برای این محاسبه وجود دارد.

ابتدا اختلاف زمان وارد شده با زمان کنونی را محاسبه میکنیم؛ سپس اگر این اختلاف کمتر از 60 (ثانیه) بود، همین مقدار را به عنوان خروجی برمیگردانیم؛ اگر بزرگتر بود، آن را بر 60 تقسیم کرده و با مقدار بعدی که 60 (دقیقه) هست چک میکنیم.

function relativeTime2( $time, $format = 'Y-m-d H:i' ){
    $dif = time() - $time;

    $date = array(
        "second" => 60,     // 60 Seconds in 1 Minute
        "minute" => 60,     // 60 Minutes in 1 Hour
        "hour" => 24,       // 24 Hours in 1 Day
        "day" => 7,         // 7 Days in 1 Week
        "week" => 4,        // 4 Weeks in 1 Month
        "month" => 12,      // 12 Months in 1 Year
        "year" => 5        // max: 5 Years
    );
    if( $dif <= 15 ) return "Just Now";

    foreach( $dateArray as $key => $item ){
        if($dif < $item)
            return $dif . ' ' . $key . ( $dif == 1? '' : 's' ) . ' ago';
        $dif = round( $dif/$item );
    }
    return date( $format, $time );
}

 

تعریف تابع واضح هست، ابتدا اختلاف زمان وارد شده با زمان کنونی محاسبه شده، آرایه ای برای افزایش سلسله مراتب زمانی تعریف شده، سپس بررسی میشود که اگر زمان کمتر از 15 ثانیه قبل بوده، مقدار دلخواه ما را بازگرداند (میتوان این مقدار را کاهش یا افزایش داد!) و در پایان در یک حلقه، الگوریتم توضیح داده شده را اجرا خواهد کرد.

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

در پایان تابع نیز اگر زمان وارد شده بیش از مقدار تعریف شده ما (در این جا 5 سال) باشد، تاریخ معمولی آن نشان داده میشود.

 

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