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_SdnToGregorian( long int sdn, int *pYear, int *pMonth, int *pDay); /* Convert a SDN to a Gregorian calendar date. If the input SDN is less * than 1, the three output values will all be set to zero, otherwise * *pYear will be >= -4714 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_GregorianToSdn( int inputYear, int inputMonth, int inputDay); /* Convert a Gregorian 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. */ char *librock_MonthNameShort[13]; /* * Convert a Gregorian month number (1 to 12) to the abbreviated (three * character) name of the Gregorian month (null terminated). An index of * zero will return a zero length string. */ char *librock_MonthNameLong[13]; /* * Convert a Gregorian month number (1 to 12) to the name of the Gregorian * month (null terminated). An index of zero will return a zero length * string. */
/* 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 ... } }
* 4714 B.C. to at least 10000 A.D. * * Although this software can handle dates all the way back to 4714 * B.C., such use may not be meaningful. The Gregorian calendar was * not instituted until October 15, 1582 (or October 5, 1582 in the * Julian calendar). Some countries did not accept it until much * later. For example, Britain converted in 1752, The USSR in 1918 and * Greece in 1923. Most European countries used the Julian calendar * prior to the Gregorian.
* * The Gregorian calendar is a modified version of the Julian calendar. * The only difference being the specification of leap years. The * Julian calendar specifies that every year that is a multiple of 4 * will be a leap year. This leads to a year that is 365.25 days long, * but the current accepted value for the tropical year is 365.242199 * days. * * To correct this error in the length of the year and to bring the * vernal equinox back to March 21, Pope Gregory XIII issued a papal * bull declaring that Thursday October 4, 1582 would be followed by * Friday October 15, 1582 and that centennial years would only be a * leap year if they were a multiple of 400. This shortened the year * by 3 days per 400 years, giving a year of 365.2425 days. * * Another recently proposed change in the leap year rule is to make * years that are multiples of 4000 not a leap year, but this has never * been officially accepted and this rule is not implemented in these * algorithms. *
* * The calculations are based on three different cycles: a 400 year * cycle of leap years, 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 4714 B.C. to 10000 * A.D. The source code of the verification program is included in * this package.
* * 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).
// 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.