تاریخ شمسی در سایت

amirtala65

Member
سلام من در حال طراحی اولین سایتم هستم در دیتابیسم تاریخ به صورت میلادی سیو میشه میخواستم برای قسمت درج خبر تاریخ شمسی آن خبر رو قرار بدم چه کار کنم؟
 

ziXet

مدیر انجمن PHP/MYSQL
سلام من در حال طراحی اولین سایتم هستم در دیتابیسم تاریخ به صورت میلادی سیو میشه میخواستم برای قسمت درج خبر تاریخ شمسی آن خبر رو قرار بدم چه کار کنم؟
بهترین راه اینه که تابع ()time رو ذخیره کنی و با استفاده از توابع date و jdate به هر فرمتی که خواستی تبدیل کنی.
 

masima

Member
سلام. میتونی این کدها رو به عنوان صفحه date.php ذخیره کنی. سپس هر جا که نیاز به تاریخ خورشیدی داشتی اون صفحه رو صدا بزنی.
include("date.php");
صفحه date.php
PHP:
<?php
$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);
$j_months = array("فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دي","بهمن","اسفند");
$j_days = array("دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه","یکشنبه");
function div($a, $b)
{
   return (int) ($a / $b);
}
  
function gregorian_to_jalali($g_y, $g_m, $g_d)
{
   global $g_days_in_month;
   global $j_days_in_month;
   
   $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)))
      /**/
      ++$g_day_no;
   $g_day_no += $gd;

   $j_day_no = $g_day_no-79;

   $j_np = div($j_day_no, 12053);
   $j_day_no %= 12053;

   $jy = 979+33*$j_np+4*div($j_day_no,1461);

   $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 farsinum($str)
{
  if (strlen($str) == 1)
      $str = "0".$str;
  $out = "";
  for ($i = 0; $i < strlen($str); ++$i) {
    $c = substr($str, $i, 1);
    $out .= pack("C*", 0xDB, 0xB0 + $c);
  }
  return $out;
}

/**/
function parsnum($str)
{
    $out = "";
    $insideTag = false;
    $besideEn = false;
    
    for ($i = 0; $i < strlen($str); ++$i)
    {
        $c = substr($str, $i, 1);
        $b = @substr($str, $i-1, 1);
        $n = @substr($str, $i+1, 1);

        if(ord($c) == 60)
            $insideTag = true;
        if(ord($c) == 62)
            $insideTag = false;
        
        if(preg_match("/[a-zA-Z]/",$b)||preg_match("/[a-zA-Z]/",$n))
            $besideEn = true;
        if(preg_match("[\\s ]",$b)||preg_match("[\\s ]",$n))
            $besideEn = false;
            
        if(ord($c)>47 && ord($c)<58 && !$insideTag && !$besideEn)
            $out .= pack("C*", 0xDB, 0xB0 + $c);
        else
            $out .= $c;
    }
    return $out;
}

function yekta()
{
  $datestamp = date("Y-m-d");
  global $j_months;
  global $j_days;
  $tzoffset = 0;
  list($date,$time) = explode(" ",$datestamp);
  list($year,$month,$day) = explode("-",$date);
  list($hour,$minute,$second) = explode(":",$time);
  $hour = $hour + $tzoffset;

  list($jyear, $jmonth, $jday) = gregorian_to_jalali($year,$month,$day);
  
  $sDate = $j_days[date("N")-1]." ".parsnum($jday)." ".$j_months[$jmonth-1]." ".farsinum($jyear);
    
  return "<span lang='fa' dir='rtl'>" . $sDate . "</span>";
}
echo yekta();
?>
 

amirtala65

Member
سلام ببخشید من برای اینکه این تاریخ رو توی ستون date جدولم قرار بدم چیکار باید بکنم همچنین نوع ستونم در دیتابیس باید چی باشد لطفا کامل توضیح بدید ممنونم
من برای درج در دیتابیس از تابع زیر تاریخ را میگرفتم
PHP:
$date=date("y,m,d");
بعد با INSERT INTO در ستونها درج میکردم
 

Jim Jim

Well-Known Member
فکر کنم به این تابع نیاز نباشه
بعد از اینکه یه ستون در در دیتا بیست با نام date ساختی، type رو برابر timestamp قرار می دی
حالا تاریخ بصورت خودکار در این فیلد ثبت میشه (به میلادی)
حالا برای اینکه بتونی در صفحه بصورت شمسی فراخوانی کنی
باید از توابع date و jdate که در بالا اشاره شد و در انجمن هم آموزش ارائه شده بهره بگیری
 

masima

Member
یک راه میانبر اینه که شما این تاریخ خورشیدی رو در یک فیلد معمولی (نه از نوع date) در پایگاه داده با همون روش insert into که گفتید، ذخیره نمایید. $date=include(date.php); ولی چون از نوع date نیست، شما دیگه نمیتونید عملیات خاص که بعضی وقتها، بعضی ها روی تاریخ انجام میدهند رو انجام بدین. من خودم از این روش استفاده میکنم، چون نیازی به عملیات خاص ندارم! به هر حال اگر اصرار دارید که از روش اصولی برید لینک زیر میتونه مفید باشه براتون. البته برای sql server هست: http://forum.p30parsi.com/showthread.php?t=51102
 

amirtala65

Member
منظورم این است که این تابع رو من در صفحه include میکنم بعد چه جوری در ستون date قرارش بدم
ممنون :rose:
توی ستون جدول من با این دستور شما فقط یه یک درج میشه
 
آخرین ویرایش:

Masoud1365

مدیر انجمن
روش صحیح ذخیره تاریخ به این صورت هست که شما مثلا میایی و تاریخ درج خبر ( یا هر تاریخی که میخواهید ذخیره کنید ) رو به صورت timestamp ذخیره میکنید که به صورت یه عدد مثلا 125412451اینجوری ذخیره میشه !
حالا برای نمایش اون تاریخ با استفاده از توابع تبدیل تاریخ مثلا jdate ( یا توابعی که هست ) اون رو به صورت میلادی یا شمسی یا هر جوری که بخواهید میتونید نمایش بدید !
در ضمن در این روش قابلیت توسعه نرم افزارتون و قدرت مانور شما بسیار بیستر خواهد بود !
موفق باشید :rose:
 

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

بالا