123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- #include "sdncal.h"
- #include <limits.h>
- #define GREGOR_SDN_OFFSET 32045
- #define DAYS_PER_5_MONTHS 153
- #define DAYS_PER_4_YEARS 1461
- #define DAYS_PER_400_YEARS 146097
- void SdnToGregorian(
- long int sdn,
- int *pYear,
- int *pMonth,
- int *pDay)
- {
- int century;
- int year;
- int month;
- int day;
- long int temp;
- int dayOfYear;
- if (sdn <= 0 ||
- sdn > (LONG_MAX - 4 * GREGOR_SDN_OFFSET) / 4) {
- goto fail;
- }
- temp = (sdn + GREGOR_SDN_OFFSET) * 4 - 1;
-
- century = temp / DAYS_PER_400_YEARS;
-
- temp = ((temp % DAYS_PER_400_YEARS) / 4) * 4 + 3;
- year = (century * 100) + (temp / DAYS_PER_4_YEARS);
- dayOfYear = (temp % DAYS_PER_4_YEARS) / 4 + 1;
-
- temp = dayOfYear * 5 - 3;
- month = temp / DAYS_PER_5_MONTHS;
- day = (temp % DAYS_PER_5_MONTHS) / 5 + 1;
-
- if (month < 10) {
- month += 3;
- } else {
- year += 1;
- month -= 9;
- }
-
- year -= 4800;
- if (year <= 0)
- year--;
- *pYear = year;
- *pMonth = month;
- *pDay = day;
- return;
- fail:
- *pYear = 0;
- *pMonth = 0;
- *pDay = 0;
- }
- long int GregorianToSdn(
- int inputYear,
- int inputMonth,
- int inputDay)
- {
- int year;
- int month;
-
- if (inputYear == 0 || inputYear < -4714 ||
- inputMonth <= 0 || inputMonth > 12 ||
- inputDay <= 0 || inputDay > 31) {
- return (0);
- }
-
- if (inputYear == -4714) {
- if (inputMonth < 11) {
- return (0);
- }
- if (inputMonth == 11 && inputDay < 25) {
- return (0);
- }
- }
-
- if (inputYear < 0) {
- year = inputYear + 4801;
- } else {
- year = inputYear + 4800;
- }
-
- if (inputMonth > 2) {
- month = inputMonth - 3;
- } else {
- month = inputMonth + 9;
- year--;
- }
- return (((year / 100) * DAYS_PER_400_YEARS) / 4
- + ((year % 100) * DAYS_PER_4_YEARS) / 4
- + (month * DAYS_PER_5_MONTHS + 2) / 5
- + inputDay
- - GREGOR_SDN_OFFSET);
- }
- char *MonthNameShort[13] =
- {
- "",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "May",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Oct",
- "Nov",
- "Dec"
- };
- char *MonthNameLong[13] =
- {
- "",
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December"
- };
|