首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CodeIgniter中用PHP将贾拉利历法转换成公历

在CodeIgniter中用PHP将贾拉利历法转换成公历
EN

Stack Overflow用户
提问于 2015-05-04 05:11:14
回答 3查看 9.5K关注 0票数 11

我需要在MySQL中存储波斯(Jalali)日期。我在用CodeIgniter。我需要这样的东西:

代码语言:javascript
复制
$Date = Jalali_to_Georgian(1393,5,28) // Output: "2014/08/19"

我需要为此创建一个新的库吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-06 14:50:23

通常情况下,最好是坚持现有的语言,而不是自己写一个。例如,尝试使用jDateTime格里高利-贾拉利-日期转换器

我自己从来没试过用它们,但第一种看上去更坚固。

票数 6
EN

Stack Overflow用户

发布于 2019-07-27 12:43:49

您可以使用此函数

代码语言:javascript
复制
jalali_to_gregorian($year, $month, $day, $separator);
  • 使用分隔符的示例: jalali_to_gregorian(1398,5,7,"-");//输出=> 2019-7-29
  • 没有分隔符的示例: jalali_to_gregorian(1398,5,7);//输出=> "2019","7","29“

这是一个功能:

代码语言:javascript
复制
function jalali_to_gregorian($jy, $jm, $jd, $mod = '')
{
    if ($jy > 979) {
        $gy = 1600;
        $jy -= 979;
    } else {
        $gy = 621;
    }

    $days = (365 * $jy) + (((int)($jy / 33)) * 8) + ((int)((($jy % 33) + 3) / 4)) + 78 + $jd + (($jm < 7) ? ($jm - 1) * 31 : (($jm - 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;
}
票数 3
EN

Stack Overflow用户

发布于 2019-01-22 20:50:16

首先,在应用程序/库中创建一个名为Calendar.php的库

代码语言:javascript
复制
Class Calendar
{


    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 + $this->div($jy, 33)*8 + $this->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*$this->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*$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_no, 1461); /* 1461 = 365*4 + 4/4 */
        $g_day_no %= 1461;

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

            $g_day_no--;
            $gy += $this->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);
    }
}

然后随时随地使用它:

代码语言:javascript
复制
Class TestController
{
    function index()
    {
        $this->load->library('calendar');
        list($year, $month, $day) = $this->calendar->jalali_to_gregorian(1395,5,12);
        echo "$year/$month/$day";
    }
}

诚挚的问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30023000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档