MakeTime for Arabic/Islamic Hegri Calendar
Unix time() value:
Development of the Unix operating system began at Bell
Laboratories in 1969 by Dennis Ritchie and Ken Thompson, with the first PDP-11 version
becoming operational in February 1971. Unix wisely adopted the convention that all
internal dates and times (for example, the time of creation and last modification of files)
were kept in Universal Time, and converted to local time based on a per-user time zone
specification. This far-sighted choice has made it vastly easier to integrate Unix systems
into far-flung networks without a chaos of conflicting time settings.
The machines on which Unix was developed and initially deployed could not support
arithmetic on integers longer than 32 bits without costly multiple-precision computation
in software. The internal representation of time was therefore chosen to be the number
of seconds elapsed since 00:00 Universal time on January 1, 1970 in the Gregorian calendar
(Julian day 2440587.5), with time stored as a 32 bit signed integer (long in the original
C implementation).
The major drawback of Unix time representation is that, if kept
as a 32 bit signed quantity, on January 19, 2038 it will go negative, resulting
in chaos in programs unprepared for this.
The influence of Unix time representation has spread well beyond Unix since most C and
C++ libraries on other systems provide Unix-compatible time and date functions. The
major drawback of Unix time representation is that, if kept as a 32 bit signed quantity,
on January 19, 2038 it will go negative, resulting in chaos in programs unprepared for
this. Modern Unix and C implementations define the result of the time() function as type
time_t, which leaves the door open for remediation (by changing the definition to a 64
bit integer, for example) before the clock ticks the dreaded doomsday second.
The Islamic Calendar:
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".
Islamic calendar only slipping one day with respect to the Moon
every 2525 years.
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 successive solar year.
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:
The Julian calendar differs from
the Gregorian only in the determination of leap years.
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.
Gregorian calendar, used universally today in Western countries and
in international commerce, was adopted at different times by different countries.
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 at midnight.
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.
mktime -- Get Unix timestamp for a date
int mktime (int hour, int minute, int second, int month, int day, int year);
Warning: Note the strange order of arguments, which differs from the order of arguments in
a regular Unix mktime() call and which does not lend itself well to leaving out parameters
from right to left (see below). It is a common error to mix these values up in a script.
Returns the Unix timestamp corresponding to the arguments given. This timestamp is a long
integer containing the number of seconds between the Unix Epoch (January 1 1970) and
the time specified.