Home
Highly Reusable Software By activity User Interface Text Strings Math Processing
Stored Data
Communications
Hard World File System
|
#License - #Source code - #Example Use -
#include <librock/sdncalh.h> void librock_SdnToJulian( long int sdn, int *pYear, int *pMonth, int *pDay); /* * Convert a SDN to a Julian calendar date. If the input SDN is less than * 1, the three output values will all be set to zero, otherwise *pYear * will be >= -4713 and != 0; *pMonth will be in the range 1 to 12 * inclusive; *pDay will be in the range 1 to 31 inclusive. */ long int librock_JulianToSdn( int inputYear, int inputMonth, int inputDay); /* * Convert a Julian calendar date to a SDN. Zero is returned when the * input date is detected as invalid or out of the supported range. The * return value will be > 0 for all valid, supported dates, but there are * some invalid dates that will return a positive value. To verify that a * date is valid, convert it to SDN and then back and compare with the * original. */
/* This package defines a set of routines that convert calendar dates to * and from a serial day number (SDN). The SDN is a serial numbering of * days where SDN 1 is November 25, 4714 BC in the Gregorian calendar and * SDN 2447893 is January 1, 1990. This system of day numbering is * sometimes referred to as Julian days, but to avoid confusion with the * Julian calendar, it is referred to as serial day numbers here. The term * Julian days is also used to mean the number of days since the beginning * of the current year. * * The SDN can be used as an intermediate step in converting from one * calendar system to another (such as Gregorian to Jewish). It can also * be used for date computations such as easily comparing two dates, * determining the day of the week, finding the date of yesterday or * calculating the number of days between two dates. * * SDN values less than one are not supported. If a conversion routine * returns an SDN of zero, this means that the date given is either invalid * or is outside the supported range for that calendar. * * At least some validity checks are performed on input dates. For * example, a negative month number will result in the return of zero for * the SDN. A returned SDN greater than one does not necessarily mean that * the input date was valid. To determine if the date is valid, convert it * to SDN, and if the SDN is greater than zero, convert it back to a date * and compare to the original. For example: */ int y1, m1, d1; int y2, m2, d2; long int sdn; ... sdn = GregorianToSdn(y1, m1, d1); if (sdn > 0) { SdnToGregorian(sdn, &y2, &m2, &d2); if (y1 == y2 && m1 == m2 && d1 == d2) { ... date is valid ... } }
/* * 4713 B.C. to at least 10000 A.D. * * Although this software can handle dates all the way back to 4713 * B.C., such use may not be meaningful. The calendar was created in * 46 B.C., but the details did not stabilize until at least 8 A.D., * and perhaps as late at the 4th century. Also, the beginning of a * year varied from one culture to another - not all accepted January * as the first month. */
/* * Julias Ceasar created the calendar in 46 B.C. as a modified form of * the old Roman republican calendar which was based on lunar cycles. * The new Julian calendar set fixed lengths for the months, abandoning * the lunar cycle. It also specified that there would be exactly 12 * months per year and 365.25 days per year with every 4th year being a * leap year. * * Note that the current accepted value for the tropical year is * 365.242199 days, not 365.25. This lead to an 11 day shift in the * calendar with respect to the seasons by the 16th century when the * Gregorian calendar was created to replace the Julian calendar. * * The difference between the Julian and today's Gregorian calendar is * that the Gregorian does not make centennial years leap years unless * they are a multiple of 400, which leads to a year of 365.2425 days. * In other words, in the Gregorian calendar, 1700, 1800 and 1900 are * not leap years, but 2000 is. All centennial years are leap years in * the Julian calendar. * * The details are unknown, but the lengths of the months were adjusted * until they finally stablized in 8 A.D. with their current lengths: * * January 31 * February 28/29 * March 31 * April 30 * May 31 * June 30 * Quintilis/July 31 * Sextilis/August 31 * September 30 * October 31 * November 30 * December 31 * * In the early days of the calendar, the days of the month were not * numbered as we do today. The numbers ran backwards (decreasing) and * were counted from the Ides (15th of the month - which in the old * Roman republican lunar calendar would have been the full moon) or * from the Nonae (9th day before the Ides) or from the beginning of * the next month. * * In the early years, the beginning of the year varied, sometimes * based on the ascension of rulers. It was not always the first of * January. * * Also, today's epoch, 1 A.D. or the birth of Jesus Christ, did not * come into use until several centuries later when Christianity became * a dominant religion. */
/* * The calculations are based on two different cycles: a 4 year cycle * of leap years and a 5 month cycle of month lengths. * * The 5 month cycle is used to account for the varying lengths of * months. You will notice that the lengths alternate between 30 and * 31 days, except for three anomalies: both July and August have 31 * days, both December and January have 31, and February is less than * 30. Starting with March, the lengths are in a cycle of 5 months * (31, 30, 31, 30, 31): * * Mar 31 days \ * Apr 30 days | * May 31 days > First cycle * Jun 30 days | * Jul 31 days / * * Aug 31 days \ * Sep 30 days | * Oct 31 days > Second cycle * Nov 30 days | * Dec 31 days / * * Jan 31 days \ * Feb 28/9 days | * > Third cycle (incomplete) * * For this reason the calculations (internally) assume that the year * starts with March 1. */
/* * This algorithm has been tested from the year 4713 B.C. to 10000 A.D. * The source code of the verification program is included in sdncal. */
/* * Conversions Between Calendar Date and Julian Day Number by Robert J. * Tantzen, Communications of the Association for Computing Machinery * August 1963. (Also published in Collected Algorithms from CACM, * algorithm number 199). [Note: the published algorithm is for the * Gregorian calendar, but was adjusted to use the Julian calendar's * simpler leap year rule.] */
//No external calls
Copyright 1993-1995, Scott E. Lee, all rights reserved. Licensed under BSD-ish license, NO WARRANTY. Copies must retain this block. License text in <librock/license/sdncal.txt> librock_LIDESC_HC=553e181388455f0eef17ccd9e2a51c1f3ae8daf0
Verbatim copying and distribution of this generated page is permitted in any medium provided that no changes are made.
(The source of this manual page may be covered by a more permissive license which allows modifications.)
Want to help? We welcome comments, patches. -- Need help? Request paid support.