Persian Date Helper

By Arash Hemmat (arash.hemmat)
As there is no method for using Persian dates in PHP we had to use some codes to convert the dates. Using this helper you can convert the dates in a view. Use pdate_format() just like date() function in PHP.

Helper Class:

Download code <?php 

/* Persian date helper
 * These functions are simillar to date function in PHP you can find more about it in http://persiandates.osp.ir
 * @author 2000  Roozbeh Pournader and Mohammad Toossi
 * @author 2003-2007  Milad Rastian
 * @author 2003-2007  Arash Hemmat www.hemmat.biz
 * @version 1.0
 * @license http://www.opensource.org/licenses/mit-license.php
 */ 

class PersianDateHelper extends Helper
{


    
/*
     * convert and formats the given time stamp string to the Persian date.
     * format strings are the same with php date function. 
     */
    
function pdate_format($time_stamp,$format='j F Y')
    {
        return 
$this->pdate($format,strtotime($time_stamp));
    }
    
    function 
pdate($type,$maket="now")
    {
        
//set 1 if you want translate number to farsi or if you don't like set 0
        
$transnumber=1;
        
///chosse your timezone
        
$TZhours=0;
        
$TZminute=0;

        if(
$maket=="now"){
            
$year=date("Y");
            
$month=date("m");
            
$day=date("d");
            list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
            
$maket=$this->pmktime(date("h")+$TZhours,date("i")+$TZminute,date("s"),$jmonth,$jday,$jyear);
        }else{
            
$maket+=$TZhours*3600+$TZminute*60;
            
$date=date("Y-m-d",$maket);
            list( 
$year$month$day ) = preg_split '/-/'$date );

            list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
        }

        
$need$maket;
        
$year=date("Y",$need);
        
$month=date("m",$need);
        
$day=date("d",$need);
        
$result=null;
        
$i=0;
        while(
$i<strlen($type))
        {
            
$subtype=substr($type,$i,1);
            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":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    if(
$jday<10)$result1="0".$jday;
                    else     
$result1=$jday;
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"D":
                    
$result1=date("D",$need);
                    if(
$result1=="Thu"$result1="?";
                    else if(
$result1=="Sat"$result1="?";
                    else if(
$result1=="Sun"$result1="?";
                    else if(
$result1=="Mon"$result1="?";
                    else if(
$result1=="Tue"$result1="?";
                    else if(
$result1=="Wed"$result1="?";
                    else if(
$result1=="Thu"$result1="?";
                    else if(
$result1=="Fri"$result1="?";
                    
$result.=$result1;
                    break;
                case
"F":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    
$result.=$this->monthname($jmonth);
                    break;
                case 
"g":
                    
$result1=date("g",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"G":
                    
$result1=date("G",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"h":
                    
$result1=date("h",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"H":
                    
$result1=date("H",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"i":
                    
$result1=date("i",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"j":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    
$result1=$jday;
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"l":
                    
$result1=date("l",$need);
                    if(
$result1=="Saturday"$result1="????";
                    else if(
$result1=="Sunday"$result1="??????";
                    else if(
$result1=="Monday"$result1="??????";
                    else if(
$result1=="Tuesday"$result1="?? ????";
                    else if(
$result1=="Wednesday"$result1="????????";
                    else if(
$result1=="Thursday"$result1="???????";
                    else if(
$result1=="Friday"$result1="????";
                    
$result.=$result1;
                    break;
                case 
"m":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    if(
$jmonth<10$result1="0".$jmonth;
                    else    
$result1=$jmonth;
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"M":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    
$result.=$this->monthname($jmonth);
                    break;
                case 
"n":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    
$result1=$jmonth;
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"s":
                    
$result1=date("s",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"S":
                    
$result.="??";
                    break;
                case 
"t":
                    
$result.=$this->lastday ($month,$day,$year);
                    break;
                case 
"w":
                    
$result1=date("w",$need);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"y":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    
$result1=substr($jyear,2,4);
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                case 
"Y":
                    list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
                    
$result1=$jyear;
                    if(
$transnumber==1$result.=$this->Convertnumber2farsi($result1);
                    else 
$result.=$result1;
                    break;
                default:
                    
$result.=$subtype;
            }
            
$i++;
        }
        return 
$result;
    }



    function 
pmktime($hour,$minute,$second,$jmonth,$jday,$jyear)
    {
        list( 
$year$month$day ) = $this->jalali_to_gregorian($jyear$jmonth$jday);
        
$i=mktime($hour,$minute,$second,$month,$day,$year);
        return 
$i;
    }


    
///Find Day Begining Of Month
    
function mstart($month,$day,$year)
    {
        list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
        list( 
$year$month$day ) = $this->jalali_to_gregorian($jyear$jmonth"1");
        
$timestamp=mktime(0,0,0,$month,$day,$year);
        return 
date("w",$timestamp);
    }

    
//Find Number Of Days In This Month
    
function lastday ($month,$day,$year)
    {
        
$lastdayen=date("d",mktime(0,0,0,$month+1,0,$year));
        list( 
$jyear$jmonth$jday ) = $this->gregorian_to_jalali($year$month$day);
        
$lastdatep=$jday;
        
$jday=$jday2;
        while(
$jday2!="1")
        {
            if(
$day<$lastdayen)
            {
                
$day++;
                list( 
$jyear$jmonth$jday2 ) = $this->gregorian_to_jalali($year$month$day);
                if(
$pdate2=="1") break;
                if(
$pdate2!="1"$lastdatep++;
            }
            else
            {
                
$day=0;
                
$month++;
                if(
$month==13)
                {
                    
$month="1";
                    
$year++;
                }
            }

        }
        return 
$lastdatep-1;
    }

    
//translate number of month to name of month
    
function monthname($month)
    {

        if(
$month=="01") return "???????";

        if(
$month=="02") return "????????";

        if(
$month=="03") return "?????";

        if(
$month=="04") return  "???";

        if(
$month=="05") return "?????";

        if(
$month=="06") return "??????";

        if(
$month=="07") return "???";

        if(
$month=="08") return "????";

        if(
$month=="09") return "???";

        if(
$month=="10") return "??";

        if(
$month=="11") return "????";

        if(
$month=="12") return "?????";
    }

    
////here convert to  number in persian
    
function Convertnumber2farsi($srting)
    {
        
$num0="?";
        
$num1="?";
        
$num2="?";
        
$num3="?";
        
$num4="?";
        
$num5="?";
        
$num6="?";
        
$num7="?";
        
$num8="?";
        
$num9="?";

        
$stringtemp="";
        
$len=strlen($srting);
        for(
$sub=0;$sub<$len;$sub++)
        {
            if(
substr($srting,$sub,1)=="0")$stringtemp.=$num0;
            elseif(
substr($srting,$sub,1)=="1")$stringtemp.=$num1;
            elseif(
substr($srting,$sub,1)=="2")$stringtemp.=$num2;
            elseif(
substr($srting,$sub,1)=="3")$stringtemp.=$num3;
            elseif(
substr($srting,$sub,1)=="4")$stringtemp.=$num4;
            elseif(
substr($srting,$sub,1)=="5")$stringtemp.=$num5;
            elseif(
substr($srting,$sub,1)=="6")$stringtemp.=$num6;
            elseif(
substr($srting,$sub,1)=="7")$stringtemp.=$num7;
            elseif(
substr($srting,$sub,1)=="8")$stringtemp.=$num8;
            elseif(
substr($srting,$sub,1)=="9")$stringtemp.=$num9;
            else 
$stringtemp.=substr($srting,$sub,1);

        }
        return   
$stringtemp;

    }
///end conver to number in persian






    
function div($a,$b) {
        return (int) (
$a $b);
    }

    function 
gregorian_to_jalali ($g_y$g_m$g_d)
    {
        
$g_days_in_month = array(312831303130313130313031);
        
$j_days_in_month = array(313131313131303030303029);



         

        
$gy $g_y-1600;
        
$gm $g_m-1;
        
$gd $g_d-1;

        
$g_day_no 365*$gy+$this->div($gy+3,4)-$this->div($gy+99,100)+$this->div($gy+399,400);

        for (
$i=0$i $gm; ++$i)
        
$g_day_no += $g_days_in_month[$i];
        if (
$gm>&& (($gy%4==&& $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 $this->div($j_day_no12053); /* 12053 = 365*33 + 32/4 */
        
$j_day_no $j_day_no 12053;

        
$jy 979+33*$j_np+4*$this->div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */

        
$j_day_no %= 1461;

        if (
$j_day_no >= 366) {
            
$jy += $this->div($j_day_no-1365);
            
$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(312831303130313130313031);
        
$j_days_in_month = array(313131313131303030303029);

         

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

        
$j_day_no 365*$jy $this->div($jy33)*$this->div($jy%33+34);
        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*$this->div($g_day_no146097); /* 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*$this->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*$this->div($g_day_no1461); /* 1461 = 365*4 + 4/4 */
        
$g_day_no %= 1461;

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

            
$g_day_no--;
            
$gy += $this->div($g_day_no365);
            
$g_day_no $g_day_no 365;
        }

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

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

}
?>

 

Comments 591

CakePHP Team Comments Author Comments
 

Comment

1 Thank you Buddy

Nice Helper for persion ;)
Posted Mar 1, 2008 by Ali Pour Zahmatkesh