
    [/                     v   d dl mZ 	 dZd dlmZ d dlZd dlmZmZmZ d dl	Z		  e	j
        d          Z	 dddd d d d dZ G d	 d
e          Z G d d          Zd Zd Zedk    rQdD ]Z ee          Zedk    r  ed                    e                     J  ee          Z ee          Zej        e                    ej                  Zeek    r  ed                    e                     J  ee                                          Zedk    r  ed                    e                     J  eedee           dD ]3Z ee          Zedk    r  ed                    e                     J 4dD ]5Z ee          Zedk    r  ed                    e                     J 4dS dS )    )print_functionzVMware, Inc.)	iteritemsN)datetime	timedeltatzinfoa,  (?P<year>-?\d{4})(-(?P<month>(0[1-9]|1[0-2]))(-(?P<day>(0[1-9]|[1-2]\d|3[01])))?)?(T(?P<hour>([01]\d|2[0-4]))((:(?P<minute>[0-5]\d))(:(?P<second>([0-5]\d|60))(\.(?P<microsecond>\d{1,16}))?)?)?((?P<tzutc>Z)|((?P<tzhr>[+-](([0]\d)|(1[0-3])|(?P<tzlimit>)14))(:(?P<tzmin>(?(tzlimit)00|([0-5]\d))))?))?)?$   )yearmonthdayhourminutesecondmicrosecondc                   \    e Zd ZdZ ed          Z ed          ZddZd Zd	 Z	d
 Z
dS )TZInfoz Timezone info class r   hoursr   UTCNc                 J    || _         |s| j        }|| _        |sd }|| _        d S N)_tzname
timedelta0
_utcOffset_dst)selftzname	utcOffsetdsts       1/usr/lib/python3/dist-packages/pyVmomi/Iso8601.py__init__zTZInfo.__init__F   s7    dl %_!do diii    c                 <    | j         |                     |          z   S r   )r   r   r   dts     r   	utcoffsetzTZInfo.utcoffsetO   s    _txx||++r!   c                     | j         S r   )r   r#   s     r   r   zTZInfo.tznameR   s
    \r!   c                     | j         }| j        rA| j        d         |                    d           cxk    r| j        d         k     r
n n| j        }|S )Nr   r   r   )r   r   replace
timedelta1)r   r$   rets      r   r   z
TZInfo.dstU   s[    Oc	 "IaLBJJdJ33BBBBdilBBBBB/Cjr!   r   NN)__name__
__module____qualname____doc__r   r   r*   r    r%   r   r    r!   r   r   r   @   s        	""":	""":   , , ,      r!   r   c                   .    e Zd ZdZi Zedd            ZdS )	TZManagerz Time zone manager r   Nc                     | ||f}t           j                            |          }|s t          | ||          }|t           j        |<   |S )z Get / Add timezone info )r3   _tzInfosgetr   )r   r   r   keytzInfos        r   	GetTZInfozTZManager.GetTZInfoa   sQ     Y$c!%%c**f *C00#)	C	 mr!   r,   )r-   r.   r/   r0   r5   staticmethodr9   r1   r!   r   r3   r3   ]   s=        8   L  r!   r3   c                    d}t                               |           }|r%	 i }t          t                    D ]\\  }}|                    |          }|r9|dk    r |dd         ddt          |          z
  z  z   }t          |          ||<   U|r|||<   ]d}|                    dd          dk    rf|                    dd          dk    rJ|                    d	d          dk    r0|                    dd          dk    rd
|d<   t          d          }ndS d}|                    d          }|rt          
                                }n|                    d          }|rt          |          }	|d         }
d}|                    d          }|r%|	dk    rt          |          pt          |           }d}|	dk    s|dk    r%|d|
t          |	          t          |          fz  z  }t          
                    |t          |	|                    }|r||d<   t          di |}|r||z  }n# t          $ r
}Y d}~nd}~ww xY w|S )a  
   Parse ISO 8601 date time from string.
   Returns datetime if ok, None otherwise
   Note: Allows YYYY / YYYY-MM, but truncate YYYY -> YYYY-01-01,
                                             YYYY-MM -> YYYY-MM-01
         Truncate microsecond to most significant 6 digits
   Nr      0r   r      r   r      r   r   tzutctzhrtzminr   z %s%02d:%02d)r   minutes)r   r   r   r1   )_dtExprmatchr   _dtExprKeyDefValMapgrouplenintr6   r   r3   r9   absr   	Exception)datetimeStrdatetimeValrE   r$   r7   
defaultValvaldeltar8   rA   utcsignrB   r   es                 r   ParseISO8601rS   l   s    ;==%%5 >= )*= > > 
$ 
$_S*++c""C $&&BQB#SXX"66#Sr#ww $#r#w FF61##vvh""a''BFF8Q,?,?1,D,DvvmQ''1,,r&z q)))uud {{7## 
P((**FF++f%%C P#hhtQw u[[))s >!)0C=SXXI% v!))uzzNgs4yy#e**-MMM&!++66?dHM7O 7O 7O , P Pv  
"!BxL~~"~~ 
!5 K   	
s   C3H. DH. .
I=Ic                    |                      d          }| j        r |d| j        z                      d          z  }| j        r|                      d          }n_t          j        r)t	          j                    j        rt          j         dz  }nt          j	         dz  }d|dz  t          |          dz  fz  }|dk    r|dz   S |r||d	d
         z   dz   |d
d	         z   S |dz   S )z
   Python datetime isoformat() has the following problems:
   - leave trailing 0 at the end of microseconds (violates XMLSchema rule)
   - tz print +00:00 instead of Z
   - Missing timezone offset for datetime without tzinfo
   z%Y-%m-%dT%H:%M:%Sz.%06dr=   z%z<   z	%+.2d%.2dz+0000ZN   :z-00:00)strftimer   rstripr   timedaylight	localtimetm_isdstaltzonetimezonerJ   )r$   isoStrtzutcOffset_minutess       r   ISO8601Formatrd      s	    KK+,,6n 72>)11#666fi Q;;tbb	 14>++4 1"l]R/		"m^b0	+b037H3I3IB3NPPbGmmc\
 b!f_s"RV++ hr!   __main__)1971z1971-11z
1971-11-02z1971-11-02T23z1971-11-02T23Zz1971-11-02T23:04z1971-11-02T23:04Zz1971-11-02T23:04:15z1971-11-02T23:04:15Zz1971-11-02T23:04:15.1z1971-11-02T23:04:15.01z1971-11-02T23:04:15.023456z1971-11-02T23:04:15.103456Zz1971-11-02T23:04:15.123456+11z1971-11-02T23:04:15.123456-11z 1971-11-02T23:04:15.123456+11:30z 1971-11-02T23:04:15.123456-11:30z 1971-11-02T23:04:15.123456+00:00z 1971-11-02T23:04:15.123456-00:00z1971-01-02T23:04:15+14z1971-01-02T23:04:15+14:00z1971-01-02T23:04:15-14z1971-01-02T23:04:15-14:00z 1971-01-02T23:04:15.123456891+11z1971-01-02T24z1971-01-02T24:00z1971-01-02T24:00:00z1971-01-02T24:00:00.0z1971-01-02T23:04:15.123430z1971-01-02T23:04:15.0zFailed to parse ({0})Fr(   z:ParseISO8601 -> ISO8601Format -> ParseISO8601 failed ({0})z&ParseISO8601("{0}".isoformat()) failedz->)1971111971110219711102T2319711102T23Z19711102T230419711102T2304Z19711102T23041519711102T230415Zz19711102T230415.123456z19711102T230415.123456Zz19711102T230415.123456+11z19711102T230415.123456-11z19711102T230415.123456+1130z19711102T230415.123456-1130z.ParseISO8601 ({0}) should fail, but it did not)$0000z+0001 09z1971-01-02Tz1971-01-02TZz1971-01-02T+10z1971-01-02T-10z1971-01-02T23:z1971-01-02T23:04:z1971-01-02T23:0dz1971-01-02T23:04:15.z1971-01-02+121971Zz1971-01-02T23:04:15.123456Z+11z1971-01-02T23:04:15.123456Z-11z1971-01-02T23:04:15.123456+:30z1971-01-02T23:04:15.123456+30:z(1971-01-02T23:04:15.01234567890123456789z1971-01-02T23:04:15+15z1971-01-02T23:04:15-15z1971-01-02T23:04:15+14:01z1971-01-02T23:04:15-14:01z197101-02T23:04:15.123456z19710102T23:04:15.123456z19710102T230415.123456+11:30z1971-01-02T230415.123456z1971-01-02T23:04:15.123456+1130z
1971-00-02z
1971-13-02z
1971-01-00z
1971-11-32z
1971-12-32z1971-01-02T24:01z1971-01-02T23:61z1971-01-02T23:60:61)
__future__r   
__author__sixr   r[   r   r   r   recompilerD   rF   r   r3   rS   rd   r-   testStrr$   printformat	isoformatdt1r)   dt2r1   r!   r   <module>r~      s   & % % % % % 
        0 0 0 0 0 0 0 0 0 0 				 ?
"*
 > D $1 !aA'(* *     V   :       I I IX  8 z*
 ?* ?*wV <  b	t	&--g66	7	7	7	  -##iL##c		jj
j++		KRRSZ[[	\	\	\	 L((c		7>>wGG	H	H	H	eGT2y))))
  w" <  b	t	?FFwOO	P	P	P	 
2
 6 6wf <  b	t	?FFwOO	P	P	P	 
c z6 6r!   