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,9 @@ 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 (
483
+ ("auto" , "hours" , "minutes" , "seconds" , "milliseconds" , "microseconds" ).index (timespec )
484
+ )
494
485
if tz is not None :
495
486
s += tz .isoformat (dt )
496
487
return s
@@ -633,18 +624,18 @@ def fromtimestamp(cls, ts, tz=None):
633
624
else :
634
625
us = 0
635
626
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 ]):
627
+ dt = cls (* _t .localtime (ts )[:6 ], microsecond = us , tzinfo = tz )
628
+ s = (dt - datetime (* _t .localtime (ts - 86400 )[:6 ]))._us // 1_000_000 - 86400
629
+ if s < 0 and dt == datetime (* _t .localtime (ts + s )[:6 ]):
639
630
dt ._fd = 1
640
631
else :
641
- dt = cls (* _tmod .gmtime (ts )[:6 ], microsecond = us , tzinfo = tz )
632
+ dt = cls (* _t .gmtime (ts )[:6 ], microsecond = us , tzinfo = tz )
642
633
dt = tz .fromutc (dt )
643
634
return dt
644
635
645
636
@classmethod
646
637
def now (cls , tz = None ):
647
- return cls .fromtimestamp (_tmod .time (), tz )
638
+ return cls .fromtimestamp (_t .time (), tz )
648
639
649
640
@classmethod
650
641
def fromordinal (cls , n ):
@@ -814,7 +805,7 @@ def astimezone(self, tz=None):
814
805
_tz = self ._tz
815
806
if _tz is None :
816
807
ts = int (self ._mktime ())
817
- os = datetime (* _tmod .localtime (ts )[:6 ]) - datetime (* _tmod .gmtime (ts )[:6 ])
808
+ os = datetime (* _t .localtime (ts )[:6 ]) - datetime (* _t .gmtime (ts )[:6 ])
818
809
else :
819
810
os = _tz .utcoffset (self )
820
811
utc = self - os
@@ -823,7 +814,7 @@ def astimezone(self, tz=None):
823
814
824
815
def _mktime (self ):
825
816
def local (u ):
826
- return (datetime (* _tmod .localtime (u )[:6 ]) - epoch )._us // 1_000_000
817
+ return (datetime (* _t .localtime (u )[:6 ]) - epoch )._us // 1_000_000
827
818
828
819
epoch = datetime .EPOCH .replace (tzinfo = None )
829
820
t , us = divmod ((self - epoch )._us , 1_000_000 )
@@ -863,10 +854,10 @@ def tzname(self):
863
854
864
855
def timetuple (self ):
865
856
if self ._tz is None :
866
- conv = _tmod .gmtime
857
+ conv = _t .gmtime
867
858
epoch = datetime .EPOCH .replace (tzinfo = None )
868
859
else :
869
- conv = _tmod .localtime
860
+ conv = _t .localtime
870
861
epoch = datetime .EPOCH
871
862
return conv (round ((self - epoch ).total_seconds ()))
872
863
@@ -909,4 +900,4 @@ def tuple(self):
909
900
return d + t + (self ._tz , self ._fd )
910
901
911
902
912
- datetime .EPOCH = datetime (* _tmod .gmtime (0 )[:6 ], tzinfo = timezone .utc )
903
+ datetime .EPOCH = datetime (* _t .gmtime (0 )[:6 ], tzinfo = timezone .utc )
0 commit comments