ruby-sdn 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +26 -0
- data/README +35 -0
- data/README.en +33 -0
- data/ext/sdn/MANIFEST +10 -0
- data/ext/sdn/README.sdncal20 +31 -0
- data/ext/sdn/depend +6 -0
- data/ext/sdn/dow.c +65 -0
- data/ext/sdn/extconf.rb +2 -0
- data/ext/sdn/french.c +154 -0
- data/ext/sdn/gregor.c +268 -0
- data/ext/sdn/jewish.c +735 -0
- data/ext/sdn/julian.c +245 -0
- data/ext/sdn/sdncal.h +90 -0
- data/ext/sdn/sdnmodule.c +212 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a68bc5e8882d9fd6cd7d53d6f8eff964f58063ba
|
4
|
+
data.tar.gz: 6672d0e346530f374134c4a2a5376cdabb7dffe7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e48e42cba2916aeb26229e8e282b9e594a938a91c6bf4f008ee0e28056cc6af699c8ba1bd2d7edf74556a2d7a465923c7655fe70c4cf85cb57eda886671a0874
|
7
|
+
data.tar.gz: daec1e96ac8dafdcf650acc15eb8167c6e09672311fa749f03d7a6c30d44baefdefcf8f63524139c25e68e4834f2e4e57adc5048563c9d6337f12a1f0b69f4a8
|
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 1997-2014, Tadayoshi Funaba
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are
|
6
|
+
met:
|
7
|
+
|
8
|
+
1. Redistributions of source code must retain the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright
|
12
|
+
notice, this list of conditions and the following disclaimer in the
|
13
|
+
documentation and/or other materials provided with the
|
14
|
+
distribution.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
20
|
+
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
23
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
25
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
"Sdn" モジュール
|
2
|
+
================
|
3
|
+
|
4
|
+
これはこよみモジュールです。核となる元のコードは Scott E. Lee 氏による
|
5
|
+
SDN こよみライブラリです。
|
6
|
+
|
7
|
+
このモジュールはつぎの暦をあつかいます:
|
8
|
+
|
9
|
+
グレゴリオ暦 (いわゆる新暦)、ユリウス暦 (欧州旧暦)、フランス革命暦、
|
10
|
+
ユダヤ暦
|
11
|
+
|
12
|
+
|
13
|
+
インストール
|
14
|
+
------------
|
15
|
+
|
16
|
+
スクリプト "install.rb" をつかいます。
|
17
|
+
|
18
|
+
$ ruby install.rb config
|
19
|
+
$ ruby install.rb setup
|
20
|
+
($ su)
|
21
|
+
# ruby install.rb install
|
22
|
+
|
23
|
+
くわしくは、"ruby install.rb --help" としてください。
|
24
|
+
|
25
|
+
|
26
|
+
謝辞
|
27
|
+
----
|
28
|
+
|
29
|
+
さまざまなこよみ計算のためのコードを書かれた Scott E. Lee 氏に感謝しま
|
30
|
+
す。
|
31
|
+
|
32
|
+
|
33
|
+
ふなばただよし
|
34
|
+
mailto:tadf@funaba.org
|
35
|
+
http://www.funaba.org/
|
data/README.en
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
An "Sdn" module
|
2
|
+
===============
|
3
|
+
|
4
|
+
This is a calendar module. The original core code from SDN calendar
|
5
|
+
library which is written by Scott E. Lee.
|
6
|
+
|
7
|
+
This module supports the following calendars:
|
8
|
+
|
9
|
+
Gregorian, Julian, French Republican, Jewish
|
10
|
+
|
11
|
+
|
12
|
+
Install
|
13
|
+
-------
|
14
|
+
|
15
|
+
Use the script "install.rb".
|
16
|
+
|
17
|
+
$ ruby install.rb config
|
18
|
+
$ ruby install.rb setup
|
19
|
+
($ su)
|
20
|
+
# ruby install.rb install
|
21
|
+
|
22
|
+
For more information, type "ruby install.rb --help".
|
23
|
+
|
24
|
+
|
25
|
+
Acknowledgments
|
26
|
+
---------------
|
27
|
+
|
28
|
+
I thank Scott E. Lee who wrote various calendar code.
|
29
|
+
|
30
|
+
|
31
|
+
Tadayoshi Funaba
|
32
|
+
mailto:tadf@funaba.org
|
33
|
+
http://www.funaba.org/
|
data/ext/sdn/MANIFEST
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
This package contains the source code of C language functions for date
|
2
|
+
arithmetic and for converting between the following calendar types:
|
3
|
+
|
4
|
+
Gregorian
|
5
|
+
Julian
|
6
|
+
French Republican
|
7
|
+
Jewish
|
8
|
+
|
9
|
+
Other calendars may be supported in the future. Let me know what other
|
10
|
+
calendars you would like to see added.
|
11
|
+
|
12
|
+
There are also verification programs for each calendar (file names starting
|
13
|
+
with "v").
|
14
|
+
|
15
|
+
There are general comments about using the software in the header file
|
16
|
+
(sdncal.h) and specific comments on each calendar in its source code file
|
17
|
+
(e.g., julian.c).
|
18
|
+
|
19
|
+
If you find bugs, have suggestions for improvement, etc., the author
|
20
|
+
welcomes your comments:
|
21
|
+
|
22
|
+
Scott E. Lee
|
23
|
+
scottlee@pobox.com
|
24
|
+
lees@dg-rtp.dg.com
|
25
|
+
CompuServe: 74223,1301
|
26
|
+
|
27
|
+
If you cannot find me at the above addresses, try looking for me in the
|
28
|
+
Internet White Page Directory at:
|
29
|
+
|
30
|
+
http://www.Four11.com/
|
31
|
+
|
data/ext/sdn/depend
ADDED
data/ext/sdn/dow.c
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
/* $selId: dow.c,v 2.0 1995/10/24 01:13:06 lees Exp $
|
2
|
+
* Copyright 1993-1995, Scott E. Lee, all rights reserved.
|
3
|
+
* Permission granted to use, copy, modify, distribute and sell so long as
|
4
|
+
* the above copyright and this permission statement are retained in all
|
5
|
+
* copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**************************************************************************
|
9
|
+
*
|
10
|
+
* These are the externally visible components of this file:
|
11
|
+
*
|
12
|
+
* int
|
13
|
+
* DayOfWeek(
|
14
|
+
* long int sdn);
|
15
|
+
*
|
16
|
+
* Convert a SDN to a day-of-week number (0 to 6). Where 0 stands for
|
17
|
+
* Sunday, 1 for Monday, etc. and 6 stands for Saturday.
|
18
|
+
*
|
19
|
+
* char *DayNameShort[7];
|
20
|
+
*
|
21
|
+
* Convert a day-of-week number (0 to 6), as returned from DayOfWeek(), to
|
22
|
+
* the abbreviated (three character) name of the day.
|
23
|
+
*
|
24
|
+
* char *DayNameLong[7];
|
25
|
+
*
|
26
|
+
* Convert a day-of-week number (0 to 6), as returned from DayOfWeek(), to
|
27
|
+
* the name of the day.
|
28
|
+
*
|
29
|
+
**************************************************************************/
|
30
|
+
|
31
|
+
#include "sdncal.h"
|
32
|
+
|
33
|
+
int
|
34
|
+
DayOfWeek(
|
35
|
+
long int sdn)
|
36
|
+
{
|
37
|
+
int dow;
|
38
|
+
|
39
|
+
dow = (sdn + 1) % 7;
|
40
|
+
if (dow >= 0) {
|
41
|
+
return(dow);
|
42
|
+
} else {
|
43
|
+
return(dow + 7);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
const char *DayNameShort[7] = {
|
48
|
+
"Sun",
|
49
|
+
"Mon",
|
50
|
+
"Tue",
|
51
|
+
"Wed",
|
52
|
+
"Thu",
|
53
|
+
"Fri",
|
54
|
+
"Sat"
|
55
|
+
};
|
56
|
+
|
57
|
+
const char *DayNameLong[7] = {
|
58
|
+
"Sunday",
|
59
|
+
"Monday",
|
60
|
+
"Tuesday",
|
61
|
+
"Wednesday",
|
62
|
+
"Thursday",
|
63
|
+
"Friday",
|
64
|
+
"Saturday"
|
65
|
+
};
|
data/ext/sdn/extconf.rb
ADDED
data/ext/sdn/french.c
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
/* $selId: french.c,v 2.0 1995/10/24 01:13:06 lees Exp $
|
2
|
+
* Copyright 1993-1995, Scott E. Lee, all rights reserved.
|
3
|
+
* Permission granted to use, copy, modify, distribute and sell so long as
|
4
|
+
* the above copyright and this permission statement are retained in all
|
5
|
+
* copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**************************************************************************
|
9
|
+
*
|
10
|
+
* These are the externally visible components of this file:
|
11
|
+
*
|
12
|
+
* void
|
13
|
+
* SdnToFrench(
|
14
|
+
* long int sdn,
|
15
|
+
* int *pYear,
|
16
|
+
* int *pMonth,
|
17
|
+
* int *pDay);
|
18
|
+
*
|
19
|
+
* Convert a SDN to a French republican calendar date. If the input SDN is
|
20
|
+
* before the first day of year 1 or after the last day of year 14, the
|
21
|
+
* three output values will all be set to zero, otherwise *pYear will be in
|
22
|
+
* the range 1 to 14 inclusive; *pMonth will be in the range 1 to 13
|
23
|
+
* inclusive; *pDay will be in the range 1 to 30 inclusive. If *pMonth is
|
24
|
+
* 13, the SDN represents one of the holidays at the end of the year and
|
25
|
+
* *pDay will be in the range 1 to 6 inclusive.
|
26
|
+
*
|
27
|
+
* long int
|
28
|
+
* FrenchToSdn(
|
29
|
+
* int year,
|
30
|
+
* int month,
|
31
|
+
* int day);
|
32
|
+
*
|
33
|
+
* Convert a French republican calendar date to a SDN. Zero is returned
|
34
|
+
* when the input date is detected as invalid or out of the supported
|
35
|
+
* range. The return value will be > 0 for all valid, supported dates, but
|
36
|
+
* there are some invalid dates that will return a positive value. To
|
37
|
+
* verify that a date is valid, convert it to SDN and then back and compare
|
38
|
+
* with the original.
|
39
|
+
*
|
40
|
+
* char *FrenchMonthName[14];
|
41
|
+
*
|
42
|
+
* Convert a French republican month number (1 to 13) to the name of the
|
43
|
+
* French republican month (null terminated). An index of 13 (for the
|
44
|
+
* "extra" days at the end of the year) will return the string "Extra". An
|
45
|
+
* index of zero will return a zero length string.
|
46
|
+
*
|
47
|
+
* VALID RANGE
|
48
|
+
*
|
49
|
+
* These routines only convert dates in years 1 through 14 (Gregorian
|
50
|
+
* dates 22 September 1792 through 22 September 1806). This more than
|
51
|
+
* covers the period when the calendar was in use.
|
52
|
+
*
|
53
|
+
* I would support a wider range of dates, but I have not been able to
|
54
|
+
* find an authoritative definition of when leap years were to have
|
55
|
+
* occurred. There are suggestions that it was to skip a leap year ever
|
56
|
+
* 100 years like the Gregorian calendar.
|
57
|
+
*
|
58
|
+
* CALENDAR OVERVIEW
|
59
|
+
*
|
60
|
+
* The French republican calendar was adopted in October 1793 during
|
61
|
+
* the French Revolution and was abandoned in January 1806. The intent
|
62
|
+
* was to create a new calendar system that was based on scientific
|
63
|
+
* principals, not religious traditions.
|
64
|
+
*
|
65
|
+
* The year is divided into 12 months of 30 days each. The remaining 5
|
66
|
+
* to 6 days in the year are grouped at the end and are holidays. Each
|
67
|
+
* month is divided into three decades (instead of weeks) of 10 days
|
68
|
+
* each.
|
69
|
+
*
|
70
|
+
* The epoch (first day of the first year) is 22 September 1792 in the
|
71
|
+
* Gregorian calendar. Leap years are every fourth year (year 3, 7,
|
72
|
+
* 11, etc.)
|
73
|
+
*
|
74
|
+
* TESTING
|
75
|
+
*
|
76
|
+
* This algorithm has been tested from the year 1 to 14. The source
|
77
|
+
* code of the verification program is included in this package.
|
78
|
+
*
|
79
|
+
* REFERENCES
|
80
|
+
*
|
81
|
+
* I have found no detailed, authoritative reference on this calendar.
|
82
|
+
* The algorithms are based on a preponderance of less authoritative
|
83
|
+
* sources.
|
84
|
+
*
|
85
|
+
**************************************************************************/
|
86
|
+
|
87
|
+
#include "sdncal.h"
|
88
|
+
|
89
|
+
#define SDN_OFFSET 2375474
|
90
|
+
#define DAYS_PER_4_YEARS 1461
|
91
|
+
#define DAYS_PER_MONTH 30
|
92
|
+
#define FIRST_VALID 2375840
|
93
|
+
#define LAST_VALID 2380952
|
94
|
+
|
95
|
+
void
|
96
|
+
SdnToFrench(
|
97
|
+
long int sdn,
|
98
|
+
int *pYear,
|
99
|
+
int *pMonth,
|
100
|
+
int *pDay)
|
101
|
+
{
|
102
|
+
long int temp;
|
103
|
+
int dayOfYear;
|
104
|
+
|
105
|
+
if (sdn < FIRST_VALID || sdn > LAST_VALID) {
|
106
|
+
*pYear = 0;
|
107
|
+
*pMonth = 0;
|
108
|
+
*pDay = 0;
|
109
|
+
return;
|
110
|
+
}
|
111
|
+
|
112
|
+
temp = (sdn - SDN_OFFSET) * 4 - 1;
|
113
|
+
*pYear = temp / DAYS_PER_4_YEARS;
|
114
|
+
dayOfYear = (temp % DAYS_PER_4_YEARS) / 4;
|
115
|
+
*pMonth = dayOfYear / DAYS_PER_MONTH + 1;
|
116
|
+
*pDay = dayOfYear % DAYS_PER_MONTH + 1;
|
117
|
+
}
|
118
|
+
|
119
|
+
long int
|
120
|
+
FrenchToSdn(
|
121
|
+
int year,
|
122
|
+
int month,
|
123
|
+
int day)
|
124
|
+
{
|
125
|
+
/* check for invalid dates */
|
126
|
+
if (year < 1 || year > 14 ||
|
127
|
+
month < 1 || month > 13 ||
|
128
|
+
day < 1 || day > 30)
|
129
|
+
{
|
130
|
+
return(0);
|
131
|
+
}
|
132
|
+
|
133
|
+
return( (year * DAYS_PER_4_YEARS) / 4
|
134
|
+
+ (month - 1) * DAYS_PER_MONTH
|
135
|
+
+ day
|
136
|
+
+ SDN_OFFSET );
|
137
|
+
}
|
138
|
+
|
139
|
+
const char *FrenchMonthName[14] = {
|
140
|
+
"",
|
141
|
+
"Vendemiaire",
|
142
|
+
"Brumaire",
|
143
|
+
"Frimaire",
|
144
|
+
"Nivose",
|
145
|
+
"Pluviose",
|
146
|
+
"Ventose",
|
147
|
+
"Germinal",
|
148
|
+
"Floreal",
|
149
|
+
"Prairial",
|
150
|
+
"Messidor",
|
151
|
+
"Thermidor",
|
152
|
+
"Fructidor",
|
153
|
+
"Extra"
|
154
|
+
};
|
data/ext/sdn/gregor.c
ADDED
@@ -0,0 +1,268 @@
|
|
1
|
+
/* $selId: gregor.c,v 2.0 1995/10/24 01:13:06 lees Exp $
|
2
|
+
* Copyright 1993-1995, Scott E. Lee, all rights reserved.
|
3
|
+
* Permission granted to use, copy, modify, distribute and sell so long as
|
4
|
+
* the above copyright and this permission statement are retained in all
|
5
|
+
* copies. THERE IS NO WARRANTY - USE AT YOUR OWN RISK.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**************************************************************************
|
9
|
+
*
|
10
|
+
* These are the externally visible components of this file:
|
11
|
+
*
|
12
|
+
* void
|
13
|
+
* SdnToGregorian(
|
14
|
+
* long int sdn,
|
15
|
+
* int *pYear,
|
16
|
+
* int *pMonth,
|
17
|
+
* int *pDay);
|
18
|
+
*
|
19
|
+
* Convert a SDN to a Gregorian calendar date. If the input SDN is less
|
20
|
+
* than 1, the three output values will all be set to zero, otherwise
|
21
|
+
* *pYear will be >= -4714 and != 0; *pMonth will be in the range 1 to 12
|
22
|
+
* inclusive; *pDay will be in the range 1 to 31 inclusive.
|
23
|
+
*
|
24
|
+
* long int
|
25
|
+
* GregorianToSdn(
|
26
|
+
* int inputYear,
|
27
|
+
* int inputMonth,
|
28
|
+
* int inputDay);
|
29
|
+
*
|
30
|
+
* Convert a Gregorian calendar date to a SDN. Zero is returned when the
|
31
|
+
* input date is detected as invalid or out of the supported range. The
|
32
|
+
* return value will be > 0 for all valid, supported dates, but there are
|
33
|
+
* some invalid dates that will return a positive value. To verify that a
|
34
|
+
* date is valid, convert it to SDN and then back and compare with the
|
35
|
+
* original.
|
36
|
+
*
|
37
|
+
* char *MonthNameShort[13];
|
38
|
+
*
|
39
|
+
* Convert a Gregorian month number (1 to 12) to the abbreviated (three
|
40
|
+
* character) name of the Gregorian month (null terminated). An index of
|
41
|
+
* zero will return a zero length string.
|
42
|
+
*
|
43
|
+
* char *MonthNameLong[13];
|
44
|
+
*
|
45
|
+
* Convert a Gregorian month number (1 to 12) to the name of the Gregorian
|
46
|
+
* month (null terminated). An index of zero will return a zero length
|
47
|
+
* string.
|
48
|
+
*
|
49
|
+
* VALID RANGE
|
50
|
+
*
|
51
|
+
* 4714 B.C. to at least 10000 A.D.
|
52
|
+
*
|
53
|
+
* Although this software can handle dates all the way back to 4714
|
54
|
+
* B.C., such use may not be meaningful. The Gregorian calendar was
|
55
|
+
* not instituted until October 15, 1582 (or October 5, 1582 in the
|
56
|
+
* Julian calendar). Some countries did not accept it until much
|
57
|
+
* later. For example, Britain converted in 1752, The USSR in 1918 and
|
58
|
+
* Greece in 1923. Most European countries used the Julian calendar
|
59
|
+
* prior to the Gregorian.
|
60
|
+
*
|
61
|
+
* CALENDAR OVERVIEW
|
62
|
+
*
|
63
|
+
* The Gregorian calendar is a modified version of the Julian calendar.
|
64
|
+
* The only difference being the specification of leap years. The
|
65
|
+
* Julian calendar specifies that every year that is a multiple of 4
|
66
|
+
* will be a leap year. This leads to a year that is 365.25 days long,
|
67
|
+
* but the current accepted value for the tropical year is 365.242199
|
68
|
+
* days.
|
69
|
+
*
|
70
|
+
* To correct this error in the length of the year and to bring the
|
71
|
+
* vernal equinox back to March 21, Pope Gregory XIII issued a papal
|
72
|
+
* bull declaring that Thursday October 4, 1582 would be followed by
|
73
|
+
* Friday October 15, 1582 and that centennial years would only be a
|
74
|
+
* leap year if they were a multiple of 400. This shortened the year
|
75
|
+
* by 3 days per 400 years, giving a year of 365.2425 days.
|
76
|
+
*
|
77
|
+
* Another recently proposed change in the leap year rule is to make
|
78
|
+
* years that are multiples of 4000 not a leap year, but this has never
|
79
|
+
* been officially accepted and this rule is not implemented in these
|
80
|
+
* algorithms.
|
81
|
+
*
|
82
|
+
* ALGORITHMS
|
83
|
+
*
|
84
|
+
* The calculations are based on three different cycles: a 400 year
|
85
|
+
* cycle of leap years, a 4 year cycle of leap years and a 5 month
|
86
|
+
* cycle of month lengths.
|
87
|
+
*
|
88
|
+
* The 5 month cycle is used to account for the varying lengths of
|
89
|
+
* months. You will notice that the lengths alternate between 30
|
90
|
+
* and 31 days, except for three anomalies: both July and August
|
91
|
+
* have 31 days, both December and January have 31, and February
|
92
|
+
* is less than 30. Starting with March, the lengths are in a
|
93
|
+
* cycle of 5 months (31, 30, 31, 30, 31):
|
94
|
+
*
|
95
|
+
* Mar 31 days \
|
96
|
+
* Apr 30 days |
|
97
|
+
* May 31 days > First cycle
|
98
|
+
* Jun 30 days |
|
99
|
+
* Jul 31 days /
|
100
|
+
*
|
101
|
+
* Aug 31 days \
|
102
|
+
* Sep 30 days |
|
103
|
+
* Oct 31 days > Second cycle
|
104
|
+
* Nov 30 days |
|
105
|
+
* Dec 31 days /
|
106
|
+
*
|
107
|
+
* Jan 31 days \
|
108
|
+
* Feb 28/9 days |
|
109
|
+
* > Third cycle (incomplete)
|
110
|
+
*
|
111
|
+
* For this reason the calculations (internally) assume that the
|
112
|
+
* year starts with March 1.
|
113
|
+
*
|
114
|
+
* TESTING
|
115
|
+
*
|
116
|
+
* This algorithm has been tested from the year 4714 B.C. to 10000
|
117
|
+
* A.D. The source code of the verification program is included in
|
118
|
+
* this package.
|
119
|
+
*
|
120
|
+
* REFERENCES
|
121
|
+
*
|
122
|
+
* Conversions Between Calendar Date and Julian Day Number by Robert J.
|
123
|
+
* Tantzen, Communications of the Association for Computing Machinery
|
124
|
+
* August 1963. (Also published in Collected Algorithms from CACM,
|
125
|
+
* algorithm number 199).
|
126
|
+
*
|
127
|
+
**************************************************************************/
|
128
|
+
|
129
|
+
#include "sdncal.h"
|
130
|
+
|
131
|
+
#define SDN_OFFSET 32045
|
132
|
+
#define DAYS_PER_5_MONTHS 153
|
133
|
+
#define DAYS_PER_4_YEARS 1461
|
134
|
+
#define DAYS_PER_400_YEARS 146097
|
135
|
+
|
136
|
+
void
|
137
|
+
SdnToGregorian(
|
138
|
+
long int sdn,
|
139
|
+
int *pYear,
|
140
|
+
int *pMonth,
|
141
|
+
int *pDay)
|
142
|
+
{
|
143
|
+
int century;
|
144
|
+
int year;
|
145
|
+
int month;
|
146
|
+
int day;
|
147
|
+
long int temp;
|
148
|
+
int dayOfYear;
|
149
|
+
|
150
|
+
if (sdn <= 0) {
|
151
|
+
*pYear = 0;
|
152
|
+
*pMonth = 0;
|
153
|
+
*pDay = 0;
|
154
|
+
return;
|
155
|
+
}
|
156
|
+
|
157
|
+
temp = (sdn + SDN_OFFSET) * 4 - 1;
|
158
|
+
|
159
|
+
/* Calculate the century (year/100). */
|
160
|
+
century = temp / DAYS_PER_400_YEARS;
|
161
|
+
|
162
|
+
/* Calculate the year and day of year (1 <= dayOfYear <= 366). */
|
163
|
+
temp = ((temp % DAYS_PER_400_YEARS) / 4) * 4 + 3;
|
164
|
+
year = (century * 100) + (temp / DAYS_PER_4_YEARS);
|
165
|
+
dayOfYear = (temp % DAYS_PER_4_YEARS) / 4 + 1;
|
166
|
+
|
167
|
+
/* Calculate the month and day of month. */
|
168
|
+
temp = dayOfYear * 5 - 3;
|
169
|
+
month = temp / DAYS_PER_5_MONTHS;
|
170
|
+
day = (temp % DAYS_PER_5_MONTHS) / 5 + 1;
|
171
|
+
|
172
|
+
/* Convert to the normal beginning of the year. */
|
173
|
+
if (month < 10) {
|
174
|
+
month += 3;
|
175
|
+
} else {
|
176
|
+
year += 1;
|
177
|
+
month -= 9;
|
178
|
+
}
|
179
|
+
|
180
|
+
/* Adjust to the B.C./A.D. type numbering. */
|
181
|
+
year -= 4800;
|
182
|
+
if (year <= 0) year--;
|
183
|
+
|
184
|
+
*pYear = year;
|
185
|
+
*pMonth = month;
|
186
|
+
*pDay = day;
|
187
|
+
}
|
188
|
+
|
189
|
+
long int
|
190
|
+
GregorianToSdn(
|
191
|
+
int inputYear,
|
192
|
+
int inputMonth,
|
193
|
+
int inputDay)
|
194
|
+
{
|
195
|
+
int year;
|
196
|
+
int month;
|
197
|
+
|
198
|
+
/* check for invalid dates */
|
199
|
+
if (inputYear == 0 || inputYear < -4714 ||
|
200
|
+
inputMonth <= 0 || inputMonth > 12 ||
|
201
|
+
inputDay <= 0 || inputDay > 31)
|
202
|
+
{
|
203
|
+
return(0);
|
204
|
+
}
|
205
|
+
|
206
|
+
/* check for dates before SDN 1 (Nov 25, 4714 B.C.) */
|
207
|
+
if (inputYear == -4714) {
|
208
|
+
if (inputMonth < 11) {
|
209
|
+
return(0);
|
210
|
+
}
|
211
|
+
if (inputMonth == 11 && inputDay < 25) {
|
212
|
+
return(0);
|
213
|
+
}
|
214
|
+
}
|
215
|
+
|
216
|
+
/* Make year always a positive number. */
|
217
|
+
if (inputYear < 0) {
|
218
|
+
year = inputYear + 4801;
|
219
|
+
} else {
|
220
|
+
year = inputYear + 4800;
|
221
|
+
}
|
222
|
+
|
223
|
+
/* Adjust the start of the year. */
|
224
|
+
if (inputMonth > 2) {
|
225
|
+
month = inputMonth - 3;
|
226
|
+
} else {
|
227
|
+
month = inputMonth + 9;
|
228
|
+
year--;
|
229
|
+
}
|
230
|
+
|
231
|
+
return( ((year / 100) * DAYS_PER_400_YEARS) / 4
|
232
|
+
+ ((year % 100) * DAYS_PER_4_YEARS) / 4
|
233
|
+
+ (month * DAYS_PER_5_MONTHS + 2) / 5
|
234
|
+
+ inputDay
|
235
|
+
- SDN_OFFSET );
|
236
|
+
}
|
237
|
+
|
238
|
+
const char *MonthNameShort[13] = {
|
239
|
+
"",
|
240
|
+
"Jan",
|
241
|
+
"Feb",
|
242
|
+
"Mar",
|
243
|
+
"Apr",
|
244
|
+
"May",
|
245
|
+
"Jun",
|
246
|
+
"Jul",
|
247
|
+
"Aug",
|
248
|
+
"Sep",
|
249
|
+
"Oct",
|
250
|
+
"Nov",
|
251
|
+
"Dec"
|
252
|
+
};
|
253
|
+
|
254
|
+
const char *MonthNameLong[13] = {
|
255
|
+
"",
|
256
|
+
"January",
|
257
|
+
"February",
|
258
|
+
"March",
|
259
|
+
"April",
|
260
|
+
"May",
|
261
|
+
"June",
|
262
|
+
"July",
|
263
|
+
"August",
|
264
|
+
"September",
|
265
|
+
"October",
|
266
|
+
"November",
|
267
|
+
"December"
|
268
|
+
};
|