Home | Trees | Indices | Help |
|
---|
|
Contains the GregorianDateTime class and static functions related to the class.
:doc:`Tests are found here <unit_calendar_gregorian_gregorian>`.
Classes | |
GregorianDateTime |
Functions | |||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
Imports: GregorianDelta, GregorianTime
Function Details |
This algorithm is described here: * http://www.tondering.dk/claus/cal/julperiod.php#formula Integer division works differently in C and in Python for negative numbers. C truncates towards 0 and Python truncates towards negative infinity: http://python-history.blogspot.se/2010/08/why-pythons-integer-division-floors.html The above source don't state which to be used. If we can prove that division-expressions are always positive, we can be sure this algorithm works the same in C and in Python. We must prove that: 1) m >= 0 2) ((5 * e) + 2) >= 0 => e >= 0 3) (1461 * d) >= 0 => d >= 0 4) ((4 * c) + 3) >= 0 => c >= 0 5) (b * 146097) >= 0 => b >= 0 6) ((4 * a) + 3) >= 0 => a >= 0 Let's work from the top: julian_day >= 0 => a >= 0 + 32044 = 32044 => This proves 6). b >= ((4 * 32044) + 3) // 146097 = 0 This proves 5). Let's look at c: c = a - ((b * 146097) // 4) = a - (((((4 * a) + 3) // 146097) * 146097) // 4) For c to be >= 0, then (((((4 * a) + 3) // 146097) * 146097) // 4) <= a Let's look at this component: ((((4 * a) + 3) // 146097) * 146097) This expression can never be larger than (4 * a) + 3. That gives this: ((4 * a) + 3) // 4 <= a, which holds. This proves 4). Now, let's look at d: d = ((4 * c) + 3) // 1461 If c is >= 0, then d is also >= 0. This proves 3). Let's look at e: e = c - ((1461 * d) // 4) = c - ((1461 * (((4 * c) + 3) // 1461)) // 4) The same resoning as above can be used to conclude that e >= 0. This proves 2). Now, let's look at m: m = ((5 * e) + 2) // 153 If e >= 0, then m is also >= 0. This proves 1). |
This algorithm is described here: * http://www.tondering.dk/claus/cal/julperiod.php#formula * http://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_Day_Number Integer division works differently in C and in Python for negative numbers. C truncates towards 0 and Python truncates towards negative infinity: http://python-history.blogspot.se/2010/08/why-pythons-integer-division-floors.html The above sources don't state which to be used. If we can prove that division-expressions are always positive, we can be sure this algorithm works the same in C and in Python. We must prove that: 1) y >= 0 2) ((153 * m) + 2) >= 0 Let's prove 1): y = year + 4800 - a = year + 4800 - ((14 - month) // 12) year >= -4713 (gives a julian day of 0) so year + 4800 >= -4713 + 4800 = 87 The expression ((14 - month) // 12) varies between 0 and 1 when month varies between 1 and 12. Therefore y >= 87 - 1 = 86, and 1) is proved. Let's prove 2): m = month + (12 * a) - 3 = month + (12 * ((14 - month) // 12)) - 3 1 <= month <= 12 m(1) = 1 + (12 * ((14 - 1) // 12)) - 3 = 1 + (12 * 1) - 3 = 10 m(2) = 2 + (12 * ((14 - 2) // 12)) - 3 = 2 + (12 * 1) - 3 = 11 m(3) = 3 + (12 * ((14 - 3) // 12)) - 3 = 3 + (12 * 0) - 3 = 0 m(4) = 4 + (12 * ((14 - 4) // 12)) - 3 = 4 + (12 * 0) - 3 = 1 m(5) = 5 + (12 * ((14 - 5) // 12)) - 3 = 5 + (12 * 0) - 3 = 2 m(6) = 6 + (12 * ((14 - 6) // 12)) - 3 = 6 + (12 * 0) - 3 = 3 m(7) = 7 + (12 * ((14 - 7) // 12)) - 3 = 7 + (12 * 0) - 3 = 4 m(8) = 8 + (12 * ((14 - 8) // 12)) - 3 = 8 + (12 * 0) - 3 = 5 m(9) = 9 + (12 * ((14 - 9) // 12)) - 3 = 9 + (12 * 0) - 3 = 6 m(10) = 10 + (12 * ((14 - 10) // 12)) - 3 = 10 + (12 * 0) - 3 = 7 m(11) = 11 + (12 * ((14 - 11) // 12)) - 3 = 11 + (12 * 0) - 3 = 8 m(12) = 12 + (12 * ((14 - 12) // 12)) - 3 = 12 + (12 * 0) - 3 = 9 So, m is always > 0. Which also makes the expression ((153 * m) + 2) > 0, and 2) is proved. |
Table 15.14 Selected arithmetic calendars, with parameters for algorithms Calendar a y j m n r p q v u s t w A B C 1 Egyptian 3968 47 0 13 1 365 0 0 1 30 0 0 2 Ethiopian 4720 124 0 13 4 1461 0 3 1 30 0 0 3 Coptic 4996 124 0 13 4 1461 0 3 1 30 0 0 4 Republican b 6504 111 0 13 4 1461 0 3 1 30 0 0 396 578797 −51 5 Julian 4716 1401 2 12 4 1461 0 3 5 153 2 2 6 Gregorian 4716 1401 2 12 4 1461 0 3 5 153 2 2 184 274277 −38 7 Civil Islamic 5519 7664 0 12 30 10631 14 15 100 2951 51 10 8 Baha’i ´ c 6560 1412 19 20 4 1461 0 3 1 19 0 0 184 274273 −50 9 Saka 4794 1348 1 12 4 1461 0 3 1 31 0 0 184 274073 −36 Algorithm 3. To convert a date D/M/Y in one of the calendars listed in Table 15.14 to a Julian Day Number, J: 1. h = M − m 2. g = Y + y − (n − h)/n 3. f = mod(h − 1+ n, n) 4. e = (p ∗ g + q)/r + D − 1− j 5. J = e + (s ∗ f + t)/u 6. J = J − (3 ∗ ((g + A)/100))/4 − C |
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Wed Mar 25 02:55:27 2020 | http://epydoc.sourceforge.net |