Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 NebVã @s~dZdZd>ZdZddddddddddddg Zddddddddddddg ZdZejƒjƒZ ejƒZd Z e jƒjƒZ e jƒZ d d l Z d d l Z d d lZd d lmZee dƒr´eee jfZneefZe jde je jBƒZe jdƒZdd„Zdd„Zdd„Zdd„Zdd„ZGdd„de ƒZ!Gdd„dƒZ"dd „Z#d!d"„Z$d#d$„Z%d%d&„Z&d'd(„Z'e#ƒZ(e"Z)e)d)ƒZ*d?Z+Gd+d,„d,e"ƒZ,e-d-k�rze"ƒZ.e/d.ƒe/d/e.e.j0ƒe.j1ƒfƒe.d Z2e/d0e2j0ƒe2j1ƒfƒe.d Z3e/d1e3j0ƒe3j1ƒfƒe/d2e3e2ƒe/e.j4d3ƒƒe/e.j4d4ƒƒe/e.j4d5ƒƒe/e.j4d6ƒƒe/e.j4d7ƒƒe/e.j4d8ƒƒe/e.j4d9ƒƒe/e.j4d:ƒƒe,d;ƒZ5e/d+sz)getStdShortMonthNames..)r r r r r ÚgetStdShortMonthNames*srcCstS)N)Ú_dayOfWeekNameLowerr r r r ÚgetStdDayNames-srcCsdd„tƒDƒS)NcSsg|]}|dd…‘qS)Nr r )rrr r r r1sz'getStdShortDayNames..)rr r r r ÚgetStdShortDayNames0srcCsR|dkr|drdSdSn4|ddkr*dS|ddkr:dS|ddkrJdSdSdS)z@determine if specified year is leap year, returns Python booleani@érrédi�Nr )Úyearr r r Ú isLeapYear3s   rc@seZdZdZdS)ÚNormalDateExceptionzException class for NormalDateN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r r r r rCsrc@sîeZdZdZdwdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zedd„ƒZdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Z d;d<„Z!d=d>„Z"d?d@„Z#dAdB„Z$dCdD„Z%dEdF„Z&dGdH„Z'dIdJ„Z(dKdL„Z)dMdN„Z*dOdP„Z+dQdR„Z,dSdT„Z-dUdV„Z.dWdX„Z/edYdZ„ƒZ0d[d\„Z1d]d^„Z2d_d`„Z3dadb„Z4dcdd„Z5dedf„Z6dgdh„Z7didj„Z8dkdl„Z9dmdn„Z:e9Z;dodp„Zdudv„Z?dS)xÚ NormalDateaT NormalDate is a specialized class to handle dates without all the excess baggage (time zones, daylight savings, leap seconds, etc.) of other date structures. The minimalist strategy greatly simplifies its implementation and use. Internally, NormalDate is stored as an integer with values in a discontinuous range of -99990101 to 99991231. The integer value is used principally for storage and to simplify the user interface. Internal calculations are performed by a scalar based on Jan 1, 1900. Valid NormalDate ranges include (-9999,1,1) B.C.E. through (9999,12,31) C.E./A.D. 1.0 No changes, except the version number. After 3 years of use by various parties I think we can consider it stable. 0.8 Added Prof. Stephen Walton's suggestion for a range method - module author resisted the temptation to use lambda <0.5 wink> 0.7 Added Dan Winkler's suggestions for __add__, __sub__ methods 0.6 Modifications suggested by Kevin Digweed to fix: - dayOfWeek, dayOfWeekAbbrev, clone methods - Permit NormalDate to be a better behaved superclass 0.5 Minor tweaking 0.4 - Added methods __cmp__, __hash__ - Added Epoch variable, scoped to the module - Added setDay, setMonth, setYear methods 0.3 Minor touch-ups 0.2 - Fixed bug for certain B.C.E leap years - Added Jim Fulton's suggestions for short alias class name =ND and __getstate__, __setstate__ methods Special thanks: Roedy Green NcCs,|dkr|jtjtjƒƒƒn |j|ƒdS)a‰ Accept 1 of 4 values to initialize a NormalDate: 1. None - creates a NormalDate for the current day 2. integer in yyyymmdd format 3. string in yyyymmdd format 4. tuple in (yyyy, mm, dd) - localtime/gmtime can also be used 5. string iso date format see _iso_re above 6. datetime.datetime or datetime.date N)Ú setNormalDateÚtimeÚ localtime)ÚselfÚ normalDater r r Ú__init__zs zNormalDate.__init__cCs(t|tƒstdƒ‚|j|jƒ|ƒdS)z3add days to date; use negative integers to subtractz)add method parameter must be integer typeN)Ú isinstanceÚintrÚ normalizeÚscalar)r"Údaysr r r Úadd‰s zNormalDate.addcCs(t|tƒstdƒ‚|jƒ}|j|ƒ|S)z)r"r r r Ú__day_of_week_name__ÇszNormalDate.__day_of_week_name__cCs|j|jƒdd…S)z@return day of week abbreviation for current date: Mon, Tue, etc.Nr )r@r<)r"r r r ÚdayOfWeekAbbrevËszNormalDate.dayOfWeekAbbrevcCs|j|jƒS)z?return day of week name for current date: Monday, Tuesday, etc.)r@r<)r"r r r Ú dayOfWeekNameÏszNormalDate.dayOfWeekNamecCsH|jƒrt}nt}d}x$t|jƒdƒD]}|||}q(W|jƒ|S)z day of yearrr)rÚ_daysInMonthLeapYearÚ_daysInMonthNormalÚrangeÚmonthr;)r"Ú daysByMonthÚpriorMonthDaysÚmr r r Ú dayOfYearÓszNormalDate.dayOfYearcCs2t|tƒr|jƒ|jƒS|jƒt|ƒjƒSdS)z` return value may be negative, since calculation is self.scalar() - arg N)r%rr()r"r#r r r ÚdaysBetweenDatesÞs zNormalDate.daysBetweenDatescCs2t|tƒr*|dkr|jdkS|j|jkSndSdS)Nr)r%rr#)r"Útargetr r r Úequalsès   zNormalDate.equalscCs"|j|jƒdd…t|jƒƒƒS)z"returns (cloned) last day of monthér8iøÿÿÿr9)r/Ú__repr__ÚstrÚlastDayOfMonth)r"r r r Ú endOfMonthñszNormalDate.endOfMonthcCs|j|jƒdd…dƒS)z#returns (cloned) first day of monthrNr8Z01iøÿÿÿr9)r/rO)r"r r r ÚfirstDayOfMonthõszNormalDate.firstDayOfMonthcCs.|jƒ}d|dd…|dd…|d d …fS) z3return date as string in common US format: MM/DD/YYz%s/%s/%srr8Nééüÿÿÿr9r9iúÿÿÿrU)rO)r"Údr r r ÚformatUSùszNormalDate.formatUScCs.|jƒ}d|dd…|dd…|d d …fS) z;return date as string in 4-digit year US format: MM/DD/YYYYz%s/%s/%srr8NrNrUr9r9iøÿÿÿrU)rO)r"rVr r r ÚformatUSCenturyþszNormalDate.formatUSCenturycCs t|jƒƒS)N)rPrF)r"r r r Ú_fmtMszNormalDate._fmtMcCs d|jƒS)Nz%02d)rF)r"r r r Ú_fmtMMszNormalDate._fmtMMcCs|jƒS)N)Ú monthAbbrev)r"r r r Ú_fmtMMM szNormalDate._fmtMMMcCs|jƒS)N)Ú monthName)r"r r r Ú_fmtMMMM szNormalDate._fmtMMMMcCs |jƒdS)Nr)r])r"r r r Ú _fmtMMMMMszNormalDate._fmtMMMMMcCs t|jƒƒS)N)rPr;)r"r r r Ú_fmtDszNormalDate._fmtDcCs d|jƒS)Nz%02d)r;)r"r r r Ú_fmtDDszNormalDate._fmtDDcCs|jƒS)N)rA)r"r r r Ú_fmtDDDszNormalDate._fmtDDDcCs|jƒS)N)rB)r"r r r Ú_fmtDDDDszNormalDate._fmtDDDDcCsd|jƒdS)Nz%02dr)r)r"r r r Ú_fmtYYszNormalDate._fmtYYcCs t|jƒƒS)N)rPr)r"r r r Ú_fmtYYYY!szNormalDate._fmtYYYYcCs„|dd…}d}xntj||ƒ}|rxt|d|jƒdd…jƒƒƒ}|jƒ\}}|d|…|||d…}|t|ƒ}q|SqWdS)aÑformat like MS date using the notation {YY} --> 2 digit year {YYYY} --> 4 digit year {M} --> month as digit {MM} --> 2 digit month {MMM} --> abbreviated month name {MMMM} --> monthname {MMMMM} --> first character of monthname {D} --> day of month as digit {DD} --> 2 digit day of month {DDD} --> abrreviated weekday name {DDDD} --> weekday name NrÚ_fmtréÿÿÿÿ)Ú_fmtPatÚsearchr?ÚgroupÚupperÚspanÚlen)r"ÚfmtÚrÚfrIÚyÚiÚjr r r ÚformatMS$s    zNormalDate.formatMScCs|jS)z(minimize persistent storage requirements)r#)r"r r r Ú __getstate__>szNormalDate.__getstate__cCs t|jƒS)N)Úhashr#)r"r r r Ú__hash__BszNormalDate.__hash__cCs|jS)N)r#)r"r r r Ú__int__EszNormalDate.__int__cCs t|jƒƒS)zc determine if specified year is leap year, returning true (1) or false (0) )rr)r"r r r rHszNormalDate.isLeapYearcCs>t|tƒsdStt|ƒƒdkr"dS|dkr4d|}nd|}t|ƒdkrLdSt|ƒdkrt|ddkrt|ddkrtdSt|dd…ƒ}|dksœ|d ksœ|dkr dSt|dd…ƒ}|d ksÀ|d krÄdSt|ƒrÚt|d }n t|d }t|dd…ƒ}|d k�s ||k�rdS|dk�r:|dk�r:|d k�r:|dk�r:dSd S)z.checks for date validity in [-]yyyymmdd formatré z%09dz%08drNú-ú+Nri'r8ré i.é érUiñØÿÿrUr9r9)r%r&rmr:rrCrD)r"r#ZdateStrrrFÚmaxDayr;r r r Ú_isValidNormalDateOs6     (zNormalDate._isValidNormalDatecCs,|jƒrt|jƒdSt|jƒdSdS)z.returns last day of the month as integer 28-31rN)rrCrFrD)r"r r r rQoszNormalDate.lastDayOfMonthcCs|jƒS)z8override this method to use your preferred locale format)rW)r"r r r Ú localeFormatvszNormalDate.localeFormatcCstt|jƒdd…ƒS)zreturns month as integer 1-12rr8rUr9)r&r:r#)r"r r r rFzszNormalDate.monthcCs t|dtƒS)NÚ _monthName)r?r‚)r"r r r Ú__month_name__~szNormalDate.__month_name__cCs|j|jƒddd…S)z@returns month as a 3-character abbreviation, i.e. Jan, Feb, etc.rNr )rƒrF)r"r r r r[‚szNormalDate.monthAbbrevcCs|j|jƒdS)z0returns month name, i.e. January, February, etc.r)rƒrF)r"r r r r]†szNormalDate.monthNamec Cs²|tkrdt}t|ƒ‚|tkr0dt}t|ƒ‚ddlm}|dkr^dt||ddƒƒ}n:|dkr€d t||d dƒƒ}ndt||d dƒƒ}|t|ƒd }|dkrÈ|d }|t|ƒd }d}t|ƒrÜ|d }||k�rþ|d }|t|ƒd }|dk�r|dk�r|d}t|ƒ�r*t}nt }d}d} x6t t |ƒƒD]&} ||| }||k�rD| d } P�qDWd} x"t | d ƒD]} | || } �q€W|| } |j || | fƒdS)zconvert scalar to normalDatez#normalize(%d): scalar below minimumz%normalize(%d): scalar exceeds maximumr)Úfloori”Äi@i¬g{®GáÓv@i]• ri‘ i› rimiGÄr}r|Nil;þÿi£jõÿrUil;þÿi¹;þÿ) Ú_bigBangScalarrÚ_bigCrunchScalarÚmathr„r&ÚfirstDayOfYearrrCrDrErmr) r"r(Úmsgr„rr)Z daysInYearrGZdcrFrIrHr;r r r r'ŠsR     zNormalDate.normalizecCs:t|tƒs||}g}xt|ƒD]}|j||ƒq W|S)zXReturn a range of normalDates as a list. Parameter may be an int or normalDate.)r%r&rEÚappend)r"r)rorrr r r rE¹s  zNormalDate.rangecCs"|jdkrd|jSd|jSdS)zprint format: [-]yyyymmddrz%09dz%08dN)r#)r"r r r rOÃs  zNormalDate.__repr__cCs˜|jƒ\}}}t|ƒ|d}|jƒrJxDt|dƒD]}|t|}q4Wn"x t|dƒD]}|t|}qXW|dkr”|dksŒ|dkr”|dkr”|d}|S)z%days since baseline date: Jan 1, 1900ri.r}r)r=rˆrrErCrD)r"rrFr;r)rIr r r r(ÍszNormalDate.scalarcCsJ|jƒ}|dks||kr(d|}t|ƒ‚|jƒ\}}}|j|||fƒdS)zset the day of the monthrzday is outside of range 1 to %dN)rQrr=r)r"r;rr‰rqrIrVr r r ÚsetDayÜs zNormalDate.setDaycCs:|dks|dkrtdƒ‚|jƒ\}}}|j|||fƒdS)zset the month [1-12]rr|zmonth is outside range 1 to 12N)rr=r)r"rFrqrIrVr r r ÚsetMonthåszNormalDate.setMonthc Cs t|tƒr||_nÖt|ƒr|yt|ƒ|_Wqètj|ƒ}|rd|j|jdƒ|jdƒ|jdƒƒntdt |ƒƒ‚YqèXnlt|t ƒržtd|dd…ƒ|_nJt|t ƒr²|j|_n6t|t j t j fƒrâ|jd|jd|j|_nd|_|j|jƒ�stdt |ƒƒ‚dS)zb accepts date as scalar string/integer (yyyymmdd) or tuple (year, month, day, ...)rr8r zunable to setNormalDate(%s)z %04d%02d%02dNr)r%r&r#rÚ_iso_reÚmatchrrjrr:Ú _DateSeqTypesrÚdatetimeÚdaterrFr;r€)r"r#rIr r r rìs&  &   zNormalDate.setNormalDatecCsV|dkrtdƒ‚n"|dkr$tdƒ‚n|dkr4tdƒ‚|jƒ\}}}|j|||fƒdS)Nrzcannot set year to zeroi'zyear cannot be less than -9999z year cannot be greater than 9999iñØÿÿ)rr=r)r"rrqrIrVr r r ÚsetYears  zNormalDate.setYearcCs&t|tƒr|j| ƒS|jƒ|jƒS)N)r%r&r-r()r"Úvr r r Ú__sub__s  zNormalDate.__sub__cCs*t|tƒrt|ƒ|S|jƒ|jƒSdS)N)r%r&rr()r"r“r r r Ú__rsub__s  zNormalDate.__rsub__cCs|jƒ|jƒ|jƒfS)z'return date as (year, month, day) tuple)rrFr;)r"r r r r=szNormalDate.toTuplecCstt|jƒdd…ƒS)z9return year in yyyy format, negative values indicate B.C.NrrU)r&r:r#)r"r r r r!szNormalDate.year)N)@rrrrr$r*r-r.r+r2r3r4r5r6r7r;r<Úpropertyr@rArBrJrKrMrRrSrWrXrYrZr\r^r_r`rarbrcrdrertrurwrxrr€rQr�rFrƒr[r]r'rErOr(r‹rŒrr’Ú __setstate__r”r•r=rr r r r rGsx2        /    rcCstdƒS)z%return lower boundary as a NormalDatei'réñØÿÿ)r˜rr)rr r r r ÚbigBang'sr™cCstdƒS)z%return upper boundary as a NormalDateé'r|r)ršr|r)rr r r r Ú bigCrunch+sr›cCs\|dks|dkr |d}|d}|d|d|dd||d|d|dd S) z;return integer representing day of week, Mon=0, Tue=1, etc.rr8r|r érri�ér )rqrIrVr r r r</sr<cCs¾t|tƒsdt|ƒ}t|ƒ‚|dkr0tdƒ‚nŠ|dkrV|dt|ddƒd}ndt|ddƒ}|d krš|t|d d d ƒt|d d d ƒ}|d|d}|dkrº|d}|S)z@number of days to the first of the year, relative to Jan 1, 1900z)firstDayOfYear() expected integer, got %srz$first day of year cannot be zero (0)imrri\• r i@écri�i�iË– i.r})r%r&Útyper)rr‰ZfirstDayZ leapAdjustr r r rˆ6s   rˆcCst|tƒr|pt|ƒS)zconvert to ND if required)r%rÚND)rVr r r ÚFNDIsr¡iÚhñi‘Äc@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)Ú BusinessDatez Specialised NormalDate cCs(t|tƒstdƒ‚|j|jƒ|ƒdS)z3add days to date; use negative integers to subtractz$add method parameter must be integerN)r%r&rr'r()r"r)r r r r*Vs zBusinessDate.addcCs(t|tƒstdƒ‚|jƒ}|j|ƒ|S)z>add integer to BusinessDate and return a new, calculated valuez!__add__ parameter must be integer)r%r&rr+r*)r"r)r,r r r r-\s   zBusinessDate.__add__cCs&t|tƒr|j| ƒp$|jƒ|jƒS)N)r%r&r-r()r"r“r r r r”dszBusinessDate.__sub__cCs t|jƒS)N)r r#)r"r r r Ú asNormalDategszBusinessDate.asNormalDatecCs |jj|ƒS)N)r£rK)r"r#r r r rKjszBusinessDate.daysBetweenDatescCs|jƒdkrtd|jƒ‚dS)Nrz%r isn't a business day)r<rr#)r"r r r Ú _checkDOWms zBusinessDate._checkDOWcCs,t|ƒ}tj||dd|dtƒdS)Nrœr�)r&rr'Ú BDEpochScalar)r"rrr r r r'pszBusinessDate.normalizecCs$|jƒ}|t}d|d|dS)Nrœr�)r£ÚBDEpoch)r"rVrrr r r r(tszBusinessDate.scalarcCstj||ƒ|jƒdS)N)rrr¤)r"r#r r r rzs zBusinessDate.setNormalDateN) rrrrr*r-r”r£rKr¤r'r(rr r r r r¢Rsr¢Ú__main__zNormalDate test:z Today (%s) is: %s %sz Yesterday was: %s %sz Tomorrow will be: %s %sz) Days between tomorrow and yesterday: %dz {d}/{m}/{yy}z {dd}/{m}/{yy}z{ddd} {d}/{m}/{yy}z{dddd} {d}/{m}/{yy}z {d}/{mm}/{yy}z{d}/{mmm}/{yy}z{d}/{mmmm}/{yy}z{d}/{m}/{yyyy}Z20010116zb=z b.scalar()i|°½ÿio;þÿ)7Ú __version__rr…r†rDrCr>ÚlowerÚsplitrr‚r Úrer r�Úutilsrr0ÚlistÚtuplerr�ÚcompileÚ MULTILINEÚ IGNORECASErhr�r rrrrÚ Exceptionrrr™r›r<rˆr¡ZEpochr r¦r¥r¢rÚtodayÚprintrAr�Z yesterdayZtomorrowrtÚbr(r r r r Ú sr     c,