ó
}\c           @   sK  d  Z  d d l Z d" d# f Z e d e d d k s< t ‚ e j d	 d d ƒ Z e j d
 d d ƒ Z e j d
 d d ƒ Z d d$ f Z d e f d „  ƒ  YZ	 d e	 f d „  ƒ  YZ
 d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d „  Z d „  Z d „  Z d% Z d „  Z d  „  Z d! „  Z d S(&   s°  
Tools for working with dates and times in Excel files.

The conversion from ``days`` to ``(year, month, day)`` starts with
an integral "julian day number" aka JDN.
FWIW:

- JDN 0 corresponds to noon on Monday November 24 in Gregorian year -4713.

More importantly:

- Noon on Gregorian 1900-03-01 (day 61 in the 1900-based system) is JDN 2415080.0
- Noon on Gregorian 1904-01-02 (day  1 in the 1904-based system) is JDN 2416482.0

iÿÿÿÿNièÙ$ i=   ibß$ i   i    i¶  ip  ik  i   i   i   i‚$- t   XLDateErrorc           B   s   e  Z d  Z RS(   s-   A base class for all datetime-related errors.(   t   __name__t
   __module__t   __doc__(    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyR    #   s   t   XLDateNegativec           B   s   e  Z d  Z RS(   s   ``xldate < 0.00``(   R   R   R   (    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyR   '   s   t   XLDateAmbiguousc           B   s   e  Z d  Z RS(   sG   The 1900 leap-year problem ``(datemode == 0 and 1.0 <= xldate < 61.0)``(   R   R   R   (    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyR   +   s   t   XLDateTooLargec           B   s   e  Z d  Z RS(   s   Gregorian year 10000 or later(   R   R   R   (    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyR   /   s   t   XLDateBadDatemodec           B   s   e  Z d  Z RS(   s#   ``datemode`` arg is neither 0 nor 1(   R   R   R   (    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyR   3   s   t   XLDateBadTuplec           B   s   e  Z RS(    (   R   R   (    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyR   7   s   c         C   s  | d k r t  | ƒ ‚ n  |  d k r+ d S|  d k  rF t |  ƒ ‚ n  t |  ƒ } |  | } t t | d ƒ ƒ } d | k o‰ d k n s” t ‚ | d k r» d } } } | d 7} n* t | d ƒ \ } } t | d ƒ \ } } | t | k rt |  ƒ ‚ n  | d k r&d d d | | | f S| d k  rM| d k rMt |  ƒ ‚ n  | t	 | }	 |	 d d	 d
 d d |	 d d d }
 |
 d d d d } | d d d } | d L} | d k rå|
 d d | d | | | | f S|
 d d | d | | | | f Sd S(   sU  
    Convert an Excel number (presumed to represent a date, a datetime or a time) into
    a tuple suitable for feeding to datetime or mx.DateTime constructors.

    :param xldate: The Excel number
    :param datemode: 0: 1900-based, 1: 1904-based.
    :raises xlrd.xldate.XLDateNegative:
    :raises xlrd.xldate.XLDateAmbiguous:

    :raises xlrd.xldate.XLDateTooLarge:
    :raises xlrd.xldate.XLDateBadDatemode:
    :raises xlrd.xldate.XLDateError:
    :returns: Gregorian ``(year, month, day, hour, minute, nearest_second)``.

    .. warning::

      When using this function to interpret the contents of a workbook, you
      should pass in the :attr:`~xlrd.book.Book.datemode`
      attribute of that workbook. Whether the workbook has ever been anywhere
      near a Macintosh is irrelevant.

    .. admonition:: Special case

        If ``0.0 <= xldate < 1.0``, it is assumed to represent a time;
        ``(0, 0, 0, hour, minute, second)`` will be returned.

    .. note::

        ``1904-01-01`` is not regarded as a valid date in the ``datemode==1``
        system; its "serial number" is zero.
    i    i   g        g     õ@i€Q i<   i=   i   ie/ i±: i   iS  iµ  i  iM  i @  i   i
   ik  i	   il  N(   i    i   (   i    i    i    i    i    i    (
   R   R   t   intt   roundt   AssertionErrort   divmodt   _XLDAYS_TOO_LARGER   R   t
   _JDN_delta(   t   xldatet   datemodet   xldayst   fract   secondst   hourt   minutet   secondt   minutest   jdnt   yregt   mpt   d(    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   xldate_as_tuple;   s:     
"*
"c         C   s…   | r t  } n |  d k  r$ t } n t } t |  ƒ } |  | } t t | d ƒ ƒ } t | d ƒ \ } } | t j | | d | ƒ S(   sá   
    Convert an Excel date/time number into a :class:`datetime.datetime` object.

    :param xldate: The Excel number
    :param datemode: 0: 1900-based, 1: 1904-based.

    :returns: A :class:`datetime.datetime` object.
    i<   g    p™”Aiè  i    (   t
   epoch_1904t
   epoch_1900t   epoch_1900_minus_1R	   R
   R   t   datetimet	   timedelta(   R   R   t   epocht   dayst   fractionR   t   milliseconds(    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   xldate_as_datetime‚   s    		
c         C   s.   |  d r d S|  d r d S|  d r* d Sd S(   Ni   i    id   i   i  (    (   t   y(    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   _leap¤   s    
 
 
 i   c   
      C   s  |  \ } } } | d k r* t  | ƒ ‚ n  | d k rR | d k rR | d k rR d Sd | k oi d k n s t d | | | f f ƒ ‚ n  d | k o¤ d k n sÈ t d | | | f f ƒ ‚ n  | d k  s	| t | k r(| d	 k o| d
 k ot | ƒ r(t d | | | f f ƒ ‚ n  | d } | } | d
 k r[| d } | d } n
 | d } d | d d | d d | d | d d d d } | t | }	 |	 d k rØt d | | | f f ƒ ‚ n  |	 d k  r| d k rt d | | | f f ƒ ‚ n  t |	 ƒ S(   sê  
    Convert a date tuple (year, month, day) to an Excel date.

    :param year: Gregorian year.
    :param month: ``1 <= month <= 12``
    :param day: ``1 <= day <= last day of that (year, month)``
    :param datemode: 0: 1900-based, 1: 1904-based.
    :raises xlrd.xldate.XLDateAmbiguous:
    :raises xlrd.xldate.XLDateBadDatemode:
    :raises xlrd.xldate.XLDateBadTuple:
      ``(year, month, day)`` is too early/late or has invalid component(s)
    :raises xlrd.xldate.XLDateError:
    i    i   g        il  i'  s   Invalid year: %ri   s   Invalid month: %ri   i   s   Invalid day: %ril  i	   i   iµ  i   iÓ  i   i    iT  i¸   id   s   Invalid (year, month, day): %ri=   s   Before 1900-03-01: %r(   i    i   (   R   R   t   _days_in_monthR(   R   R   t   float(
   t
   date_tupleR   t   yeart   montht   dayt   Ypt   Mt   MpR   R   (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   xldate_from_date_tuple­   s2    $5


:c         C   s›   |  \ } } } d | k o& d k  n r{ d | k oB d k  n r{ d | k o^ d k  n r{ | d | d | d St  d | | | f f ƒ ‚ d S(   s-  
    Convert a time tuple ``(hour, minute, second)`` to an Excel "date" value
    (fraction of a day).

    :param hour: ``0 <= hour < 24``
    :param minute: ``0 <= minute < 60``
    :param second: ``0 <= second < 60``
    :raises xlrd.xldate.XLDateBadTuple: Out-of-range hour, minute, or second
    i    i   i<   g      N@g      8@s"   Invalid (hour, minute, second): %rN(   R   (   t
   time_tupleR   R   R   (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   xldate_from_time_tupleÜ   s    
Tc         C   s   t  |  d  | ƒ t |  d ƒ S(   s+  
    Convert a datetime tuple ``(year, month, day, hour, minute, second)`` to an
    Excel date value.
    For more details, refer to other xldate_from_*_tuple functions.

    :param datetime_tuple: ``(year, month, day, hour, minute, second)``
    :param datemode: 0: 1900-based, 1: 1904-based.
    i   (   R2   R4   (   t   datetime_tupleR   (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   xldate_from_datetime_tupleì   s    
i«Ù$ iaß$ iÌ- (   Ni   i   i   i   i   i   i   i   i   i   i   i   (   R   R    R   R   R   R   R   R   t
   ValueErrorR    R   R   R   R   R   R   R&   R(   t   NoneR)   R2   R4   R6   (    (    (    s*   lib/python2.7/site-packages/xlrd/xldate.pyt   <module>   s(   	G	"		/	