ارسال به آینده

D.A.V.O.O.D

Member
با عرض سلام و خسته نباشید خدمت تمامی اساتید php کار مجید آنلاین
می خواستم قسمت ارسال به آینده را بنویسم یه مشکلی دارم . واسه این کار خودم این کار رو کردم . ببینید عملیه ؟ اگه آره دستور SQL را چطوری بنویسم ؟
من می گم توی قسمت ارسال مطلب از کاربر سال ، ماه ، روز ، ساعت ، دقیقه ، ثانیه رو بگیریم و این اعداد رو هر کدامشان را توی یک فیلد از دیتا بیس بریزیم . بعد توی صفحه ای که می خواهیم نمایش داده شوند . سال ، ماه ، روز ، ساعت ، دقیقه ، ثانیه کنونی را با سال ، ماه ، روز ، ساعت ، دقیقه ، ثانیه مطلب چک کنیم اگه کمتر بود نمایش داده بشوند . درسته این روش ؟
اگه آره چطوری دستور SQL را بنویسم ؟

ممنون بابت کمک های احتمالی شما
 

D.A.V.O.O.D

Member
ممنونم از اینکه پاسخ دادید ...
ولی این دستور واسه چک کردن زمان ممکن نیست چون فکر کنید که مثلا تاریخ مطلب ما به این صورت بوده :
سال : 1388
ماه : 01
روز : 30

ساعت : 18
دقیقه : 18
ثانیه : 19

و تاریخ و زمان سرور ما این باشه :
سال : 1388
ماه : 01
روز : 31

ساعت : 15
دقیقه : 17
ثانیه : 18

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

ziXet

مدیر انجمن PHP/MYSQL
ممنونم از اینکه پاسخ دادید ...
ولی این دستور واسه چک کردن زمان ممکن نیست چون فکر کنید که مثلا تاریخ مطلب ما به این صورت بوده :
سال : 1388
ماه : 01
روز : 30

ساعت : 18
دقیقه : 18
ثانیه : 19

و تاریخ و زمان سرور ما این باشه :
سال : 1388
ماه : 01
روز : 31

ساعت : 15
دقیقه : 17
ثانیه : 18

خب همانطور که مشاهده می کنید با اینکه تاریخ مطلب ما قبل تاریخ سرور است ، زمان ما بیشتر از زمان سرور است پس با کدی که شما دادید این مطلب که مطلب قدیمی محسوب می شود نشان داده نخواهد شد و به عنوان یک مطلب آینده محسوب می شود .
شما از تابع mktime استفاده کن و زمانت رو تبدیل به ثانیه کن و اون ثانیه هارو بریز تو دیتابیس بعد با تابع ()time مقایسه کن
 

sunrise

Member
بهتره زمان رو بصورت UNIXTIMESTAMP در بانک اطلاعاتي ذخيره کنيد، بعنوان مثال 1240262430 که معادل 20 آوريل 2009 و ساعت 21:20:30 است، که مي تونيد براي تبديل به اين فرمت از تابع mktime بصورت زير استفاده کنيد:
PHP:
$timestamp = mktime(21, 20, 30, 4, 20, 2009);
بعد براي مقايسه مي تونيد اين دستور MySQL رو استفاده کنيد:
کد:
SELECT *
FROM table
WHERE showtime > UNIX_TIMESTAMP()
البته در صورتي که شما مي خواهيد زمان هاي محلي رو مورد بررسي قرار بديد (يا همون Timezone) مي بايست کمي در کد فوق تغييرات اعمال بشه که زياد هم کار زمان بر و دشواري نيست و کافيه يه سري عدد رو در هم ضرب کنيد و به UNIXTIMESTAMP اضافه يا کم کنيد که در اين مورد مي بايست جدول مربوط به زمان هاي محلي مختلف رو داشته باشيد و براساس اون محاسبات رو انجام بديد.
 

D.A.V.O.O.D

Member
ShahKey.Com و SunRise عزیز ، ممنونم از کمکتون .
اما من تاریخم شمسیه ! آیا این تابع mktime واسه تاریخ خای شمسی نیز کار می کنه ؟
 

hba

Active Member
براي مال من رو فقط تاريخ رو با sql چك كن
و ساعت رو با php چك كن
همه اش رو با Sql با هم نميشه


تاريخ ها رو Sql بزن در مياد بعد هر كدوم رو ساعتش رو با الان چك كن نمايش بده
 
آخرین ویرایش:

sunrise

Member
اما من تاریخم شمسیه ! آیا این تابع mktime واسه تاریخ خای شمسی نیز کار می کنه ؟
البته اين ديدگاه من هست و خودم هميشه همين کار رو مي کنم، سعي کنيد تاريخ ها رو بصورت ميلادي در بانک اطلاعاتي ذخيره کنيد و فقط هنگام نمايش اون رو به فرمت شمسي تبديل کنيد، اينطوري دست شما در آينده بازتر خواهد بود.

به هرحال با استفاده از سه تابع زير (و تابع نهايي maketime) که براساس تقويم جلالي نوشته شده مي تونيد اين کار رو انجام بديد:
PHP:
function div($a,$b)
{
	return (int) ($a / $b);
}

function convert_to_gregorian($j_y, $j_m, $j_d)
{
	 $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	 $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

	 if ($j_y == null OR $j_y < 1)
	 {
		$j_y = 1367;
		$no_year = 1;
	 }

	$jy = $j_y-979;
	$jm = $j_m-1;
	$jd = $j_d-1;

	$j_day_no = 365 * $jy + div($jy, 33) * 8 + div($jy % 33 + 3, 4);
	for ($i=0; $i < $jm; ++$i)
	{
		$j_day_no += $j_days_in_month[$i];
	}

	$j_day_no += $jd;

	$g_day_no = $j_day_no+79;

	$gy = 1600 + 400 * div($g_day_no, 146097);
	$g_day_no = $g_day_no % 146097;

	$leap = true;
	if ($g_day_no >= 36525)
	{
		$g_day_no--;
		$gy += 100 * div($g_day_no,  36524);
		$g_day_no = $g_day_no % 36524;

		if ($g_day_no >= 365)
			$g_day_no++;
		else
			$leap = false;
	}

	$gy += 4 * div ($g_day_no, 1461);
	$g_day_no %= 1461;

	if ($g_day_no >= 366)
	{
		$leap = false;

		$g_day_no--;
		$gy += div($g_day_no, 365);
		$g_day_no = $g_day_no % 365;
	}

	for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 AND $leap); $i++)
	{
		$g_day_no -= $g_days_in_month[$i] + ($i == 1 AND $leap);
	}
	$gm = $i + 1;
	$gd = $g_day_no + 1;

	if ($no_year) $gy = '0000';

	return array($gy, $gm, $gd);
}

function maketime($hour = 0, $minute = 0, $second = 0, $smonth = 0, $sday = 0, $syear = 0)
{
	list($year, $month, $day) = convert_to_gregorian($syear, $smonth, $sday);
	return @mktime($hour, $minute, $second, $month, $day, $year, null);
}
 

D.A.V.O.O.D

Member
سلام
یه تابع توی خود فایل jdf.php بود که تاریخ شمسی را به تاریخ میلادی تبدیل می کرد .
مشکلم حل شد ...

با تشکر از hba و Shahkey.Com و SunRise و ساسان نوبخت عزیز ...
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا