³ò jÈKc @s÷dZddklZlZddklZlZlZlZl Z ddd„ƒYZ de fd„ƒYZ d„Z e d jopdd kZd eiƒGHdd klZdd kZdd kZd efd„ƒYZeeiƒiƒnd S(sq These classes translate between date tuples and Julian Day numbers. There are two types of applications for Julian Days. In the first, each day in history is assigned a unique integer, such that the days follow each other in the same order the integers do. A day is described by a triple (yr, mo, da). Times of day are not an issue; neither are time zones. For this kind of date, use the JulianDay class (tag jd). Other applications need Julian Days to be floating point numbers, with fractions of a day. On the date side, the tuple extends into hours, minutes and seconds. For this kind of date, use the JulianDayTime class (tag jdt). Instances of both of these classes are called "jd objects". The zero point of all jd objects is adopted from astronomical convention: January 1, -4712; specifically noon of that day. Astronomers wanted a positive date number for all reasonable dates, and they didn't want that number changing at midnight, in the middle of prime observing time. >>> JulianDay(0).getDt() (-4712, 1, 1) >>> JulianDayTime(0.).getDt() (-4712, 1, 1, 12, 0, 0, 0.0) Note how the tuple returned by JulianDateTime.getDt() has 7 components: the 6 standard ones plus a floating point number representing fractions of a second. >>> JulianDayTime(2451545).getDt() (2000, 1, 1, 12, 0, 0, 0.0) >>> JulianDayTime(2451545+2.33e-10).getDt() # resolution is 2.33e-10 days (2000, 1, 1, 12, 0, 0, 4.0233135223388672e-05) >>> (JulianDayTime((2000,1,1,12,0,2.02e-5))-2451545).getJd() # or 2.02e-5 sec 4.6566128730773926e-10 You can add a number to a jd object (or a jd object to a number) to get a new jd object, you can subtract two jd objects to get a number, and subtract a number from a jd object to get another jd object. These numbers' units are all days. You can, given one type of jd object, get an equivalent one of the other type using self.ToJd() or self.ToJdt() as appropriate. US Presidential inauguration plus 100 days -- the end of the "honeymoon": >>> (100 + JulianDay((2009,1,20))).getDt() (2009, 4, 30) Length of John F. Kennedy administration (sometimes called "1000 days"): >>> JulianDay((1963,11,22)) - JulianDay((1961,1,20)) 1036 Note the absence of a 12 hour offset if you don't use JulianDay(): >>> (JulianDayTime((2008,3,1)) - 1).getDt() (2008, 2, 29, 0, 0, 0, 0.0) The algorithms are from Jan Meeus, _Astronomical Algorithms_, chapter 7. Willmann-Bell: Richmond, VA. ISBN 0-943396-35-2. iÿÿÿÿ(tfloortmodf(t struct_timet localtimetmktimettimezonetaltzonet JulianDaycBs¼eZdZdd„Zd„Zd„Zd„Zd„Zdd„Z dd„Z d„Z d „Z d „Z d „Zdd „Zd „Zd„Zd„Zd„Zd„Zd„ZRS(s3The class for integer dates, without time of day. cCsŠt|tƒot|ƒ}nt|ttfƒo*|i|ƒ|i|i||ƒƒn'|i|i||ƒƒ|i|ƒdS(s:D is either a numeric Julian Day, or a date tuple or list.N(t isinstancetlistttupleRtsetDttsetJdt TupleToJdt JdToTuple(tselftDt isGregorian((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__init__Ms cCst|ƒ|_dS(N(tinttnJd(RR((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR XscCs|iS(N(R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytgetJdYscCs ||_dS(N(tdt(RR((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR [scCs|iS(N(R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytgetDt\sc CsÚ|ddt|ƒdd!}|djod|j}n|\}}}|djo|d|d}}nd}|o |d }d||d }ntd |d ƒtd |dƒ||d}t|ƒS(Niiii.i iii idigÔv@ihgœ>@i?(i(i.i i(tlentNoneRR( RRRtnYrtnMotnDatBtAtxJd((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR ^s   2c Cs|}|djod|j}n|o4t|ddƒ}|d|t|dƒ}n|}|d}t|ddƒ}td|ƒ}t||d ƒ} t|ƒd } t| ƒd} t||td | ƒƒ} d | jo| d| d } } n| | | fS( Ni#g@Ð}@ihi (RRR( RRRtZtalphaRRtCRtERRR((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyRks"    cCsd|iƒ|iƒfS(Ns%s = %s(RR(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__str__€scCs&|iƒddd|iƒddfS(Niiiÿÿÿÿ(RtWeekday(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt ToDateTuple…scCs|S(N((R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytToJdˆscCstt|iƒƒƒS(N(t JulianDayTimetfloatR(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytToJdt‰scCs%|djo|iƒ}n|dS(Ni(RR(RtnDay((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR%‹s cCs|i|iƒ|ƒS(N(t __class__R(Rtother((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__add__‘scCs||S(N((RR-((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__radd__’scCs5t|tƒo|iƒ|iƒSn || SdS(N(RRR(RR-((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__sub__”scCs|iƒiƒS(N(R*R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt __float__šscCs |iƒS(N(R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__int__›scCsb|iƒ|iƒ}}|itjo|d8}n|itjo|d8}nt||ƒS(Ngà?(RR,Rtcmp(RR-txJdSelftxJdOther((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyt__cmp__s N(t__name__t __module__t__doc__RRR RR RR RR$R&R'R*R%R.R/R0R1R2R6(((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyRGs&               R(cBs†eZdZd„Zd„Zd d„Zd d„Zd„Ze d„Z d„Z d„Z d „Z d d „Zd „Zd „ZRS(s¤The class for fractional dates, and times of day. It's subclassed because it starts with the same integer calculations, then grafts the time of day onto that. cCst|ƒ|_dS(N(R)R(RR((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR ¯scCs|iS(N(R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR°sc Cs‚|dd!|d}}ti|||ƒ}|ddt|ƒdd!}|\}}}} |d|d|d|| dS(skGiven a tuple which is a prefix of (yr, mo, da, hr, min, sec, F), produce a (float) Julian Day number. iiigà?i<gõ@(i(RR R( RRRtdtDatetdtTimeRtnHrtnMintnSectxF((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR ²s c Cs§t|dƒ\}}ti|t|ƒ|ƒ\}}}t|dƒ\}}t|dƒ\}} t|dƒ\}} |||t|ƒt| ƒt| ƒ|fS(sProduce a 7-tuple: (yr, mo, da, hr, min, sec, F), where sec is made an integer and F stores its fractional part. noon - (.001 day = 86.4 sec = 1:26.4) = 11:58:33.6 >>> '%d.%d.%d %d:%02d:%02d+%.5f' % JulianDayTime(-0.001).getDt() '-4712.1.1 11:58:33+0.60000' gà?ii<(RRRR( RRRR?RRRRtxHrtxMintxSec((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR¼s $cCsA|idtƒ}t }|ddjo t }n||dS(Nt isLocalizediigõ@(R&tTrueRR(RRtsecTz((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytToLocalÍs  cCsA|iƒdd!|iƒddf}|ot|ƒ}n|S(Niiiiÿÿÿÿ(RR%tLocalize(RRCR((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR&Ós&cCs|i|iƒ|dƒS(Ngõ@(R,R(RRE((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytJdToTzØscCst|iƒdd!ƒS(Nii(RR(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR'ÛscCs|S(N((R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR*ÜscCs=|djo|iƒ}nti|tt|dƒƒƒS(Ngà?(RRRR%RR(RtxDay((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR%Þs cCs |iƒS(N(R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR1äscCs|iƒiƒS(N(R'R(R((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR2åsN(R7R8R9R RRR RRFRDR&RHR'R*R%R1R2(((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyR(¤s          cCsmytt|ƒƒ}Wn1tj o |}ntj o |}nX|d|djo |}n|S(sÑTry to get daylight savings information from the operating system clock, safely. Only works in the Unix date range: 1901.12.13T20:45:52Z ... 2038.01.19T3:14:07Z; other date tuples are returned unchanged. i(RRt OverflowErrort ValueError(RtdtT((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyRGçs   t__main__Ns%d tests failed out of %d(t evaluatortjdtcBs,eZdZdZeidƒZd„ZRS(sëusage: %prog [options] number|date ... Translate Julian Day numbers to dates and vice versa. Dates are strings, with numerical values delimited by any non-digit. Use "~" instead of "-" for negative years or negative Julian Day numbers.s%prog 2008.06.22.0s\DcCs|ddjod|d}nyt|ƒ}Wntj onXt|ƒiƒSyt|ƒ}Wntj onXt|ƒiƒSy7g}|ii|ƒD]}|t|ƒq©~}Wntj o }|SnXt|ƒdjot|ƒi ƒSnt|ƒi ƒSdS(s&process a single command line argumentit~t-iiN( RRKRRR)R(treSplittsplitRR(RtsArgRRt_[1]tstlnArgtex((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pytfunctions&7 (R7R8tsUsagetsVersiontretcompileRRRY(((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pyROÿs ((R9tmathRRttimeRRRRRRR(RGR7tdoctestttestmodtcommander.commanderRNR\tsysROtargvtmain(((sm/Users/amos/Documents/Database/Mental/Programming/python/lib/avatar/Personal2/www.amos/Python/lib/date/jdt.pys@s(]C   &