persian_date-8.x-4.1/src/Converter/PersianDate.php

src/Converter/PersianDate.php
<?php

/*
 * This file is part of the Persian Date (Object Oriented API) package.
 *
 * (c) Amin Alizade <motammem@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Drupal\persian_date\Converter;


/**
 * This class hold time and represents it in Persian Date format.
 *
 * @package Drupal\persian_date\Convertor
 */
class PersianDate extends \DateTime
{
    /**
     * Builds original PHP DateTime class.
     *
     * @return \DateTime
     */
    public function getOriginalDateTime()
    {
        $object = new parent();
        $object->setTimestamp($this->getTimestamp());
        $object->setTimezone($this->getTimezone());
        return $object;
    }

    /**
     * @inheritDoc
     */
    public function format($format)
    {
        $T_sec = 0;/* <= ??? ???? ???? ???? ? ?? ????? '+' ? '-' ?? ??? ????? */

        if ($this->getTimezone()->getName() != 'local') date_default_timezone_set(($this->getTimezone()->getName() == '') ? 'Asia/Tehran' : $this->getTimezone()->getName());
        $ts = $T_sec + (($this->getTimestamp() == '' or $this->getTimestamp() == 'now') ? time() : $this->getTimestamp());
        $date = explode('_', date('H_i_j_n_O_P_s_w_Y', $ts));
        list($j_y, $j_m, $j_d) = PersianDateConverter::gregorian_to_jalali($date[8], $date[3], $date[2]);
        $doy = ($j_m < 7) ? (($j_m - 1) * 31) + $j_d - 1 : (($j_m - 7) * 30) + $j_d + 185;
        $kab = ($j_y % 33 % 4 - 1 == (int)($j_y % 33 * .05)) ? 1 : 0;
        $sl = strlen($format);
        $out = '';
        for ($i = 0; $i < $sl; $i++) {
            $sub = substr($format, $i, 1);
            if ($sub == '\\') {
                $out .= substr($format, ++$i, 1);
                continue;
            }
            switch ($sub) {
                case'E':case'R':case'x':case'X':
                $out.='http://jdf.scr.ir';
                break;

                case'B':case'e':case'g':
                case'G':case'h':case'I':
                case'T':case'u':case'Z':
                $out.=date($sub,$ts);
                break;

                case'a':
                    $out.=($date[0]<12)?'ق.ظ':'ب.ظ';
                    break;

                case'A':
                    $out.=($date[0]<12)?'قبل از ظهر':'بعد از ظهر';
                    break;

                case'b':
                    $out.=(int)($j_m/3.1)+1;
                    break;

                case'c':
                    $out.=$j_y.'/'.$j_m.'/'.$j_d.' ،'.$date[0].':'.$date[1].':'.$date[6].' '.$date[5];
                    break;

                case'C':
                    $out.=(int)(($j_y+99)/100);
                    break;

                case'd':
                    $out.=($j_d<10)?'0'.$j_d:$j_d;
                    break;

                case'D':
                    $out.=$this->persianWords(array('rh'=>$date[7]),' ');
                    break;

                case'f':
                    $out.=$this->persianWords(array('ff'=>$j_m),' ');
                    break;

                case'F':
                    $out.=$this->persianWords(array('mm'=>$j_m),' ');
                    break;

                case'H':
                    $out.=$date[0];
                    break;

                case'i':
                    $out.=$date[1];
                    break;

                case'j':
                    $out.=$j_d;
                    break;

                case'J':
                    $out.=$this->persianWords(array('rr'=>$j_d),' ');
                    break;

                case'k';
                    $out.=(100-(int)($doy/($kab+365)*1000)/10);
                    break;

                case'K':
                    $out.=((int)($doy/($kab+365)*1000)/10);
                    break;

                case'l':
                    $out.=$this->persianWords(array('rh'=>$date[7]),' ');
                    break;

                case'L':
                    $out.=$kab;
                    break;

                case'm':
                    $out.=($j_m>9)?$j_m:'0'.$j_m;
                    break;

                case'M':
                    $out.=$this->persianWords(array('km'=>$j_m),' ');
                    break;

                case'n':
                    $out.=$j_m;
                    break;

                case'N':
                    $out.=$date[7]+1;
                    break;

                case'o':
                    $jdw=($date[7]==6)?0:$date[7]+1;
                    $dny=364+$kab-$doy;
                    $out.=($jdw>($doy+3) and $doy<3)?$j_y-1:(((3-$dny)>$jdw and $dny<3)?$j_y+1:$j_y);
                    break;

                case'O':
                    $out.=$date[4];
                    break;

                case'p':
                    $out.=$this->persianWords(array('mb'=>$j_m),' ');
                    break;

                case'P':
                    $out.=$date[5];
                    break;

                case'q':
                    $out.=$this->persianWords(array('sh'=>$j_y),' ');
                    break;

                case'Q':
                    $out.=$kab+364-$doy;
                    break;

                case'r':
                    $key=$this->persianWords(array('rh'=>$date[7],'mm'=>$j_m));
                    $out.=$date[0].':'.$date[1].':'.$date[6].' '.$date[4]
                        .' '.$key['rh'].'، '.$j_d.' '.$key['mm'].' '.$j_y;
                    break;

                case's':
                    $out.=$date[6];
                    break;

                case'S':
                    $out.='ام';
                    break;

                case't':
                    $out.=($j_m!=12)?(31-(int)($j_m/6.5)):($kab+29);
                    break;

                case'U':
                    $out.=$ts;
                    break;

                case'v':
                    $out.=$this->persianWords(array('ss'=>substr($j_y,2,2)),' ');
                    break;

                case'V':
                    $out.=$this->persianWords(array('ss'=>$j_y),' ');
                    break;

                case'w':
                    $out.=($date[7]==6)?0:$date[7]+1;
                    break;

                case'W':
                    $avs=(($date[7]==6)?0:$date[7]+1)-($doy%7);
                    if($avs<0)$avs+=7;
                    $num=(int)(($doy+$avs)/7);
                    if($avs<4){
                        $num++;
                    }elseif($num<1){
                        $num=($avs==4 or $avs==(($j_y%33%4-2==(int)($j_y%33*.05))?5:4))?53:52;
                    }
                    $aks=$avs+$kab;
                    if($aks==7)$aks=0;
                    $out.=(($kab+363-$doy)<$aks and $aks<3)?'01':(($num<10)?'0'.$num:$num);
                    break;

                case'y':
                    $out.=substr($j_y,2,2);
                    break;

                case'Y':
                    $out.=$j_y;
                    break;

                case'z':
                    $out.=$doy;
                    break;
                default:
                    $out .= $sub;
            }
        }
        return $out;
    }

    /**
     * @inheritDoc
     */
    public function setDate($year, $month, $day)
    {
        list($gy, $gm, $gd) = PersianDateConverter::jalali_to_gregorian($year, $month, $day);
        parent::setDate($gy, $gm, $gd);
    }

    private function persianWords($array, $mod = '')
    {
        foreach ($array as $type => $num) {
            $num = (int)($num);
            switch ($type) {

                case'ss':
                    $sl=strlen($num);
                    $xy3=substr($num,2-$sl,1);
                    $h3=$h34=$h4='';
                    if($xy3==1){
                        $p34='';
                        $k34=array('ده','یازده','دوازده','سیزده','چهارده','پانزده','شانزده','هفده','هجده','نوزده');
                        $h34=$k34[substr($num,2-$sl,2)-10];
                    }else{
                        $xy4=substr($num,3-$sl,1);
                        $p34=($xy3==0 or $xy4==0)?'':' و ';
                        $k3=array('','','بیست','سی','چهل','پنجاه','شصت','هفتاد','هشتاد','نود');
                        $h3=$k3[$xy3];
                        $k4=array('','یک','دو','سه','چهار','پنج','شش','هفت','هشت','نه');
                        $h4=$k4[$xy4];
                    }
                    $array[$type]=(($num>99)?str_ireplace(array('12','13','14','19','20')
                                ,array('هزار و دویست','هزار و سیصد','هزار و چهارصد','هزار و نهصد','دوهزار')
                                ,substr($num,0,2)).((substr($num,2,2)=='00')?'':' و '):'').$h3.$p34.$h34.$h4;
                    break;

                case'mm':
                    $key=array
                    ('فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند');
                    $array[$type]=$key[$num-1];
                    break;

                case'rr':
                    $key=array('یک','دو','سه','چهار','پنج','شش','هفت','هشت','نه','ده','یازده','دوازده','سیزده'
                    ,'چهارده','پانزده','شانزده','هفده','هجده','نوزده','بیست','بیست و یک','بیست و دو','بیست و سه'
                    ,'بیست و چهار','بیست و پنج','بیست و شش','بیست و هفت','بیست و هشت','بیست و نه','سی','سی و یک');
                    $array[$type]=$key[$num-1];
                    break;

                case'rh':
                    $key=array('یکشنبه','دوشنبه','سه شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه');
                    $array[$type]=$key[$num];
                    break;

                case'sh':
                    $key=array('مار','اسب','گوسفند','میمون','مرغ','سگ','خوک','موش','گاو','پلنگ','خرگوش','نهنگ');
                    $array[$type]=$key[$num%12];
                    break;

                case'mb':
                    $key=array('حمل','ثور','جوزا','سرطان','اسد','سنبله','میزان','عقرب','قوس','جدی','دلو','حوت');
                    $array[$type]=$key[$num-1];
                    break;

                case'ff':
                    $key=array('بهار','تابستان','پاییز','زمستان');
                    $array[$type]=$key[(int)($num/3.1)];
                    break;

                case'km':
                    $key=array('فر','ار','خر','تی‍','مر','شه‍','مه‍','آب‍','آذ','دی','به‍','اس‍');
                    $array[$type]=$key[$num-1];
                    break;

                case'kh':
                    $key=array('ی','د','س','چ','پ','ج','ش');
                    $array[$type]=$key[$num];
                    break;

                default:$array[$type]=$num;
            }
        }
        return ($mod == '') ? $array : implode($mod, $array);
    }

    public function ago()
    {
        $now = time();
        $time = $this->getTimestamp();
        // catch error
        if (!$time) {
            return false;
        }
        // build period and length arrays
        $periods = array('ثانیه', 'دقیقه', 'ساعت', 'روز', 'هفته', 'ماه', 'سال', 'قرن');
        $lengths = array(60, 60, 24, 7, 4.35, 12, 10);
        // get difference
        $difference = $now - $time;
        // set descriptor
        if ($difference < 0) {
            $difference = abs($difference); // absolute value
            $negative = true;
        }
        // do math
        for ($j = 0; $difference >= $lengths[$j] and $j < count($lengths) - 1; $j++) {
            $difference /= $lengths[$j];
        }
        // round difference
        $difference = intval(round($difference));
        // return
        return number_format($difference) . ' ' . $periods[$j] . ' ' . (isset($negative) ? '' : 'پیش');
    }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc