1
1
# datetime.py
2
2
3
- import time as _tmod
4
-
5
- _DBM = (0 , 0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 )
6
- _DIM = (0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 )
7
- _TIME_SPEC = ("auto" , "hours" , "minutes" , "seconds" , "milliseconds" , "microseconds" )
3
+ import time as _t
8
4
9
5
10
6
def _leap (y ):
11
7
return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0 )
12
8
13
9
14
- def _dby (y ):
15
- # year -> number of days before January 1st of year.
16
- Y = y - 1
17
- return Y * 365 + Y // 4 - Y // 100 + Y // 400
18
-
19
-
20
10
def _dim (y , m ):
21
11
# year, month -> number of days in that month in that year.
22
12
if m == 2 and _leap (y ):
23
13
return 29
24
- return _DIM [m ]
14
+ return ( 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ) [m ]
25
15
26
16
27
17
def _dbm (y , m ):
28
18
# year, month -> number of days in year preceding first day of month.
29
- return _DBM [m ] + (m > 2 and _leap (y ))
30
-
31
-
32
- def _ymd2o (y , m , d ):
33
- # y, month, day -> ordinal, considering 01-Jan-0001 as day 1.
34
- return _dby (y ) + _dbm (y , m ) + d
19
+ return (0 , 0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 )[m ] + (m > 2 and _leap (y ))
35
20
36
21
37
22
def _o2ymd (n ):
@@ -73,7 +58,7 @@ def total_seconds(self):
73
58
74
59
@property
75
60
def days (self ):
76
- return self ._tuple (2 )[ 0 ]
61
+ return self ._tuple (1 )
77
62
78
63
@property
79
64
def seconds (self ):
@@ -145,17 +130,17 @@ def __bool__(self):
145
130
return self ._us != 0
146
131
147
132
def __str__ (self ):
148
- return self ._format (0x40 )
133
+ return self ._fmt (0x40 )
149
134
150
135
def __hash__ (self ):
151
136
if not hasattr (self , "_hash" ):
152
137
self ._hash = hash (self ._us )
153
138
return self ._hash
154
139
155
140
def isoformat (self ):
156
- return self ._format (0 )
141
+ return self ._fmt (0 )
157
142
158
- def _format (self , spec = 0 ):
143
+ def _fmt (self , spec = 0 ):
159
144
if self ._us >= 0 :
160
145
td = self
161
146
g = ""
@@ -201,8 +186,8 @@ def tuple(self):
201
186
202
187
def _tuple (self , n ):
203
188
d , us = divmod (self ._us , 86_400_000_000 )
204
- if n == 2 :
205
- return d , us
189
+ if n == 1 :
190
+ return d
206
191
s , us = divmod (us , 1_000_000 )
207
192
if n == 3 :
208
193
return d , s , us
@@ -241,7 +226,7 @@ def fromutc(self, dt):
241
226
return dt + dtdst
242
227
243
228
def isoformat (self , dt ):
244
- return self .utcoffset (dt )._format (0x12 )
229
+ return self .utcoffset (dt )._fmt (0x12 )
245
230
246
231
247
232
class timezone (tzinfo ):
@@ -276,7 +261,7 @@ def dst(self, dt):
276
261
def tzname (self , dt ):
277
262
if self ._name :
278
263
return self ._name
279
- return self ._offset ._format (0x22 )
264
+ return self ._offset ._fmt (0x22 )
280
265
281
266
def fromutc (self , dt ):
282
267
return dt + self ._offset
@@ -287,7 +272,11 @@ def fromutc(self, dt):
287
272
288
273
def _date (y , m , d ):
289
274
if MINYEAR <= y <= MAXYEAR and 1 <= m <= 12 and 1 <= d <= _dim (y , m ):
290
- return _ymd2o (y , m , d )
275
+ # year -> number of days before January 1st of year.
276
+ Y = y - 1
277
+ _dby = Y * 365 + Y // 4 - Y // 100 + Y // 400
278
+ # y, month, day -> ordinal, considering 01-Jan-0001 as day 1.
279
+ return _dby + _dbm (y , m ) + d
291
280
elif y == 0 and m == 0 and 1 <= d <= 3_652_059 :
292
281
return d
293
282
else :
@@ -310,11 +299,11 @@ def __init__(self, year, month, day):
310
299
311
300
@classmethod
312
301
def fromtimestamp (cls , ts ):
313
- return cls (* _tmod .localtime (ts )[:3 ])
302
+ return cls (* _t .localtime (ts )[:3 ])
314
303
315
304
@classmethod
316
305
def today (cls ):
317
- return cls (* _tmod .localtime ()[:3 ])
306
+ return cls (* _t .localtime ()[:3 ])
318
307
319
308
@classmethod
320
309
def fromordinal (cls , n ):
@@ -490,7 +479,7 @@ def _iso2t(s):
490
479
491
480
492
481
def _t2iso (td , timespec , dt , tz ):
493
- s = td ._format ( _TIME_SPEC .index (timespec ))
482
+ s = td ._fmt (( "auto" , "hours" , "minutes" , "seconds" , "milliseconds" , "microseconds" ) .index (timespec ))
494
483
if tz is not None :
495
484
s += tz .isoformat (dt )
496
485
return s
@@ -633,18 +622,18 @@ def fromtimestamp(cls, ts, tz=None):
633
622
else :
634
623
us = 0
635
624
if tz is None :
636
- dt = cls (* _tmod .localtime (ts )[:6 ], microsecond = us , tzinfo = tz )
637
- s = (dt - datetime (* _tmod .localtime (ts - 86400 )[:6 ]))._us // 1_000_000 - 86400
638
- if s < 0 and dt == datetime (* _tmod .localtime (ts + s )[:6 ]):
625
+ dt = cls (* _t .localtime (ts )[:6 ], microsecond = us , tzinfo = tz )
626
+ s = (dt - datetime (* _t .localtime (ts - 86400 )[:6 ]))._us // 1_000_000 - 86400
627
+ if s < 0 and dt == datetime (* _t .localtime (ts + s )[:6 ]):
639
628
dt ._fd = 1
640
629
else :
641
- dt = cls (* _tmod .gmtime (ts )[:6 ], microsecond = us , tzinfo = tz )
630
+ dt = cls (* _t .gmtime (ts )[:6 ], microsecond = us , tzinfo = tz )
642
631
dt = tz .fromutc (dt )
643
632
return dt
644
633
645
634
@classmethod
646
635
def now (cls , tz = None ):
647
- return cls .fromtimestamp (_tmod .time (), tz )
636
+ return cls .fromtimestamp (_t .time (), tz )
648
637
649
638
@classmethod
650
639
def fromordinal (cls , n ):
@@ -814,7 +803,7 @@ def astimezone(self, tz=None):
814
803
_tz = self ._tz
815
804
if _tz is None :
816
805
ts = int (self ._mktime ())
817
- os = datetime (* _tmod .localtime (ts )[:6 ]) - datetime (* _tmod .gmtime (ts )[:6 ])
806
+ os = datetime (* _t .localtime (ts )[:6 ]) - datetime (* _t .gmtime (ts )[:6 ])
818
807
else :
819
808
os = _tz .utcoffset (self )
820
809
utc = self - os
@@ -823,7 +812,7 @@ def astimezone(self, tz=None):
823
812
824
813
def _mktime (self ):
825
814
def local (u ):
826
- return (datetime (* _tmod .localtime (u )[:6 ]) - epoch )._us // 1_000_000
815
+ return (datetime (* _t .localtime (u )[:6 ]) - epoch )._us // 1_000_000
827
816
828
817
epoch = datetime .EPOCH .replace (tzinfo = None )
829
818
t , us = divmod ((self - epoch )._us , 1_000_000 )
@@ -863,10 +852,10 @@ def tzname(self):
863
852
864
853
def timetuple (self ):
865
854
if self ._tz is None :
866
- conv = _tmod .gmtime
855
+ conv = _t .gmtime
867
856
epoch = datetime .EPOCH .replace (tzinfo = None )
868
857
else :
869
- conv = _tmod .localtime
858
+ conv = _t .localtime
870
859
epoch = datetime .EPOCH
871
860
return conv (round ((self - epoch ).total_seconds ()))
872
861
@@ -909,4 +898,4 @@ def tuple(self):
909
898
return d + t + (self ._tz , self ._fd )
910
899
911
900
912
- datetime .EPOCH = datetime (* _tmod .gmtime (0 )[:6 ], tzinfo = timezone .utc )
901
+ datetime .EPOCH = datetime (* _t .gmtime (0 )[:6 ], tzinfo = timezone .utc )
0 commit comments