@@ -525,6 +525,12 @@ cdef class _TSObject:
525
525
def __get__ (self ):
526
526
return self .value
527
527
528
+ cpdef _get_utcoffset(tzinfo):
529
+ try :
530
+ return tzinfo._utcoffset
531
+ except AttributeError :
532
+ return tzinfo.utcoffset(None )
533
+
528
534
# helper to extract datetime and int64 from several different possibilities
529
535
cpdef convert_to_tsobject(object ts, object tz = None ):
530
536
"""
@@ -565,7 +571,7 @@ cpdef convert_to_tsobject(object ts, object tz=None):
565
571
elif tz is not pytz.utc:
566
572
ts = tz.localize(ts)
567
573
obj.value = _pydatetime_to_dts(ts, & obj.dts)
568
- obj.value -= _delta_to_nanoseconds(ts.tzinfo._utcoffset )
574
+ obj.value -= _delta_to_nanoseconds(_get_utcoffset( ts.tzinfo) )
569
575
obj.tzinfo = ts.tzinfo
570
576
else :
571
577
# UTC
@@ -575,7 +581,7 @@ cpdef convert_to_tsobject(object ts, object tz=None):
575
581
obj.value = _pydatetime_to_dts(ts, & obj.dts)
576
582
obj.tzinfo = ts.tzinfo
577
583
if obj.tzinfo is not None and not _is_utc(obj.tzinfo):
578
- obj.value -= _delta_to_nanoseconds(obj.tzinfo._utcoffset )
584
+ obj.value -= _delta_to_nanoseconds(_get_utcoffset( obj.tzinfo) )
579
585
_check_dts_bounds(obj.value, & obj.dts)
580
586
return obj
581
587
elif PyDate_Check(ts):
@@ -616,7 +622,10 @@ cdef inline object _get_zone(object tz):
616
622
if _is_utc(tz):
617
623
return ' UTC'
618
624
else :
619
- return tz.zone
625
+ try :
626
+ return tz.zone
627
+ except AttributeError :
628
+ return tz
620
629
621
630
cdef int64_t _NS_LOWER_BOUND = - 9223285636854775809L L
622
631
cdef int64_t _NS_UPPER_BOUND = - 9223372036854775807L L
@@ -1009,7 +1018,7 @@ def _get_deltas(tz):
1009
1018
utc_offset_cache[tz] = _unbox_utcoffsets(tz._transition_info)
1010
1019
else :
1011
1020
# static tzinfo
1012
- num = int (total_seconds(tz._utcoffset )) * 1000000000
1021
+ num = int (total_seconds(_get_utcoffset(tz) )) * 1000000000
1013
1022
utc_offset_cache[tz] = np.array([num], dtype = np.int64)
1014
1023
return utc_offset_cache[tz]
1015
1024
0 commit comments