رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تغییر برچسب زمانی (Timestamp) و عقب/جلو کشیدن اون به تعداد سال، ماه، روز، ساعت، دقیقه
#1
چند وقته میبینم دوستان توی تالار مشکلات زیادی توی محاسبه و ویرایش تاریخهای شمسی دارن. یکی از اونها که خیلی هم رایج هست اینه که میخوان به یه تاریخ مشخصی (درواقع به یک Timestamp مشخص) تعداد سال و ماه و روز و ساعت و دقیقه و ثانیه دلخواه رو اضافه یا ازش کم کنن و این موضوع با احتساب روزهای تقویم شمسی محاسبه بشه. مثلاً اگه میخوان 5 ماه اضافه کنن و اون سال کبیسه است و اسفند هم توی ماههایی که قراره اضافه بشه وجود داره، به اسفند که رسیدن، 30 روز اضافه بشه. این شد که تصمیم گرفتم با کمک کتابخانه JDF یک تابع مفید برای اینکار بنویسم. اینم از تابع:
function changeTimestamp($ts, $years = 0, $months = 0, $days = 0, $hours = 0, $minutes = 0, $seconds = 0) {
    require_once 'jdf.php'; // download from http://jdf.scr.ir
 
    // add/subtract years
    $operator = ($years < 0 ? -1 : 1);
    $years = abs($years);
    while($years > 0) {
        $daysOfCurrentYear = (tr_num(jdate('L'), $ts) ? 365 : 366);
        $ts += ($daysOfCurrentYear * 86400 * $operator);
        $years--;
    }
 
    // add/subtract months
    $operator = ($months < 0 ? -1 : 1);
    $months = abs($months);
    while($months > 0) {
        $daysOfCurrentMonth = tr_num(jdate('t', $ts);
        $ts += ($daysOfCurrentMonth * 86400 * $operator);
        $months--;
    }
 
    // add/subtract days
    $operator = ($days < 0 ? -1 : 1);
    $days = abs($days);
    while($days > 0) {
        $ts += (86400 * $operator);
        $days--;
    }
 
    // add/subtract hours
    $ts += ($hours * 3600);
 
    // add/subtract minutes
    $ts += ($minutes * 60);
 
    // add/subtract seconds
    $ts += $seconds;
 
    return $ts;
}

مزیت این تابع اینه که میتونید با اعداد منفی، زمان به عقب بکشین و با کمک اعداد مثبت، به جلو بیارین. برای مثال، اگه میخواین بدونین یک ماه قبل، دو ساعت و نیم جلوتر از الان، چه Timestamp داشته، اینطوری از تابع فوق استفاده میکنید:
$ts = changeTimestamp(time(), 0, -1, 0, 2, 30, 0);
پاسخ
تشکر شده توسط: php , abdollah110110 , saeed , mehdi king




کاربران در حال بازدید این موضوع: 1 مهمان