【问题标题】:Convert Jalali calendar to Gregorian by PHP in CodeIgniter在 CodeIgniter 中通过 PHP 将 Jalali 日历转换为公历
【发布时间】:2015-07-13 10:01:48
【问题描述】:

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

$Date = Jalali_to_Georgian(1393,5,28) // Output: "2014/08/19"

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

【问题讨论】:

    标签: php mysql codeigniter georgian persian-calendar


    【解决方案1】:

    通常最好坚持现有的库而不是编写自己的库。 例如,尝试jDateTimeGregorian-Jalali-Date-Convertor

    附:我自己从未尝试过使用它们,但第一个看起来更可靠。

    【讨论】:

    • 谢谢,但是如何将主题与 codeigniter 集成?如何在图书馆中使用它们?
    • 理想情况下,您应该使用composer 或类似工具来集成外部库
    【解决方案2】:

    你可以使用这个功能

    jalali_to_gregorian($year, $month, $day, $separator);
    
    • 带分隔符的示例:

      jalali_to_gregorian(1398, 5, 7, "-"); // Output => 2019-7-29
      
    • 不带分隔符的示例:

      jalali_to_gregorian(1398, 5, 7); // Output => ["2019","7","29"]
      

    这是函数:

    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】:

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

      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);
          }
      }
      

      然后随时使用它:

      Class TestController
      {
          function index()
          {
              $this->load->library('calendar');
              list($year, $month, $day) = $this->calendar->jalali_to_gregorian(1395,5,12);
              echo "$year/$month/$day";
          }
      }
      

      最好的问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        • 2015-11-22
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多