PDA

View Full Version : افزایش و کاهش از تاریخ



sattaryekta
سه شنبه 28 دی 1389, 09:43 صبح
سلام

به کمک این توابع، تعداد روز های مورد نظرتان را به/از یک تاریخ با فرمت شمسی:
yyyymmdd
اضافه/کم کنید:





function decDate($srcDate, $days){
if(is_numeric($srcDate) && strlen($srcDate)==8 && substr($srcDate,0,2)=="13"){
$year = substr($srcDate,0,4);
$month = substr($srcDate,4,2);
$day = substr($srcDate,6,2);
if($days>=30){
if($days>=365){
$year -= floor($days / 365);
$days %= 365;
}
$month -= floor($days / 30);
if($month < 0){
--$year;
$month = 12 + $month;
}
$days %= 30;
}
if($days >= $day){
$day = (30 + $day) - $days;
--$month;
if($month < 0){
--$year;
$month = 12;
}
}else{
$day -= $days;
}
}
return $year.str_pad($month,2,0,STR_PAD_LEFT).str_pad($da y,2,0,STR_PAD_LEFT);
}
function incDate($srcDate, $days){
if(is_numeric($srcDate) && strlen($srcDate)==8 && substr($srcDate,0,2)=="13"){
$year = substr($srcDate,0,4);
$month = substr($srcDate,4,2);
$day = substr($srcDate,6,2);
$day += $days;
if($day > 30){
$month += floor($day / 30);
if($month > 12){
$year += floor($month / 12);;
$month %= 12;
}
$day %= 30;
}
}
return $year.str_pad($month,2,0,STR_PAD_LEFT).str_pad($da y,2,0,STR_PAD_LEFT);
}

ghasemweb
سه شنبه 28 دی 1389, 22:22 عصر
تبديل هم ميكنه يا فقط يك يك تاريخ شمسي رو به تعداد روزي كه ميخواهيم كم/زياد ميكنه . چون اين روش اگه بدون تبديل باشه يه جورايي دوباره كاري ميشه مثلا اول بايد يا يك ماژول ديگه تاريخ شمسي رو بدست بياري بعدش با اين توابع شما عمل كم و زياد كردن به تاريخ رو پياده كني !

sattaryekta
چهارشنبه 29 دی 1389, 13:31 عصر
خیلی ممنون از توجه شما.
منظور من از ارائه این توابع فقط چک کردن الگوریتم و راه حل استفاده شده است.
قطعاً این توابع هنوز جای کار داره. مثلاً همه ماه ها 30 روز نیستند. و یا هر 4 سال یکبار اسفند 29 روز است و در نتیجه همه سالها 365 روز نیستند.

بعضی مواقع در فیلد های دیتابیس تاریخ را با فرمت عددی yyyymmdd ذخیره می کنیم. مثلا 13891028 و گزارشاتی از جدول میخواهیم که چند روز قبل و یا چند روز بعد از یک تاریخ خاص را مد نظر دارند و این راه حلیست که به نظر من رسیده است.

آیا روال ساده تر و معمول تری برای این کار وجود داره؟

sattaryekta
دوشنبه 25 بهمن 1389, 12:49 عصر
برای جمع زدن چند روز به یک تاریخ خاص یک تابع ارائه داده بودم که اصلاحش کردم:
کاربردش در کارهای حسابداری هست.



function incDate($srcDate, $days){
//Format: 13YYMMDD
if(is_numeric($srcDate) && strlen($srcDate)==8 && substr($srcDate,0,2)=="13"){
$year = substr($srcDate,0,4);
$month = substr($srcDate,4,2);
$day = substr($srcDate,6,2);
$Xyears = floor($days / 365);
if($days >= 365) $days %= 365;
if($days){
$Xmonths = floor($days / 30);
if($days >= 30) $days %= 30;
if($days){
$day += $days;
if($day > 30){
$Xmonths += floor($day / 30);
if(!$day %= 30) $day=30;
}
}
$month += $Xmonths;
if($month > 12){
$Xyears += floor($month / 12);;
if(!$month %= 12) $month=12;
}
}
$year += $Xyears;
}
return $year.str_pad($month,2,0,STR_PAD_LEFT).str_pad($da y,2,0,STR_PAD_LEFT);
}

اگر دوستان روش بهتری دارند اطلاع دهند.

shahriyar3
چهارشنبه 18 اسفند 1389, 20:46 عصر
من ميخواستم از اين تابع استفاده كنم يه گشتي قبلش تو اينترنت زدم اين راه حل هارو پيدا كردم ميخواستم ببينم كه كدوم دقيقتر و مناسب تره
1. تابع غير رسمي معرفي شده تو سايت خود php براي اضافه كردن تعداد روز ماه و سال به تاريخ جاري


http://ca.php.net/manual/en/function.date-add.php

2 .نمونه اين كد


$Today=date('y:m:d');

// add 3 days to date
$NewDate=Date('y:m:d', strtotime("+3 days"));

// subtract 3 days from date
$NewDate=Date('y:m:d', strtotime("-3 days"));

// PHP returns last sunday's date
$NewDate=Date('y:m:d', strtotime("Last Sunday"));

// One week from last sunday
$NewDate=Date('y:m:d', strtotime("+7 days Last Sunday"));


ولي آخرش لازمه كه همشو تبديل به تاريخ شمسي كنيم
لطفا نظرتونو بگين
مرسي

رضا قربانی
پنج شنبه 19 اسفند 1389, 08:46 صبح
من همیشه از تابع های آقای جلالی استفاده می کنم - خیلی باهاشون حال می کنم و هر کاری هم می تونم انجام بدم . در کل یه چیز کاملا تکمیل هست . نمی دونم شنیدید یا نه

shahriyar3
پنج شنبه 19 اسفند 1389, 14:09 عصر
من همیشه از تابع های آقای جلالی استفاده می کنم - خیلی باهاشون حال می کنم و هر کاری هم می تونم انجام بدم . در کل یه چیز کاملا تکمیل هست . نمی دونم شنیدید یا نه
آقاي جلالي؟؟؟!!! آقاي جلالي رو نشنيدم تا حالا ولي تابع jdate يا همون تاريخ جلالي رو شنيدم و باهاش هم كار كردم ولي نميشه ازش تاريخ كم و زياد كرد . اگر شما ميتونيد اينكار و انجام بديد لطفا نحوه انجامشو به من هم آموزش بدين.
اگر هم منظورتون تابع هاي آقاي جلالي بود لطفا بزاريد اينجا تا ما هم استفاده كنيم.

رضا قربانی
پنج شنبه 19 اسفند 1389, 16:39 عصر
بفرمایید - .............

shahriyar3
جمعه 20 اسفند 1389, 16:45 عصر
بفرمایید - .............
ميشه طرز كارشو براي كم و زياد كردن از تاريخ رو هم نشونم بدي؟
مثلا يكي امروز يه پست ميزنه ميخوام 15 روز ديگه پاك بشه
چطوري تاريخ 15 روز ديگه رو بدست مياري؟؟

ashkan
سه شنبه 03 خرداد 1390, 11:49 صبح
سلام
جهت کم و زیاد کردن تاریخ شمسی میشه قبل از تبدیل تاریخ میلادی به شمسی از توابع استاندارد خود php که دوستمون در پست 5 نوشتند استفاده کرد.
به این ترتیب که ابتدا تعداد روزهایی رو که نیاز داریم از تاریخ میلادی کاهش یا افزایش میدیم سپس تاریخ رو به شمسی تبدیل میکنیم.
اگر تاریخ ما شمسی بود ابتدا اون رو به میلادی بر میگردونیم سپس توسط همین توابع که نوشتم تعدا روزها رو بنا به نیاز تغییر میدیم و دوباره اون رو به شمسی بر میگردونیم.البته این روش پیشنهاد نمیشه ولی کاربرد داره چون: اولا درگیر محاسبه کم و زیاد شدن روزهای سال معمولی و کبیسه و ماه های 31 و 30 روزه نمیشیم.دوما هر چی گشتم جهت کم و زیاد کردن تاریخ شمسی تابع استاندارد بدون خطا پیدا نکردم.
جهت کارایی بهتر میتونید از توابع جلالی استفاده کنید که بدون خطا و آزمایش شده است و نسخه جدید هم داده و سایت رسمیش هم http://jdf.scr.ir است.

موفق باشید.