@@ -189,6 +189,7 @@ def _get_rc_timezone():
189
189
MIN_PER_HOUR = 60.
190
190
SEC_PER_MIN = 60.
191
191
MONTHS_PER_YEAR = 12.
192
+ DAYS_PER_400Y = 146097
192
193
193
194
DAYS_PER_WEEK = 7.
194
195
DAYS_PER_MONTH = 30.
@@ -206,6 +207,41 @@ def _get_rc_timezone():
206
207
MO , TU , WE , TH , FR , SA , SU )
207
208
WEEKDAYS = (MONDAY , TUESDAY , WEDNESDAY , THURSDAY , FRIDAY , SATURDAY , SUNDAY )
208
209
210
+ class _datetimey (datetime .datetime ):
211
+
212
+ def __new__ (cls , year , * args , ** kwargs ):
213
+ if year < 1 or year > 9999 :
214
+ yearoffset = int (np .floor (year / 400 ) * 400 ) - 2000
215
+ year = year - yearoffset
216
+ else :
217
+ yearoffset = 0
218
+ new = super ().__new__ (cls , year , * args , ** kwargs )
219
+ new ._yearoffset = yearoffset
220
+ return new
221
+
222
+ def strftime (self , fmt ):
223
+ year0 = self .year + self ._yearoffset
224
+ if year0 < 0 :
225
+ fmt = fmt .replace ('%Y' , f'{ year0 :05d} ' )
226
+ else :
227
+ fmt = fmt .replace ('%Y' , f'{ year0 :04d} ' )
228
+ return super ().strftime (fmt )
229
+
230
+ def __str__ (self ):
231
+ return self .strftime ('%Y-%m-%dT%H:%M:%S.%f%z' )
232
+
233
+ @staticmethod
234
+ def _datetime_to_datetimey (new , year_offset ):
235
+ return _datetimey (new .year + year_offset , new .month , new .day ,
236
+ new .hour , new .minute , new .second , new .microsecond ,
237
+ new .tzinfo )
238
+
239
+ def astimezone (self , tz = None ):
240
+ print ('self' , self )
241
+ new = super (_datetimey , self ).astimezone (tz )
242
+ new = self ._datetime_to_datetimey (new , self ._yearoffset )
243
+ return new
244
+
209
245
210
246
def _to_ordinalf (dt ):
211
247
"""
0 commit comments