I18N_Arabic
[ class tree: I18N_Arabic ] [ index: I18N_Arabic ] [ all elements ]

Source for file Mktime.php

Documentation is available at Mktime.php

  1. <?php
  2. /**
  3.  * ----------------------------------------------------------------------
  4.  *  
  5.  * Copyright (c) 2006-2016 Khaled Al-Sham'aa.
  6.  *  
  7.  * http://www.ar-php.org
  8.  *  
  9.  * PHP Version 5
  10.  *  
  11.  * ----------------------------------------------------------------------
  12.  *  
  13.  * LICENSE
  14.  *
  15.  * This program is open source product; you can redistribute it and/or
  16.  * modify it under the terms of the GNU Lesser General Public License (LGPL)
  17.  * as published by the Free Software Foundation; either version 3
  18.  * of the License, or (at your option) any later version.
  19.  *  
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU Lesser General Public License for more details.
  24.  *  
  25.  * You should have received a copy of the GNU Lesser General Public License
  26.  * along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>.
  27.  *  
  28.  * ----------------------------------------------------------------------
  29.  *  
  30.  * Class Name: Arabic Maketime
  31.  *  
  32.  * Filename:   Mktime.php
  33.  *  
  34.  * Original    Author(s): Khaled Al-Sham'aa <khaled@ar-php.org>
  35.  *  
  36.  * Purpose:    Arabic customization for PHP mktime function
  37.  *  
  38.  * ----------------------------------------------------------------------
  39.  *  
  40.  * Arabic Maketime
  41.  *
  42.  * PHP class for Arabic and Islamic customization of PHP mktime function.
  43.  * It can convert Hijri date into UNIX timestamp format
  44.  *
  45.  * Unix time() value:
  46.  * 
  47.  * Development of the Unix operating system began at Bell Laboratories in 1969 by
  48.  * Dennis Ritchie and Ken Thompson, with the first PDP-11 version becoming
  49.  * operational in February 1971. Unix wisely adopted the convention that all
  50.  * internal dates and times (for example, the time of creation and last modification
  51.  * of files) were kept in Universal Time, and converted to local time based on a
  52.  * per-user time zone specification. This far-sighted choice has made it vastly
  53.  * easier to integrate Unix systems into far-flung networks without a chaos of
  54.  * conflicting time settings.
  55.  * 
  56.  * The machines on which Unix was developed and initially deployed could not support
  57.  * arithmetic on integers longer than 32 bits without costly multiple-precision
  58.  * computation in software. The internal representation of time was therefore chosen
  59.  * to be the number of seconds elapsed since 00:00 Universal time on January 1, 1970
  60.  * in the Gregorian calendar (Julian day 2440587.5), with time stored as a 32 bit
  61.  * signed integer (long in the original C implementation).
  62.  * 
  63.  * The influence of Unix time representation has spread well beyond Unix since most
  64.  * C and C++ libraries on other systems provide Unix-compatible time and date
  65.  * functions. The major drawback of Unix time representation is that, if kept as a
  66.  * 32 bit signed quantity, on January 19, 2038 it will go negative, resulting in
  67.  * chaos in programs unprepared for this. Modern Unix and C implementations define
  68.  * the result of the time() function as type time_t, which leaves the door open for
  69.  * remediation (by changing the definition to a 64 bit integer, for example) before
  70.  * the clock ticks the dreaded doomsday second.
  71.  * 
  72.  * mktime -- Get Unix timestamp for a date
  73.  * int mktime (int hour, int minute, int second, int month, int day, int year);
  74.  * 
  75.  * Warning: Note the strange order of arguments, which differs from the order of
  76.  * arguments in a regular Unix mktime() call and which does not lend itself well to
  77.  * leaving out parameters from right to left (see below). It is a common error to
  78.  * mix these values up in a script.
  79.  * 
  80.  * Returns the Unix timestamp corresponding to the arguments given. This timestamp
  81.  * is a long integer containing the number of seconds between the Unix Epoch
  82.  * (January 1 1970) and the time specified.
  83.  * 
  84.  * Example:
  85.  * <code>
  86.  * date_default_timezone_set('UTC');
  87.  * 
  88.  * include('./I18N/Arabic.php');
  89.  * $obj = new I18N_Arabic('Mktime');
  90.  * 
  91.  * $time = $obj->mktime(0,0,0,9,1,1427);
  92.  * 
  93.  * echo "<p>Calculated first day of Ramadan 1427 unix timestamp is: $time</p>";
  94.  * 
  95.  * $Gregorian = date('l F j, Y',$time);
  96.  * 
  97.  * echo "<p>Which is $Gregorian in Gregorian calendar</p>";
  98.  * </code>
  99.  *    
  100.  * @category  I18N
  101.  * @package   I18N_Arabic
  102.  * @author    Khaled Al-Sham'aa <khaled@ar-php.org>
  103.  * @copyright 2006-2016 Khaled Al-Sham'aa
  104.  *    
  105.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  106.  * @link      http://www.ar-php.org
  107.  */
  108.  
  109. /**
  110.  * This PHP class is an Arabic customization for PHP mktime function
  111.  *  
  112.  * @category  I18N
  113.  * @package   I18N_Arabic
  114.  * @author    Khaled Al-Sham'aa <khaled@ar-php.org>
  115.  * @copyright 2006-2016 Khaled Al-Sham'aa
  116.  *    
  117.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  118.  * @link      http://www.ar-php.org
  119.  */ 
  120. {
  121.     /**
  122.      * Loads initialize values
  123.      *
  124.      * @ignore
  125.      */
  126.     public function __construct()
  127.     {
  128.     }
  129.         
  130.     /**
  131.      * This will return current Unix timestamp
  132.      * for given Hijri date (Islamic calendar)
  133.      *          
  134.      * @param integer $hour       Time hour
  135.      * @param integer $minute     Time minute
  136.      * @param integer $second     Time second
  137.      * @param integer $hj_month   Hijri month (Islamic calendar)
  138.      * @param integer $hj_day     Hijri day   (Islamic calendar)
  139.      * @param integer $hj_year    Hijri year  (Islamic calendar)
  140.      * @param integer $correction To apply correction factor (+/- 1-2)
  141.      *                             to standard Hijri calendar
  142.      *             
  143.      * @return integer Returns the current time measured in the number of
  144.      *                 seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
  145.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  146.      */
  147.     public function mktime(
  148.         $hour$minute$second$hj_month$hj_day$hj_year$correction 0
  149.     {
  150.         list($year$month$day$this->convertDate($hj_year$hj_month$hj_day);
  151.  
  152.         $unixTimeStamp mktime($hour$minute$second$month$day$year);
  153.         
  154.         $unixTimeStamp $unixTimeStamp 3600*24*$correction
  155.         
  156.         return $unixTimeStamp;
  157.     }
  158.     
  159.     /**
  160.      * This will convert given Hijri date (Islamic calendar) into Gregorian date
  161.      *          
  162.      * @param integer $Y Hijri year (Islamic calendar)
  163.      * @param integer $M Hijri month (Islamic calendar)
  164.      * @param integer $D Hijri day (Islamic calendar)
  165.      *      
  166.      * @return array Gregorian date [int Year, int Month, int Day]
  167.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  168.      */
  169.     protected function convertDate($Y$M$D)
  170.     {
  171.         if (function_exists('GregorianToJD')) {
  172.             $str JDToGregorian($this->islamicToJd($Y$M$D));
  173.         else {
  174.             $str $this->jdToGreg($this->islamicToJd($Y$M$D));
  175.         }
  176.         
  177.         list($month$day$yearexplode('/'$str);
  178.         
  179.         return array($year$month$day);
  180.     }
  181.     
  182.     /**
  183.      * This will convert given Hijri date (Islamic calendar) into Julian day
  184.      *          
  185.      * @param integer $year  Hijri year
  186.      * @param integer $month Hijri month
  187.      * @param integer $day   Hijri day
  188.      *      
  189.      * @return integer Julian day
  190.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  191.      */
  192.     protected function islamicToJd($year$month$day)
  193.     {
  194.         $jd = (int)((11 $year 330+ (int)(354 $year+ (int)(30 $month
  195.             - (int)(($month 12$day 1948440 385;
  196.         return $jd;
  197.     }
  198.     
  199.     /**
  200.      * Converts Julian Day Count to Gregorian date
  201.      *      
  202.      * @param integer $julian A julian day number as integer
  203.      *       
  204.      * @return integer The gregorian date as a string in the form "month/day/year"
  205.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  206.      */
  207.     protected function jdToGreg($julian
  208.     {
  209.         $julian $julian 1721119;
  210.         $calc1  $julian 1;
  211.         $year   floor($calc1 146097);
  212.         $julian floor($calc1 146097 $year);
  213.         $day    floor($julian 4);
  214.         $calc2  $day 3;
  215.         $julian floor($calc2 1461);
  216.         $day    $calc2 1461 $julian;
  217.         $day    floor(($day 44);
  218.         $calc3  $day 3;
  219.         $month  floor($calc3 153);
  220.         $day    $calc3 153 $month;
  221.         $day    floor(($day 55);
  222.         $year   100 $year $julian;
  223.         
  224.         if ($month 10{
  225.             $month $month 3;
  226.         else {
  227.             $month $month 9;
  228.             $year  $year 1;
  229.         }
  230.         
  231.         /* 
  232.         Just to mimic the PHP JDToGregorian output
  233.         If year is less than 1, subtract one to convert from
  234.         a zero based date system to the common era system in
  235.         which the year -1 (1 B.C.E) is followed by year 1 (1 C.E.)
  236.         */
  237.         
  238.         if ($year 1{
  239.             $year--;
  240.         }
  241.  
  242.         return $month.'/'.$day.'/'.$year;
  243.     }
  244.  
  245.     /**
  246.      * Calculate Hijri calendar correction using Um-Al-Qura calendar information
  247.      *      
  248.      * @param integer $m Hijri month (Islamic calendar)
  249.      * @param integer $y Hijri year  (Islamic calendar), valid range [1420-1459]
  250.      *       
  251.      * @return integer Correction factor to fix Hijri calendar calculation using
  252.      *                  Um-Al-Qura calendar information
  253.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  254.      */
  255.     public function mktimeCorrection ($m$y)
  256.     {
  257.         if ($y >= 1420 && $y 1460{
  258.             $calc $this->mktime(000$m1$y);
  259.             $file dirname(__FILE__).'/data/um_alqoura.txt';
  260.  
  261.             $content file_get_contents($file);
  262.             $offset  (($y-142012 $m11;
  263.  
  264.             $d substr($content$offset2);
  265.             $m substr($content$offset+32);
  266.             $y substr($content$offset+64);
  267.             
  268.             $real mktime(000$m$d$y);
  269.             
  270.             $diff = (int)(($real $calc(3600 24));
  271.         else {
  272.             $diff 0;
  273.         }
  274.         
  275.         return $diff;
  276.     }
  277.     
  278.     /**
  279.      * Calculate how many days in a given Hijri month
  280.      *      
  281.      * @param integer $m         Hijri month (Islamic calendar)
  282.      * @param integer $y         Hijri year  (Islamic calendar), valid
  283.      *                            range[1320-1459]
  284.      * @param boolean $umAlqoura Should we implement Um-Al-Qura calendar correction
  285.      *                            in this calculation (default value is true)
  286.      *       
  287.      * @return integer Days in a given Hijri month
  288.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  289.      */
  290.     public function hijriMonthDays ($m$y$umAlqoura true)
  291.     {
  292.         if ($y >= 1320 && $y 1460{
  293.             $begin $this->mktime(000$m1$y);
  294.             
  295.             if ($m == 12{
  296.                 $m2 1;
  297.                 $y2 $y 1;
  298.             else {
  299.                 $m2 $m 1;
  300.                 $y2 $y;
  301.             }
  302.             
  303.             $end $this->mktime(000$m21$y2);
  304.             
  305.             if ($umAlqoura === true{
  306.                 $c1 $this->mktimeCorrection($m$y);
  307.                 $c2 $this->mktimeCorrection($m2$y2);
  308.             else {
  309.                 $c1 0;
  310.                 $c2 0;
  311.             }
  312.             
  313.             $days ($end $begin(3600 24);
  314.             $days $days $c1 $c2;
  315.         else {
  316.             $days false;
  317.         }
  318.         
  319.         return $days;
  320.     }
  321. }

Documentation generated on Fri, 01 Jan 2016 10:26:08 +0200 by phpDocumentor 1.4.0