Hi,

Here you will find the implimentation of islamic (hijri) calendar for the extension CALENDAR.

But some modifications are required, please help me

Thanks.
/* $selId: hijri.c,v 1.0 2004/07/20 14:50:00 lees Exp $
 * Copyright 2004-2004, Mostapha ([EMAIL PROTECTED]), all rights reserved.
 * Permission granted to use, copy, modify, distribute and sell so long as
 * the above copyright and this permission statement are retained in all
 * copies.  THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
 *
 * Based on :
 * hconv.c
 *
 * Copyright (c) 1992 by Waleed A. Muhanna
 *
 * Send any comments/suggestions/fixes/additions to:
 *              [EMAIL PROTECTED]
 *
 */

#include <math.h>
#include "sdncal.h"

#define RPD     (0.01745329251994329577) /* radians per degree (pi/180) */


char    *dow[7]= {
        "Ahad", "Ithnain", "Zulatha", "Arbi'a",
        "Khamees", "Jumma", "Sabt"
};

char  *HijriMonthName[13] = {"",
        "Muharram", "Safar", "Rabi` al-Awal", "Rabi` al-Thaani",
        "Jumaada al-Awal", "Jumaada al-Thaani", "Rajab", "Sha`ban",
        "Ramadan", "Shawwal", "Zul al-Qi`dah", "Zul al-Hijjah"
};

char  *HijriMonthAraName[13] = {"",
        "محرم", 
        "صفر",
        "ربيع الأول", 
        "ربيع الثاني",
        "جمادى الأول", 
        "جمادى الثاني", 
        "رجب",
        "شعبان",
        "رمضان",
        "شوال",
        "ذو القعدة",
        "ذو الحجة"
};


/*
 * Given an integer _n_ and a phase selector (nph=0,1,2,3 for
 * new,first,full,last quarters respectively, function returns the
 * Julian date/time of the Nth such phase since January 1900.
 * Adapted from "Astronomical  Formulae for Calculators" by
 * Jean Meeus, Third Edition, Willmann-Bell, 1985.
 */
double
tmoonphase( long n, int nph)
{
        double jd, t, t2, t3, k, ma, sa, tf, xtra;
        k = n + nph/4.0;  t = k/1236.85;  t2 = t*t; t3 = t2*t;
        jd =  2415020.75933 + 29.53058868*k - 1.178e-4 * t2
            - 1.55e-7 * t3
            + 3.3e-4 * sin (RPD * (166.56 +132.87*t -0.009173*t2));

        /* Sun's mean anomaly */
        sa =  RPD * (359.2242 + 29.10535608*k - 3.33e-5 * t2 - 3.47e-6 * t3);

        /* Moon's mean anomaly */
        ma =  RPD * (306.0253 + 385.81691806*k + 0.0107306*t2 +1.236e-5 *t3);

        /* Moon's argument of latitude */
        tf = RPD * 2.0 * (21.2964 + 390.67050646*k -0.0016528*t2
                      -2.39e-6 * t3);

        /* should reduce to interval 0-1.0 before calculating further */
        if (nph==0 || nph==2)
                /* Corrections for New and Full Moon */
                xtra = (0.1734 - 0.000393*t) * sin(sa)
                      +0.0021*sin(sa*2)
                      -0.4068*sin(ma) +0.0161*sin(2*ma) -0.0004*sin(3*ma)
                      +0.0104*sin(tf)
                      -0.0051*sin(sa+ma) -0.0074*sin(sa-ma)
                      +0.0004*sin(tf+sa) -0.0004*sin(tf-sa)
                      -0.0006*sin(tf+ma) +0.0010*sin(tf-ma)
                      +0.0005*sin(sa+ 2*ma);
        else if (nph==1 || nph==3) {
                xtra = (0.1721 - 0.0004*t) * sin(sa)
                      +0.0021*sin(sa*2)
                      -0.6280*sin(ma) +0.0089*sin(2*ma) -0.0004*sin(3*ma)
                      +0.0079*sin(tf)
                      -0.0119*sin(sa+ma) -0.0047*sin(sa-ma)
                      +0.0003*sin(tf+sa) -0.0004*sin(tf-sa)
                      -0.0006*sin(tf+ma) +0.0021*sin(tf-ma)
                      +0.0003*sin(sa+ 2*ma) +0.0004*sin(sa-2*ma)
                      -0.0003*sin(2*sa+ma);
                if (nph==1)
                        xtra = xtra +0.0028 -0.0004*cos(sa) +0.0003*cos(ma);
                else
                        xtra = xtra -0.0028 +0.0004*cos(sa) -0.0003*cos(ma);
        } else {
                printf("tmoonphase: illegal phase number\n");
                exit(1);
        }
        /* convert from Ephemeris Time (ET) to (approximate)
           Universal Time (UT) */
        jd += xtra - (0.41 +1.2053*t +0.4992*t2)/1440;
        return (jd);
}


/* parameters for Makkah: for a new moon to be visible after sunset on
   a the same day in which it started, it has to have started before
   (SUNSET-MINAGE)-TIMZ=3 A.M. local time. */

#define TIMZ 3.0
#define MINAGE 13.5
#define SUNSET 19.5 /*approximate */
#define TIMDIF (SUNSET-MINAGE)

double
visible(long n, double *rjd)
{
        double jd;
        float tf;
        long d;

        jd = tmoonphase(n,0);  *rjd = jd;
        d = jd;
        tf = (jd - d);
        if (tf<=0.5)  /*new moon starts in the afternoon */
                return(jd+1.0); 
        /* new moon starts before noon */
        tf = (tf-0.5)*24 +TIMZ;  /* local time */ 
        if (tf>TIMDIF) return(jd+1.0);  /*age at sunset < min for visiblity*/
        return(jd);
}


/*
 * Given a gregorian/julian date, compute corresponding Hijri date structure
 * As a reference point, the routine uses the fact that the year
 * 1405 A.H. started immediatly after lunar conjunction number 1048
 * which occured on September 1984 25d 3h 10m UT.
 */

void SdnToHijri (
                  long int sdn,
                  int *pYear,
                  int *pMonth,
                  int *pDay)
{
        int hday,hmon,hyear,y,m,d;
        double jd, mjd, rjd;
        long k, hm;

        jd = (double) sdn;
        SdnToGregorian(sdn,&y,&m,&d);
        /* obtain first approx. of how many new moons since the beginning
           of the year 1900 */
        k = 0.6 + (y + ((int) (m-0.5)) /12.0 + d/365.0 - 1900) *12.3685;
        do  {mjd = visible(k--, &rjd);} while (mjd>jd);  k++;
        /*first of the month is the following day*/
        hm = k -1048;
        hyear = 1405 + (hm / 12);

        hmon =  (hm % 12) +1;
        if (hm !=0 && hmon<=0) {hmon +=12; hyear--; }
        if (hyear<=0) hyear--;
        *pDay = jd -mjd +1.0;
        *pMonth = hmon;
        *pYear =hyear;

        return;
}

#define NMONTHS  (1405*12+1)

/*
 * Given a Hijri date, compute corresponding C.E. date structure
 */

long int HijriToSdn(
                    int y,
                    int m,
                    int d)
{
        double jd, rjd;
        long k;


        if (y<0) y++;
        k = m+ y*12 - NMONTHS;   /* # of months since 1/1/1405 */
        jd = visible(k+1048L, &rjd) +d;

        return ((long int)jd);
}


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to