o
    ȷe                     @   s   d Z ddlZdZed ed  dksJ edddZeddd	Zeddd
ZdZG dd deZG dd deZ	G dd deZ
G dd deZG dd deZG dd deZdd Zdd Zdd ZdZdd  Zd!d" Zd#d$ ZdS )%a  
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

    N)i$ ia$    i  ip  ik           )i$- i- c                   @      e Zd ZdZdS )XLDateErrorz-A base class for all datetime-related errors.N__name__
__module____qualname____doc__ r   r   B/var/www/ideatree/venv/lib/python3.10/site-packages/xlrd/xldate.pyr   #       r   c                   @   r   )XLDateNegativez``xldate < 0.00``Nr   r   r   r   r   r   '   r   r   c                   @   r   )XLDateAmbiguouszGThe 1900 leap-year problem ``(datemode == 0 and 1.0 <= xldate < 61.0)``Nr   r   r   r   r   r   +   r   r   c                   @   r   )XLDateTooLargezGregorian year 10000 or laterNr   r   r   r   r   r   /   r   r   c                   @   r   )XLDateBadDatemodez#``datemode`` arg is neither 0 nor 1Nr   r   r   r   r   r   3   r   r   c                   @   s   e Zd ZdS )XLDateBadTupleN)r	   r
   r   r   r   r   r   r   7   s    r   c                 C   s  |dvrt || dkrdS | dk rt| t| }| | }tt|d }d|  kr1dks4J  J |dkrCd } }}|d7 }nt|d\}}t|d\}}|t| kr[t| |dkrgddd|||fS |d	k rs|dkrst| |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S )aU  
    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.
    r   r           )r   r   r   r   r   r   g     @r   iQ r   <   =      ie/ i:    iS    i  iM  i @     
   ik  	   l  )	r   r   introunddivmod_XLDAYS_TOO_LARGEr   r   
_JDN_delta)xldatedatemodexldaysfracsecondshourminutesecondminutesjdnyregmpdr   r   r   xldate_as_tuple;   s:    
(r2   c                 C   s^   |rt }n	| dk rt}nt}t| }| | }tt|d }t|d\}}|t||d| S )z
    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.
    r   g    pAi  r   )
epoch_1904
epoch_1900epoch_1900_minus_1r    r!   r"   datetime	timedelta)r%   r&   epochdaysfractionr)   millisecondsr   r   r   xldate_as_datetime   s   r<   c                 C   s(   | d rdS | d rdS | d rdS dS )Nr   r   d   r   i  r   )yr   r   r   _leap   s   r?   )Nr      r   r   r   r   r   r   r   r   r   r   c           
      C   s  | \}}}|dvrt ||dkr|dkr|dkrdS d|  kr%dks0n td|||ff d|  kr:dksEn td	|||ff |dk s[|t| kre|d
kr[|dkr[t|setd|||ff |d }|}|dkrx|d }|d }n|d }d| d d| d d  | d |d d d d  }|t|  }	|	dkrtd|||ff |	dk r|dkrtd|||ff t|	S )a  
    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:
    r   r   r   il  i'  zInvalid year: %rr   r   zInvalid month: %r      zInvalid day: %rr   r   r   r   r   i         iT     r=   zInvalid (year, month, day): %rr   zBefore 1900-03-01: %r)r   r   _days_in_monthr?   r$   r   float)

date_tupler&   yearmonthdayYpMMpr.   r'   r   r   r   xldate_from_date_tuple   s>   
$
rO   c                 C   s~   | \}}}d|  krdk r5n n$d|  krdk r5n nd|  kr'dk r5n n|d | d | d S t d|||ff )a-  
    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
    r      r   g      N@g      8@z"Invalid (hour, minute, second): %r)r   )
time_tupler*   r+   r,   r   r   r   xldate_from_time_tuple   s   

HrR   c                 C   s"   t | dd |t| dd  S )a+  
    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.
    Nr   )rO   rR   )datetime_tupler&   r   r   r   xldate_from_datetime_tuple   s   
rT   )r   r6   r$   r3   r4   r5   r#   
ValueErrorr   r   r   r   r   r   r2   r<   r?   rF   rO   rR   rT   r   r   r   r   <module>   s*   G"/