123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #include "sdncal.h"
- #include <limits.h>
- #define JULIAN_SDN_OFFSET 32083
- #define DAYS_PER_5_MONTHS 153
- #define DAYS_PER_4_YEARS 1461
- void SdnToJulian(
- long int sdn,
- int *pYear,
- int *pMonth,
- int *pDay)
- {
- int year;
- int month;
- int day;
- long int temp;
- int dayOfYear;
- if (sdn <= 0) {
- goto fail;
- }
-
- if (sdn > (LONG_MAX - JULIAN_SDN_OFFSET * 4 + 1) / 4 || sdn < LONG_MIN / 4) {
- goto fail;
- }
- temp = sdn * 4 + (JULIAN_SDN_OFFSET * 4 - 1);
-
- {
- long yearl = temp / DAYS_PER_4_YEARS;
- if (yearl > INT_MAX || yearl < INT_MIN) {
- goto fail;
- }
- year = (int) yearl;
- }
- 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 JulianToSdn(
- int inputYear,
- int inputMonth,
- int inputDay)
- {
- int year;
- int month;
-
- if (inputYear == 0 || inputYear < -4713 ||
- inputMonth <= 0 || inputMonth > 12 ||
- inputDay <= 0 || inputDay > 31) {
- return (0);
- }
-
- if (inputYear == -4713) {
- if (inputMonth == 1 && inputDay == 1) {
- 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 * DAYS_PER_4_YEARS) / 4
- + (month * DAYS_PER_5_MONTHS + 2) / 5
- + inputDay
- - JULIAN_SDN_OFFSET);
- }
|