تاریخ میلادی به شمسی

sogoli

Active Member
باسلام
من قصد دارم یک فرم بسازم که یکی از فیلدهای ان مربوط به تاریخ باشد یعنی کاربر بتواند در ان تاریخ شمسی را وارد نماید لذا
من یک تیبل در mysql ساختم که یکی از فیلدهای ان را از نوع date انتخاب کردم وسپس با php dیک فرم طراحی کردم که دران میتوان از همان فیلد تاریخ استفاده کرد ولی مشکل اینجاست که تاریخ را بصورت میلادی می باشد
ممنون میشم راهنمایی بفرمایید چگونه میشه تبدیل به تاریخ فارسی کرد
 

tabib_m

Member
در مورد تبدیل تاریخ قبلا بحث شده، اگر جستجو کنی حتما پیدا میکنی.

اما در کل نمیتونی فیلد تاریخت رو برای ثبت تاریخ شمسی از نوع date انتخاب کنی. (دلیلش مهم نیست، اگر اصرار داشتی، بگو تا بگم)

بهترین راه از نظر من برای ثبت تاریخ (البته نه در حالات خاص) اینه که ثانیه های گذشته از مبدأ تاریخ لینوکس رو ثبت کنی (که دیگه ربطی به میلادی و هجری بودن نداره و میتونی در هر دو مورد ازش استفاده کنی)

موفق باشید
 

solartec

Member
من از این کد برای تبدیل تاریخ شمسی به میلادی و میلادی به شمسی استفاده می کنم
PHP:
function div($a,$b) {
    return (int) ($a / $b);
}
function gregorian_to_jalali ($g_y, $g_m, $g_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);     
    

   $gy = $g_y-1600; 
   $gm = $g_m-1; 
   $gd = $g_d-1; 
   $g_day_no = 365*$gy+div($gy+3,4)-div($gy+99,100)+div($gy+399,400); 
   for ($i=0; $i < $gm; ++$i) 
      $g_day_no += $g_days_in_month[$i]; 
   if ($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0))) 
      /* leap and after Feb */ 
      $g_day_no++; 
   $g_day_no += $gd; 
   $j_day_no = $g_day_no-79; 
   $j_np = div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */ 
   $j_day_no = $j_day_no % 12053; 
   $jy = 979+33*$j_np+4*div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */ 
   $j_day_no %= 1461; 
   if ($j_day_no >= 366) { 
      $jy += div($j_day_no-1, 365); 
      $j_day_no = ($j_day_no-1)%365; 
   } 
   for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i) 
      $j_day_no -= $j_days_in_month[$i]; 
   $jm = $i+1; 
   $jd = $j_day_no+1; 
   return array($jy, $jm, $jd); 
} 
function jalali_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);
    
   
   $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); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */ 
   $g_day_no = $g_day_no % 146097; 
   $leap = true; 
   if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */ 
   { 
      $g_day_no--; 
      $gy += 100*div($g_day_no,  36524); /* 36524 = 365*100 + 100/4 - 100/100 */ 
      $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); /* 1461 = 365*4 + 4/4 */ 
   $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 && $leap); $i++) 
      $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap); 
   $gm = $i+1; 
   $gd = $g_day_no+1; 
   return array($gy, $gm, $gd); 
}

 //
$TTD=date("Y.m.d ");
// date
$TDy=date("Y");
$TDm=date("m");
$TDd=date("d");
// time
$TDh=date("H");
$TDi=date("i");
$TDs=date("s");
$gtime=$TDh.":".$TDi.":".$TDs;
$gdate=$TDy."-".$TDm."-".$TDd;
//$gdate=$TTD;
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
$jdate = $jyear."/".$jmonth."/".$jday;
print "<br>هجری  شمسی  <br>".$jdate." <br>";
$jdate=$jdate; //$jdate="1363/3/5";
list( $jyear, $jmonth, $jday ) = preg_split ( '/\//', $jdate );
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, $jday);
$gdate = $gyear."/".$gmonth."/".$gday;
print"<br> میلادی   <br>  "; print"". $gdate;

می تونی به جای $TTD از رکوردی که از دیتا بیس کرفتین استفاده کنید.​
 

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

بالا