PDA

View Full Version : عملیات روی متغیر هایی که محتوی تاریخ هستند ؟؟



mostafa_shaeri_tj
چهارشنبه 08 اسفند 1386, 16:18 عصر
با سلام و خسته نباشید .
من تو تالار جستجو کردم ولی چیزی گیرم نیومد .
من میخوام تاریخ امروز رو منهای تاریخی که از بانک میارم بکنم.
ولی انگار تو php متغییر از نوع date وجود نداره .
نمی دونم چیکار کنم .اگه راه حلی به نظرتون میرسه از من دریغ نکنین .
ممنون.:قلب:

maysamscript
چهارشنبه 08 اسفند 1386, 19:03 عصر
timestamp تاریخ ها رو از هم کم کن

mostafa_shaeri_tj
پنج شنبه 09 اسفند 1386, 16:23 عصر
معذرت میخوام میشه بیشتر توضیح بدین .
timestamp یک تابع هست؟

maysamscript
پنج شنبه 09 اسفند 1386, 16:44 عصر
timestamp یک عدده بر حسب ثانیه.
مثلاً timestamp امروز برابر با 1204205975 که اینجوری حساب میشه

$timestamp=mktime(date("H"),date("i"),date("s"),date("m"),date("d"),date("Y"));و اینجوری استفاده میشه

$today=date("Y-m-d",$timestamp);
$tomorro=date("Y-m-d",$timestamp+24*3600)

mostafa_shaeri_tj
یک شنبه 12 اسفند 1386, 10:35 صبح
دستت درد دردنکنه .خیلی به دردم خورد .
ولی یه مشکلی داشت .یعنی من یه مشکلی داشتم و اونم این که من میخوام دوتا تاریخ شمسی میخوام ازهم کم کنم .
و تابع mktime فقط تاریخ 1970 به بالا رو پشتیبانی میکنه .
منم یه کاری انجام دادم تا مشکلم حل شد . سال شمسی رو در 1.45 ضرب کردم بعد مقدار صحیح شو وارد تابع کردم .جواب میده .
مثلا سال 1386 رو 2009 در میاره . و چون کار من فقط در آوردن اختلاف بین دوتا تاریخه , جواب داد.

Bahram0110
یک شنبه 12 اسفند 1386, 11:31 صبح
1387 رو در 1.45 ضربیدی؟
می شه 2011

jeus
سه شنبه 18 تیر 1387, 04:12 صبح
اینجوری اصلا درست جواب نمیده بهتر نبود جمع و منهاش کنی خیلی هم راحتتر بود اینقدر هم احتیاج به پیدا کردن 1.45 نداشت به فرض مثال 621=1387-2008

موفق باشی :لبخند:

roya2002_80
پنج شنبه 14 شهریور 1387, 09:48 صبح
سلام
من می خوام توی دیتا بیس تاریخ روذخیره کنم ،که تایپ فیلد رو timestamp گرفتم، در فرمی که من طراحی کردم،کاربر تاریخ را به صورت تاریخ شمسی وارد می کند سوال من این هست که من چگونه این تاریخ شمسی ای که کاربر وارد کرده را بصورت timestamp در دیتابیس ذخیره کنم، و بعد موقعی که قرار است این تاریخ در گزارش نمایش داده شود ،داده ذخیره شده در دیتابیس را چگونه به تاریخ شمسی تبدیل کنم؟
یه سوال دیگه هم داشتم مثلا اگر خواسته باشم داده های هفته اول آبان ماه رو استخراج کنم چه کوئری ای باید بزنم ؟؟
لطفا بهم کمک کنید من نیاز خیلی شدیدی به این کد دارم

اگه استفاده از timestamp جواب نمیده من از چی باید استفاده کنم؟
ممنونم

Bahram0110
پنج شنبه 14 شهریور 1387, 11:36 صبح
من چگونه این تاریخ شمسی ای که کاربر وارد کرده را بصورت timestamp در دیتابیس ذخیره کنم
تاریخ شمسی رو به میلادی تبدیل کن بعد میلادی رو به timestamp

roya2002_80
پنج شنبه 14 شهریور 1387, 12:10 عصر
ممنون
حالا چطور می تونم هفته اول آبان ماه رو استخراج کنم
اگه ممکنه کدش روبرام بزارین

maysamscript
پنج شنبه 14 شهریور 1387, 12:56 عصر
من می خوام توی دیتا بیس تاریخ روذخیره کنم ،که تایپ فیلد رو timestamp گرفتم
لازم نیست نوع فیلد رو در دیتابیس timestamp قرار بدید.
یک فیلد ایجاد کنید از نوع int با طول حداقل 10

در فرمی که من طراحی کردم،کاربر تاریخ را به صورت تاریخ شمسی وارد می کند سوال من این هست که من چگونه این تاریخ شمسی ای که کاربر وارد کرده را بصورت timestamp در دیتابیس ذخیره کنم
کافیه تاریخی که کاربر وارد میکنه رو تبدیل به timestamp کنید و در دیتابیس ذخیره کنید.
مثلاً تاریخ 1387 / 6 / 14 رو میخوایم تبدیل کنیم به timestamp:
ابتدا تاریخ باید از شمسی به میلادی تبدیل بشه. تابعی که این کار رو انجام بده در سایت موجود هست
خوب تاریخ تبدیل شد به 2008 / 9 / 4 . این تاریخ رو اینجوری به timestamp تبدیل کنید:


$timestamp=gmmktime(0,0,0,9,4,2008);

این timestamp رو در دیتابیس ذخیره کنید. توجه کنید که به جای gmmktime از mktime هم میتونید استفاده کنید ولی بهتره که از همون gmmktime استفاده کنید چون تاریخ رو برحسب GMT به timestamp تبدیل میکنه. توصیه میکنم همیشه از تابع gmdate بجای date برای گرفتن تاریخ استفاده کنید. اینجوری برنامتون محدود به Time zone هاستی که استفاده میکنید نمیشه.

و بعد موقعی که قرار است این تاریخ در گزارش نمایش داده شود ،داده ذخیره شده در دیتابیس را چگونه به تاریخ شمسی تبدیل کنم؟
اگه تو سایت سرچ کنی یه تابع pdate هست که بچه ها نوشتن میتونی اینجوری استفاده کنی

echo pdate("Y / m / d", $timestamp);

یه سوال دیگه هم داشتم مثلا اگر خواسته باشم داده های هفته اول آبان ماه رو استخراج کنم چه کوئری ای باید بزنم ؟؟

منظورت از هفته های اول آبان ماه چیه؟
اگر خواسته باشی ماه آبان رو استخراج کنی راهش اینه:
ابتدا تاریخ 1387 / 8 / 1 را با روشی که گفتم به timestamp تبدیل کن. سپس تاریخ پایان اون ماه رو هم به timestamp تبدیل کن یعنی تاریخ 1387 / 8 / 31 . تایم استمپ های به دست اومده رو اینجوری تو کوئری قرار بده.
فرض کنید متغیر $ts_start متعلق به شروع تاریخ باشد و $ts_end هم متعلق به اتمام تاریخ.


$query="SELECT * FROM table WHERE timestamp BETWEEN $ts_start AND $ts_end ";

roya2002_80
شنبه 16 شهریور 1387, 09:33 صبح
از جوابی که دادید خیلی ممنونم
زمان در دیتا بیس چگونه ذخیره می شود؟ به صورت timestamp ؟
اگه ممکنه کدشو برام بنویسید

maysamscript
شنبه 16 شهریور 1387, 12:11 عصر
زمان در دیتا بیس چگونه ذخیره می شود؟ به صورت timestamp ؟
آره شما با timestamp میتونی از ثانیه گرفته تا سال رو استخراج کنی


$timestamp=time()+1*3600+45*60+5;//زمان و تاریخ جاری سیستم به صورت تایم استمپ باضافه یک ساعت و 45 دقیقه و 5 ثانیه
echo gmdate("Y / m / d H:i:s",$timestamp);

roya2002_80
یک شنبه 17 شهریور 1387, 09:30 صبح
از جوابی که دادید ممنونم
اما زمان را اشتباه ذخیره می کنه ؟
کد من بصورت زیر است
$arr=jalali_to_gregorian($_FORM['syear'],$_FORM['smonth'],$_FORM['sday']);

$timestamp_accidence=gmmktime($_FORM['hour'],$_FORM['minute'],0,$arr[1],$arr[2],$arr[0]);

echo pdate("Y / m / d H:i:s A",$timestamp_accidence);

اما زمان را اشتباه چاپ می کنه اشکال کجاست؟

maysamscript
یک شنبه 17 شهریور 1387, 10:13 صبح
زمانی که چاپ میشه زمان GMT هست یعنی یه اختلافی با زمان خودت داره. اگر میخوای زمان محلی نشون داده بشه به جای gmdate از date استفاده کن یا اختلاف ساعت رو به تایم استمپ اضافه کن

roya2002_80
یک شنبه 17 شهریور 1387, 11:04 صبح
درسته
همینطور که در پست قبلیم نوشتم ، من می خوام ساعتی که کاربر وارد می کند به صورت محلی ذخیره بشه؟ اینو چه جوری بنویسم؟
ببخشید که اینقدر سوال می کنم

maysamscript
یک شنبه 17 شهریور 1387, 13:08 عصر
کافیه شما زمان را بر حسب GMT ذخیره کنید و برای نمایش در هر محلی به تایم استمپ اون زمان مقداری رو کم یا زیاد کنید.
مثلاً برای ایران باید مقدار 4*3600+30*60 را به timestamp اضافه کنید


ببخشید که اینقدر سوال می کنم
خواهش میکنم..

roya2002_80
یک شنبه 17 شهریور 1387, 13:28 عصر
از جوابی که دادید ممنونم
ولی نمی دونم چرا درست کار نمی کنه من کدی که نوشتم رو اینجا میذارم ببینید اشکالش کجاست؟


$timestamp_accidence=gmmktime(13,30,0,9,7,2008);
$timestamp_accidence=$timestamp_accidence+(4*3600+ 30*60);

echo pdate("H:i:s A",$timestamp_accidence);


زمانی که چاپ می شه باید pm 1:30 باشه اما اشتباه چاپ می کنه

maysamscript
یک شنبه 17 شهریور 1387, 13:47 عصر
تابع pdate رو هم بزارید . به احتمال زیاد pdate ساعت محلی رو میگه و لی شما ساعت محلی رو هم اضافه کردید

roya2002_80
یک شنبه 17 شهریور 1387, 13:50 عصر
کلا اشتباه جواب میده ، اگر هم مقداری اضافه نکنم اشتباه جواب می ده
کد تابع pdate


function pdate($type,$maket="now")
{
global $jalali_weekname,$jalali_monthname;
//set 1 if you want translate number to farsi or if you don't like set 0
$transnumber=0;
///chosse your timezone
$TZhours=0;
$TZminute=0;
$need="";
$result1="";
$result="";
if($maket=="now"){
$maket=time();
}
$maket+=$TZhours*3600+$TZminute*60;
$date=date("Y-m-d",$maket);
list( $year, $month, $day ) = explode ('-',$date);
list( $pyear, $pmonth, $pday ) = gregorian_to_jalali($year, $month, $day);

$need= $maket;
$i=0;
$subtype="";
$subtypetemp="";
while($i<strlen($type))
{
$subtype=$type{$i};
if($subtypetemp=="\\")
{
$result.=$subtype;
$i++;
continue;
}

switch ($subtype)
{

case "A":
$result1=date("a",$need);
if($result1=="pm") $result.= "بعد از ظهر";
else $result.="قبل از ظهر";
break;

case "a":
$result1=date("a",$need);
if($result1=="pm") $result.= "ب.ظ";
else $result.="ق.ظ;";
break;
case "d":
if($pday<10)$result1="0".$pday;
else $result1=$pday;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "D":
$result1=date("w",$need)+1;
if($result1==7)$result1=0;
$result.=substr($jalali_weekname[(int)$result1],0,2);
break;
case "F":
$result.=$jalali_monthname[(int)$pmonth];
break;
case "g":
$result1=date("g",$need);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "G":
$result1=date("G",$need);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "h":
$result1=date("h",$need);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "H":
$result1=date("H",$need);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "i":
$result1=date("i",$need);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "j":
$result1=$pday;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "l":
$result1=date("w",$need)+1;
if($result1==7)$result1=0;
$result.=$jalali_weekname[(int)$result1];
break;
case "m":
if($pmonth<10) $result1="0".$pmonth;
else $result1=$pmonth;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "M":
$result.=substr($jalali_monthname[(int)$pmonth],0,6);
break;
case "n":
$result1=$pmonth;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "N":
$result1=date("N",$need);
if($result1<=5)$result1+2;
else $result1-6;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "s":
$result1=date("s",$need);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "S":
$result.="ام";
break;
case "t":
$result.=number_of_day($pmonth,$pyear);
break;
case "w":
$result1=date("w",$need)+1;
if($result1==7)$result1=0;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "W":
$result1=pweek_of_year($pyear,$pmonth,$pday);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "y":
$result1=substr($pyear,2,4);
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "Y":
case "o":
$result1=$pyear;
if($transnumber==1) $result.=Convertnumber2farsi($result1);
else $result.=$result1;
break;
case "U" :
$result.=time();
break;
case "u" :
$result.=date("u",$need);
break;
case "z" :
$result.=days_of_year($pmonth,$pday,$pyear);
break;
case "Z" :
$result.=date("Z",$need);
break;
case "e" :
$result.=date("e",$need);
break;
case "i" :
$result.=date("e",$need);
break;
case "O" :
$result.=date("O",$need);
break;
case "O" :
$result.=date("O",$need);
break;
case "P" :
$result.=date("P",$need);
break;
case "T" :
$result.=date("P",$need);
break;
case "L" :
if(is_kabise($pyear))$result.="1";
else $result.="0";
break;
default:
$result.=$subtype;
}
$subtypetemp=substr($type,$i,1);
$i++;
}
return $result;
}

maysamscript
یک شنبه 17 شهریور 1387, 14:15 عصر
این مشکل رو من روی لوکال و در ویندوز داشتم. اگر با ویندوز و در لوکال کار میکنید Time zone ویندوز رو روی GMT قرار دهید و کد زیر رو تست کنید


echo date("P");
جواب باید +00:00 باشه
نکته جالب تو ویندوز اینه که اگر Time zone رو تهران باشه کد بالا باید جواب +03:30 را چاپ کنه ولی در عمل 00:00 را چاپ میکنه. این در حالیه که روی مثلا baghdad مقدار +04:00 که برابر اختلاف بغداد با GMT میباشد رو نشون میده. علت رو نمیدونم. به هرحال شما میتونید ساعت رو همیشه روی GMT تنظیم کنید.

roya2002_80
یک شنبه 17 شهریور 1387, 14:37 عصر
یعنی اگه این کد ها آپلود بشه مشکلی پیش نمی یاد؟

maysamscript
یک شنبه 17 شهریور 1387, 14:41 عصر
این کد رو تست کنید


$timestamp_accidence=gmmktime(13,30,0,9,7,2008);
$timestamp_accidence=$timestamp_accidence+4*3600+3 0*60;

echo gmdate("H:i:s ",$timestamp_accidence);

اگر 18:00 رو نشون میده درسته. دقت کنید که ساعت 13:30 با 4:30 جمع شده است
یک بار هم با pdate تست کنید

roya2002_80
دوشنبه 18 شهریور 1387, 10:12 صبح
درست شد ، از شما خیلی ممنونم که وقت گذاشتید و به سوالاتم جواب دادید

abdonsd
شنبه 23 شهریور 1387, 22:11 عصر
سلام
من يك تاريخ ميلادي (گذشته)توي ديتا بيس دارم چطور بايد به timestamp تبديلش كنم تا با تاريخ امروز مقايسش كنم؟

maysamscript
یک شنبه 24 شهریور 1387, 13:20 عصر
سلام

من يك تاريخ ميلادي (گذشته)توي ديتا بيس دارم چطور بايد به timestamp تبديلش كنم تا با تاريخ امروز مقايسش كنم؟
با این
strtotime (http://ir.php.net/manual/en/function.strtotime.php)
یا این
gmktime (http://ir.php.net/manual/en/function.gmmktime.php)
یا این
mktime (http://ir.php.net/manual/en/function.mktime.php)