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

حتما در سایت جاری مشاهده کرده اید در اطلاعات مربوط به پست‌ها زمان تقریبی انتشار پست درج شده است. 
  • 12 ساعت قبل
  • دیروز
  • لحظاتی پیش
  • ...

نشان دادن همچین اطلاعاتی در برنامه‌های مختلف می‌تواند سودمند باشد ، مثلا در این سایت اگر مطلبی مربوط به گذشته باشد خواننده با دیدن عبارت 4 سال قبل از پرسیدن یک سری سوالات خودداری می‌کند.
آقای Jeff Awtood یکی از خالقین سایت Stackoverflow زمانی سوالی درباره‌ی نحوه‌ی پیاده سازی این ویژگی پرسیده بودند که در نهایت یکی از پاسخ ها پذیرفته شد. 
یک مثال از نحوه‌ی پیاده سازی این ویژگی برای زبان فارسی مانند زیر است :
public class RelativeTimeCalculator
{
    const int SECOND = 1;
    const int MINUTE = 60 * SECOND;
    const int HOUR = 60 * MINUTE;
    const int DAY = 24 * HOUR;
    const int MONTH = 30 * DAY;

    public static string Calculate(DateTime dateTime)
    {
        var ts = new TimeSpan(DateTime.Now.Ticks - dateTime.Ticks);
        double delta = Math.Abs(ts.TotalSeconds);
        if (delta < 1 * MINUTE)
        {
            return ts.Seconds == 1 ? "لحظه ای قبل" : ts.Seconds + " ثانیه قبل";
        }
        if (delta < 2 * MINUTE)
        {
            return "یک دقیقه قبل";
        }
        if (delta < 45 * MINUTE)
        {
            return ts.Minutes + " دقیقه قبل";
        }
        if (delta < 90 * MINUTE)
        {
            return "یک ساعت قبل";
        }
        if (delta < 24 * HOUR)
        {
            return ts.Hours + " ساعت قبل";
        }
        if (delta < 48 * HOUR)
        {
            return "دیروز";
        }
        if (delta < 30 * DAY)
        {
            return ts.Days + " روز قبل";
        }
        if (delta < 12 * MONTH)
        {
            int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
            return months <= 1 ? "یک ماه قبل" : months + " ماه قبل";
        }
        int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
        return years <= 1 ? "یک سال قبل" : years + " سال قبل";
    }

} 
نحوه‌ی کارکرد کد اینگونه است که دلتای زمان داده شده به متد Calculate با زمان فعلی بر حسب ثانیه محاسبه می‌گردد و با یک سری شرط مقایسه می‌شود ، مثلا اگر دلتا کمتر از 120 ثانیه بود رشته‌ی یک دقیقه قبل باز می‌گردد.
یک مثال از نحوه‌ی استفاده از این کلاس اینگونه است : 
var relativeTime=RelativeTimeCalculator.Calculate(DateTime.Now.AddMinutes(-10)); 
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، سه‌شنبه ۲۵ مهر ۱۳۹۱، ساعت ۱۹:۰۲
    سلام
    این نحوه نمایش تاریخ کار جالبیه . من هم این ویژگی رو (البته به یک روش دیگه ) پیاده سازی کردم . البته فکر کنم نسبت به روش ذکر شده در اینجا سنگین‌تر باشه و سربار بیشتری داره .
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، سه‌شنبه ۲۵ مهر ۱۳۹۱، ساعت ۱۹:۳۴
    با سلام و خسته نباشید
    می خواستم بدونم کاربرد اون const‌ها بالای برنامه چیه ؟
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۲۶ مهر ۱۳۹۱، ساعت ۰۰:۰۰
    سلام
    مطلب بسیار خوبی بود
    const هایی که در بالا تعریف شدن درون کد مورد استفاده قرار نگرفتن. فکر میکنم کد یه مقداری باید اصلاح بشه.
    • #
      ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۲۶ مهر ۱۳۹۱، ساعت ۰۲:۳۷
      ممنون ، 
      کد را اصلاح کردم.
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، چهارشنبه ۲۶ مهر ۱۳۹۱، ساعت ۰۵:۱۰
    سلام
    من توی پی اچ پی یه همچین تابعی نوشتم
    /**
    * Time Left function
    *
    * Example
    * $x = 1332140945 ;
    * echo time_left($x);
    * @param $ts int timestamp's post
    * @return string time left like 3mahe ghabl
    */
    function time_left($ts = null)
    {
    if(!$ts)
    return '';
    
    
    $time = time();
    $t = $time-$ts;
    
    if(intval($t) < 0)
    return 'آینده';
    
    if(floor($t/31536000) >= 1 )
    $out = floor($t/31536000).' سال قبل';
    elseif(floor($t/2592000) >= 1)
    $out = floor($t/2592000).' ماه قبل';
    elseif(floor($t/604800) >= 1)
    $out = floor($t/604800).' هفته قبل';
    elseif(floor($t/86400) >= 1)
    $out = floor($t/86400).' روز قبل';
    elseif(floor($t/3600) >=1)
    $out = floor($t/3600).' ساعت پیش';
    elseif(floor($t/60) >= 1)
    $out = floor($t/60).' دقیقه پیش';
    else
    $out = $t.' ثانیه قبل';
    return $out;
    } 
    فقط واسه بررسی گذاشتم .
    موفق باشید
  • #
    ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۱۱:۴۷
    با سلام و عرض  ادب
     بنده نیاز به یک تابع جاوا اسکریپتی ترجیحاً با Jquery دارم که بتونه تاریخ شمسی مثلا 1392/01/11  را بگیره و بگه که تا امروز چند سال و چند ماه گذشته. یعنی یک جور محاسبه سایقه کار برحسب سال و ماه را  می‌خواهم روز و ساعتش مهم نیست. با تشکر 
    • #
      ‫۱۰ سال و ۸ ماه قبل، جمعه ۱۸ بهمن ۱۳۹۲، ساعت ۱۳:۵۳
      - در همان لینک آخری که آقای کیاست معرفی کردند، پیاده سازی date_diff به زبان‌های دیگر منجمله جاوا اسکریپت نیز هست. برای تبدیل شمسی به میلادی هم از کتابخانه moment مثلا کمک بگیرید.
      + معادل کاملتر مطلب جاری: «DNTPersianUtils.Core»