Source for file Date.php
Documentation is available at Date.php 
 * ----------------------------------------------------------------------  
 * Copyright (c) 2006-2016 Khaled Al-Sham'aa.  
 * ----------------------------------------------------------------------  
 * This program is open source product; you can redistribute it and/or  
 * modify it under the terms of the GNU Lesser General Public License (LGPL)  
 * as published by the Free Software Foundation; either version 3  
 * of the License, or (at your option) any later version.  
 * This program is distributed in the hope that it will be useful,  
 * but WITHOUT ANY WARRANTY; without even the implied warranty of  
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
 * GNU Lesser General Public License for more details.  
 * You should have received a copy of the GNU Lesser General Public License  
 * along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>.  
 * ----------------------------------------------------------------------  
 * Class Name: Arabic Date  
 * Original    Author(s): Khaled Al-Sham'aa <khaled@ar-php.org>  
 * Purpose:    Arabic customization for PHP date function  
 * ----------------------------------------------------------------------  
 * PHP class for Arabic and Islamic customization of PHP date function. It  
 * can convert UNIX timestamp into string in Arabic as well as convert it into  
 * The Islamic calendar is purely lunar and consists of twelve alternating months  
 * of 30 and 29 days, with the final 29 day month extended to 30 days during leap  
 * years. Leap years follow a 30 year cycle and occur in years 1, 5, 7, 10, 13, 16,  
 * 18, 21, 24, 26, and 29. The calendar begins on Friday, July 16th, 622 C.E. in  
 * the Julian calendar, Julian day 1948439.5, the day of Muhammad's separate from  
 * Mecca to Medina, the first day of the first month of year 1 A.H.--"Anno Hegira".  
 * Each cycle of 30 years thus contains 19 normal years of 354 days and 11 leap  
 * years of 355, so the average length of a year is therefore  
 * ((19 x 354) + (11 x 355)) / 30 = 354.365... days, with a mean length of month of  
 * 1/12 this figure, or 29.53055... days, which closely approximates the mean  
 * synodic month (time from new Moon to next new Moon) of 29.530588 days, with the  
 * calendar only slipping one day with respect to the Moon every 2525 years. Since  
 * the calendar is fixed to the Moon, not the solar year, the months shift with  
 * respect to the seasons, with each month beginning about 11 days earlier in each  
 * The convert presented here is the most commonly used civil calendar in the  
 * Islamic world; for religious purposes months are defined to start with the  
 * first observation of the crescent of the new Moon.  
 * The Julian calendar was proclaimed by Julius Casar in 46 B.C. and underwent  
 * several modifications before reaching its final form in 8 C.E. The Julian  
 * calendar differs from the Gregorian only in the determination of leap years,  
 * lacking the correction for years divisible by 100 and 400 in the Gregorian  
 * calendar. In the Julian calendar, any positive year is a leap year if divisible  
 * by 4. (Negative years are leap years if when divided by 4 a remainder of 3  
 * results.) Days are considered to begin at midnight.  
 * In the Julian calendar the average year has a length of 365.25 days. compared to  
 * the actual solar tropical year of 365.24219878 days. The calendar thus  
 * accumulates one day of error with respect to the solar year every 128 years.  
 * Being a purely solar calendar, no attempt is made to synchronise the start of  
 * months to the phases of the Moon.  
 * The Gregorian Calendar:  
 * The Gregorian calendar was proclaimed by Pope Gregory XIII and took effect in  
 * most Catholic states in 1582, in which October 4, 1582 of the Julian calendar  
 * was followed by October 15 in the new calendar, correcting for the accumulated  
 * discrepancy between the Julian calendar and the equinox as of that date. When  
 * comparing historical dates, it's important to note that the Gregorian calendar,  
 * used universally today in Western countries and in international commerce, was  
 * adopted at different times by different countries. Britain and her colonies  
 * (including what is now the United States), did not switch to the Gregorian  
 * calendar until 1752, when Wednesday 2nd September in the Julian calendar dawned  
 * as Thursday the 14th in the Gregorian.  
 * The Gregorian calendar is a minor correction to the Julian. In the Julian  
 * calendar every fourth year is a leap year in which February has 29, not 28 days,  
 * but in the Gregorian, years divisible by 100 are not leap years unless they are  
 * also divisible by 400. How prescient was Pope Gregory! Whatever the problems of  
 * Y2K, they won't include sloppy programming which assumes every year divisible by  
 * 4 is a leap year since 2000, unlike the previous and subsequent years divisible  
 * by 100, is a leap year. As in the Julian calendar, days are considered to begin  
 * The average length of a year in the Gregorian calendar is 365.2425 days compared  
 * to the actual solar tropical year (time from equinox to equinox) of 365.24219878  
 * days, so the calendar accumulates one day of error with respect to the solar year  
 * about every 3300 years. As a purely solar calendar, no attempt is made to  
 * synchronise the start of months to the phases of the Moon.  
 * date -- Format a local time/date  
 * string date ( string format, int timestamp);  
 * Returns a string formatted according to the given format string using the given  
 * integer timestamp or the current local time if no timestamp is given. In  
 * otherwords, timestamp is optional and defaults to the value of time().  
 *   date_default_timezone_set('UTC');  
 *   echo date('l dS F Y h:i:s A', $time);  
 *   include('./I18N/Arabic.php');  
 *   $obj = new I18N_Arabic('Date');  
 *   echo $obj->date('l dS F Y h:i:s A', $time);  
 *   echo $obj->date('l dS F Y h:i:s A', $time);  
 *   echo $obj->date('l dS F Y h:i:s A', $time);  
 *   echo $obj->date('l dS F Y h:i:s A', $time);  
 * @author    Khaled Al-Sham'aa <khaled@ar-php.org>  
 * @copyright 2006-2016 Khaled Al-Sham'aa  
 * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>  
 * @link      http://www.ar-php.org  
 * This PHP class is an Arabic customization for PHP date function  
 * @author    Khaled Al-Sham'aa <khaled@ar-php.org>  
 * @copyright 2006-2016 Khaled Al-Sham'aa  
 * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>  
 * @link      http://www.ar-php.org  
     * Loads initialize values  
    public function __construct()  
     * Setting value for $mode scalar  
     * @param integer $mode Output mode of date function where:  
     *                        1) Hijri format (Islamic calendar)  
     *                        2) Arabic month names used in Middle East countries  
     *                        3) Arabic Transliteration of Gregorian month names  
     *                        4) Both of 2 and 3 formats together  
     *                        6) Algeria and Tunis style  
     *                        8) Hijri format (Islamic calendar) in English  
     * @return object $this to build a fluent interface  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
        if ($mode >  0 &&  $mode <  9) {  
     * Getting $mode value that refer to output mode format  
     *               1) Hijri format (Islamic calendar)  
     *               2) Arabic month names used in Middle East countries  
     *               3) Arabic Transliteration of Gregorian month names  
     *               4) Both of 2 and 3 formats together  
     *               6) Algeria and Tunis style  
     *               8) Hijri format (Islamic calendar) in English  
     * @return Integer Value of $mode properity  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
     * Format a local time/date in Arabic string  
     * @param string  $format     Format string (same as PHP date function)  
     * @param integer $timestamp  Unix timestamp  
     * @param integer $correction To apply correction factor (+/- 1-2) to  
     *                             standard hijri calendar  
     * @return string Format Arabic date string according to given format string  
     *                 using the given integer timestamp or the current local  
     *                 time if no timestamp is given.  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
    public function date($format, $timestamp, $correction =  0)  
        if ($this->_mode ==  1 ||  $this->_mode ==  8) {  
                foreach ($this->_xml->ar_hj_month->month as $month) {  
                    $hj_txt_month["{ $month['id']}"] = (string) $month;  
                foreach ($this->_xml->en_hj_month->month as $month) {  
                    $hj_txt_month["{ $month['id']}"] = (string) $month;  
            $format =  str_replace($patterns, $replacements, $format);  
            $str =  date($format, $timestamp);  
                $str =  $this->en2ar($str);  
            $timestamp       =  $timestamp +  3600* 24* $correction;  
            list ($Y, $M, $D) =  explode(' ', date('Y m d', $timestamp)); 
            list ($hj_y, $hj_m, $hj_d) =  $this->hjConvert($Y, $M, $D); 
        } elseif ($this->_mode ==  5) {  
            $year  =  date('Y', $timestamp);  
            $str =  date($format, $timestamp);  
            $str =  $this->en2ar($str);  
            $str =  date($format, $timestamp);  
            $str =  $this->en2ar($str);  
            if ($outputCharset ==  null) {   
                $outputCharset =  $main->getOutputCharset();   
            $str =  $main->coreConvert($str, 'utf-8', $outputCharset);  
     * Translate English date/time terms into Arabic langauge  
     * @param string $str Date/time string using English terms  
     * @return string Date/time string using Arabic terms  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
    protected function en2ar($str)  
        foreach ($this->_xml->xpath("//en_day/mode[@id='full']/search") as $day) {  
        foreach ($this->_xml->ar_day->replace as $day) {  
            $this->_xml->xpath("//en_month/mode[@id='full']/search") as $month  
        foreach ($this->_xml->xpath("//en_day/mode[@id='short']/search") as $day) {  
        foreach ($this->_xml->ar_day->replace as $day) {  
        foreach ($this->_xml->xpath("//en_month/mode[@id='short']/search") as $m) {  
            $this->_xml->xpath("//preg_replace[@function='en2ar']/pair") as $p  
     * Add Arabic month names to the replacement array  
     * @param integer $mode Naming mode of months in Arabic where:  
     *                        2) Arabic month names used in Middle East countries  
     *                        3) Arabic Transliteration of Gregorian month names  
     *                        4) Both of 2 and 3 formats together  
     *                        6) Algeria and Tunis style  
     * @return array Arabic month names in selected style  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
            $this->_xml->xpath("//ar_month/mode[@id=$mode]/replace") as $month  
     * Convert given Gregorian date into Hijri date  
     * @param integer $Y Year Gregorian year  
     * @param integer $M Month Gregorian month  
     * @param integer $D Day Gregorian day  
     * @return array Hijri date [int Year, int Month, int Day](Islamic calendar)  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
            $jd =  GregorianToJD($M, $D, $Y);  
        return array($year, $month, $day);  
     * Convert given Julian day into Hijri date  
     * @param integer $jd Julian day  
     * @return array Hijri date [int Year, int Month, int Day](Islamic calendar)  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
        $l = (int) $jd -  1948440 +  10632;  
        $n = (int) (($l -  1) /  10631);  
        $l =  $l -  10631 *  $n +  354;  
        $j = (int) ((10985 -  $l) /  5316) * (int) ((50 *  $l) /  17719)   
            + (int) ($l /  5670) * (int) ((43 *  $l) /  15238); 
        $l =  $l - (int) ((30 -  $j) /  15) * (int) ((17719 *  $j) /  50)   
            - (int) ($j /  16) * (int) ((15238 *  $j) /  43) +  29; 
        $m = (int) ((24 *  $l) /  709);  
        $d =  $l - (int) ((709 *  $m) /  24);  
        $y = (int) (30 *  $n +  $j -  30);  
        return array($y, $m, $d);  
     * Convert given Hijri date into Julian day  
     * @param integer $year  Year Hijri year  
     * @param integer $month Month Hijri month  
     * @param integer $day   Day Hijri day  
     * @return integer Julian day  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
        $jd = (int) ((11 *  $year +  3) /  30) + (int) (354 *  $year) + (int) (30 *  $month)   
            - (int) (($month -  1) /  2) +  $day +  1948440 -  385; 
     * Converts a Gregorian date to Julian Day Count  
     * @param integer $m The month as a number from 1 (for January)  
     * @param integer $d The day as a number from 1 to 31  
     * @param integer $y The year as a number between -4714 and 9999  
     * @return integer The julian day for the given gregorian date as an integer  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
    protected function gregToJd ($m, $d, $y)  
        if (($y <  1582) ||  ($y ==  1582 &&  $m <  10)   
            ||  ($y ==  1582 &&  $m ==  10 &&  $d <=  15) 
            // This is ignored in the GregorianToJD PHP function!  
            $b =  2 -  $a + (int) ($a /  4);  
        $jd = (int) (365.25 *  ($y +  4716)) + (int) (30.6001 *  ($m +  1))   
     * Calculate Hijri calendar correction using Um-Al-Qura calendar information  
     * @param integer $time Unix timestamp  
     * @return integer Correction factor to fix Hijri calendar calculation using  
     *                  Um-Al-Qura calendar information  
     * @author Khaled Al-Sham'aa <khaled@ar-php.org>  
        $calc =  $time -  $this->date('j', $time) *  3600 *  24;  
        $file =  dirname(__FILE__ ). '/data/um_alqoura.txt';  
        $y      =  $this->date('Y', $time);  
        $m      =  $this->date('n', $time);  
        $offset =  (($y- 1420) *  12 +  $m) *  11;  
        $d =  substr($content, $offset, 2);  
        $m =  substr($content, $offset+ 3, 2);  
        $y =  substr($content, $offset+ 6, 4);  
        $real =  mktime(0, 0, 0, $m, $d, $y);  
        $diff = (int) (($calc -  $real) /  (3600 *  24));  
 
 
        
       |