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

src/Converter/PersianDateConverter.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;
use Drupal\Core\Datetime\DrupalDateTime;
use ReflectionObject;


/**
 * This class converts Gregorian datetime to Persian datetime and reverse.
 *
 * @package Drupal\persian_date\Convertor
 */
class PersianDateConverter
{
    /**
     * Convert Gregorian date parameters to Persian.
     *
     * @param int $year Gregorian year
     * @param int $month Gregorian month
     * @param int $day Gregorian day
     * @param string $mod
     * @return array|string
     */
    static function gregorian_to_jalali($year, $month, $day, $mod = '')
    {
        $g_d_m = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
        $jy = ($year <= 1600) ? 0 : 979;
        $year -= ($year <= 1600) ? 621 : 1600;
        $gy2 = ($month > 2) ? ($year + 1) : $year;
        $days = (365 * $year) + ((int)(($gy2 + 3) / 4)) - ((int)(($gy2 + 99) / 100))
            + ((int)(($gy2 + 399) / 400)) - 80 + $day + $g_d_m[$month - 1];
        $jy += 33 * ((int)($days / 12053));
        $days %= 12053;
        $jy += 4 * ((int)($days / 1461));
        $days %= 1461;
        $jy += (int)(($days - 1) / 365);
        if ($days > 365) $days = ($days - 1) % 365;
        $jm = ($days < 186) ? 1 + (int)($days / 31) : 7 + (int)(($days - 186) / 30);
        $jd = 1 + (($days < 186) ? ($days % 31) : (($days - 186) % 30));
        return ($mod == '') ? array($jy, $jm, $jd) : $jy . $mod . $jm . $mod . $jd;
    }


    /**
     * Convert Persian date parameters to Gregorian.
     *
     * @param int $year Persian year
     * @param int $month Persian month
     * @param int $day Persian day
     * @param string $mod
     * @return array|string
     */
    static function jalali_to_gregorian($year, $month, $day, $mod = '')
    {
        $gy = ($year <= 979) ? 621 : 1600;
        $year -= ($year <= 979) ? 0 : 979;
        $days =
          (365 * $year) +
          (((int)($year / 33)) * 8) +
          ((int)((($year % 33) + 3) / 4)) +
          78 + (int)$day + (((int)$month < 7) ? (((int)$month - 1) * 31) : ((((int)$month - 7) * 30) + 186));
        $gy += 400 * ((int)($days / 146097));
        $days %= 146097;
        if ($days > 36524) {
            $gy += 100 * ((int)(--$days / 36524));
            $days %= 36524;
            if ($days >= 365) $days++;
        }
        $gy += 4 * ((int)(($days) / 1461));
        $days %= 1461;
        $gy += (int)(($days - 1) / 365);
        if ($days > 365) $days = ($days - 1) % 365;
        $gd = $days + 1;
        foreach (array(0, 31, (($gy % 4 == 0 and $gy % 100 != 0) or ($gy % 400 == 0)) ? 29 : 28
                 , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) as $gm => $v) {
            if ($gd <= $v) break;
            $gd -= $v;
        }
        return ($mod == '') ? array($gy, $gm, $gd) : $gy . $mod . $gm . $mod . $gd;
    }

    /**
     * Converts wrongly formatted shamsi datetime to standard one
     *
     * @param mixed $dateTime
     * @return \DateTime
     */
    public static function normalizeDate($dateTime)
    {
        $return =  PersianDateFactory::buildFromExactDate(
            $dateTime->format('H'),
            $dateTime->format('i'),
            $dateTime->format('s'),
            $dateTime->format('m'),
            $dateTime->format('d'),
            $dateTime->format('Y')
        )->getOriginalDateTime();

        return $return;
    }
}

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

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