This is julian.c in view mode; [Download] [Up]
/* julian.c * Part of the Moon application for the NeXT computer. * Authors: John Walker of Autodesk * Geoffrey S. Knauth (NeXT port) * Date: January 4, 1992 * * This code was placed in the public domain by John Walker. */ #import "all.h" /* * Convert internal GMT date to Julian day. */ static long jdate(t) struct tm *t; { long c, m, y; y = t->tm_year + 1900; m = t->tm_mon + 1; if (m > 2) m = m - 3; else { m = m + 9; y--; } c = y / 100L; /* Compute century */ y -= 100L * c; return t->tm_mday + (c * 146097L) / 4 + (y * 1461L) / 4 + (m * 153L + 2) / 5 + 1721119L; } /* * Convert internal GMT date and time to astronomical Julian time * (i.e. Julian date plus day fraction, expressed as a double). */ double jtime(t) struct tm *t; { return (jdate(t) - 0.5) + (t->tm_sec + 60 * (t->tm_min + 60 * t->tm_hour)) / 86400.0; } /* * Convert Julian date to year, month, day, which are returned via integer * pointers to integers. */ void jyear(td, yy, mm, dd) double td; int *yy, *mm, *dd; { double j, d, y, m; td += 0.5; /* Astronomical to civil */ j = floor(td); j = j - 1721119.0; y = floor(((4 * j) - 1) / 146097.0); j = (j * 4.0) - (1.0 + (146097.0 * y)); d = floor(j / 4.0); j = floor(((4.0 * d) + 3.0) / 1461.0); d = ((4.0 * d) + 3.0) - (1461.0 * j); d = floor((d + 4.0) / 4.0); m = floor(((5.0 * d) - 3) / 153.0); d = (5.0 * d) - (3.0 + (153.0 * m)); d = floor((d + 5.0) / 5.0); y = (100.0 * y) + j; if (m < 10.0) m = m + 3; else { m = m - 9; y = y + 1; } *yy = y; *mm = m; *dd = d; } /* * Convert Julian time to hour, minutes, and seconds. */ void jhms(j, h, m, s) double j; int *h, *m, *s; { long ij; j += 0.5; /* Astronomical to civil */ /* I added the rint(), because I noticed that local time was sometimes * one second behind the value I expected. --gsk 1/4/92 */ ij = rint((j - floor(j)) * 86400.0); *h = ij / 3600L; *m = (ij / 60L) % 60L; *s = ij % 60L; } /********************************************************************* * The following routines were added to the original Sun moontool code * so that the NeXT version could offer the user time travel. ********************************************************************* */ /* * Convert {year, month, day} to astronomical Julian date. * This is a long, because there is no fraction part (yet). */ static long ymdToJdate(int year, int month, int day) { long c, m, y; y = year; m = month; if (m > 2) m = m - 3; else { m = m + 9; y--; } c = y / 100L; /* Compute century */ y -= 100L * c; return day + (c * 146097L) / 4 + (y * 1461L) / 4 + (m * 153L + 2) / 5 + 1721119L; } /* * Convert {year, month, day, hour, minute, second} to astronomical Julian * date, which will include a fraction, which is why this is a double. */ double ymdhmsToJtime (int year, int month, int day, int hour, int minute, int second) { return (ymdToJdate(year, month, day) - 0.5) + (second + 60 * (minute + 60 * hour)) / 86400.0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.