zed@mdbs.uucp (Bill Smith) (09/29/90)
/*
** Display the time and date in obsolete o-time and the (IMHO)
** the more intuitive zedtime. (o- prefix for obsolete.)
**
** Zedtime is defined in terms of 22 zedmonths of 22 zeddays,
** (each zedday is exactly 18 o-hours). Each zedday is made of 16
** zedhours of 64 zedminutes of 64 zedseconds. (A zedsecond is
** approximately 98.877 o-seconds and there are 2^16 of them in a
** zedday.) A zedyear has 3 intercalary days at the end of the year
** except during the leap year which only has 2 intercalary days.
** A leap zedyear occurs approximately once every 117 years and is
** not processed by this program. (The Unix time structure will
** probably overflow before the next one occurs anyway. :-)
**
** It is defined so that zedyear 147 begins at 6pm March 20, 1990
** which is approximately Nawruz 147, the beginning of the Baha'i
** year spanning 1990-1991.
**
** Author: William W. Smith
** E-Mail: newton.physics.purdue.edu!sawmill!mdbs!zed
**
** Copyright (c) 1990, William W. Smith
** Copyright (c) 1990, Recherche Computers
** Copyright (c) 1990, mdbs Inc. {just for completeness sake}
**
** Justification: A zedcalendar based on a day of 18 o-hour days
** has 487 zed days a year which is 22^2 + 3. 18 o-hours divides
** 365.25 days exactly, thus requiring no leap years except for
** for the fraction of a hour that the earth's rotation is off from
** precisely 365.25 o-days per trip around the world and leads to the
** complex century rules in the o-calendar. A person whose
** circadian rhythm is 18 o-hours will find the zedcalendar much more
** convenient for maintaining consistent eating and sleeping times.
**
** 18 o-hours is very close to 2^16 o-seconds so it is natural to
** define the zedday in terms of that fraction of the 18 o-hour day.
**
** It is an open question what to call each zedmonth and each zedday
** of the month. A natural suggestion is to name both after the letters
** of the alphabet in a language that has only 22 letters, but this
** author does not know that much linguistics. Also how to define the
** idea of a "day of the week" is unclear.
**
*/
#define OSEC_per_OHOUR 3600L
#define OHOUR_per_ZEDDAY 18
#define ZEDSEC_per_ZEDMIN 64
#define ZEDMIN_per_ZEDHOUR 64
#define ZEDDAY_per_ZEDMONTH 22
#define ZEDMONTH_per_ZEDYEAR 22
#define ZEDDAY_per_ZEDYEAR 487
#include <sys/types.h>
#include <sys/timeb.h>
#include <time.h>
long zedepoch();
char * zedtime();
main()
{
struct timeb timeofday;
struct tm gmt, local;
long atime;
long offset;
long localatime;
ftime(&timeofday);
atime = time(0);
local = *localtime(&atime);
gmt = *gmtime(&atime);
/*
** print the current o-time
*/
printf("Obsolete: %s",ctime(&atime));
/*
** figure out how far away we are from GMT
*/
offset = (gmt.tm_hour - local.tm_hour ) * OSEC_per_OHOUR +
(gmt.tm_min - local.tm_min) * 60 +
(gmt.tm_sec - local.tm_sec);
localatime = atime - offset;
/*
** print the current zedtime
*/
printf("Zedtime: %s",zedtime(&localatime));
}
long zedepoch()
{
return
OSEC_per_OHOUR * /* o-seconds per o-hour */
(24 * /* o-hours per o-day */
(31 + /* days in January */
28 + /* days in February for 1990 */
19) + /* the first 19 days of March */
18 /*hours*/); /* 6PM (approx. sunset Nawruz) */
}
char * zedtime(pin)
long * pin;
{
static char buffr[100];
long now;
int year, month, dayofmonth;
int hour, minute, second;
double zedseconds;
struct timeb timeofday;
double jiffies;
now = *pin - zedepoch();
/*
** 127 == 1970, the unix o-epoch, which is year 127 in the Baha'i calendar
*/
year = 127 +
(now / (ZEDDAY_per_ZEDYEAR *
OHOUR_per_ZEDDAY *
OSEC_per_OHOUR));
now %= (ZEDDAY_per_ZEDYEAR * OHOUR_per_ZEDDAY * OSEC_per_OHOUR);
month = (int)(now / (ZEDDAY_per_ZEDMONTH *
OHOUR_per_ZEDDAY *
OSEC_per_OHOUR));
now %= (ZEDDAY_per_ZEDMONTH *
OHOUR_per_ZEDDAY *
OSEC_per_OHOUR);
dayofmonth = (int)(now / (OHOUR_per_ZEDDAY *
OSEC_per_OHOUR));
now %= (OHOUR_per_ZEDDAY *
OSEC_per_OHOUR);
ftime(&timeofday);
jiffies = 1000.0 * (double)now + timeofday.millitm * 1.0;
zedseconds = jiffies * 16.0 * /* zedhours per zedday */
(double)ZEDMIN_per_ZEDHOUR *
(double)ZEDSEC_per_ZEDMIN /
(1000.0 *
(double)OHOUR_per_ZEDDAY *
(double)OSEC_per_OHOUR);
now = (long)(zedseconds + 0.5); /* round */
hour = now / (ZEDMIN_per_ZEDHOUR * ZEDSEC_per_ZEDMIN);
now %= (ZEDMIN_per_ZEDHOUR * ZEDSEC_per_ZEDMIN);
minute = now / ZEDSEC_per_ZEDMIN;
second = now % ZEDSEC_per_ZEDMIN;
sprintf(buffr,"%4d/%02d/%02d %02d:%02d:%02d\n",
year,month + 1,dayofmonth + 1,hour,minute,second);
return buffr;
}eric@snark.thyrsus.com (Eric S. Raymond) (10/27/90)
In <1990Sep28.230231.27563@mdbs.uucp> Bill Smith wrote: > ** It is an open question what to call each zedmonth and each zedday > ** of the month. A natural suggestion is to name both after the letters > ** of the alphabet in a language that has only 22 letters, but this > ** author does not know that much linguistics. Hebrew should do nicely. Your months can be Aleph, Beth, Gimel, Yod... -- Eric S. Raymond = ...!uunet!snark!eric (mad mastermind of TMN-Netnews)