Search code examples
pythonpython-3.xdatetimeinheritance

Datetime "fromtimestamp()" ignores inheritance if timezone is not None


I created a class inheriting from datetime.datetime.

While creating a new instance using the classmethod fromtimestamp it seems to work, except if I provide a timezone object. In such case, the returned object is of base type datetime.

import time
from datetime import datetime, timezone

class MyDatetime(datetime):
    pass

MyDatetime.fromtimestamp(time.time())
# MyDatetime(2018, 11, 30, 18, 8, 36, 418105)
# <class '__main__.MyDatetime'>

MyDatetime.fromtimestamp(time.time(), tz=timezone.utc)
# datetime.datetime(2018, 11, 30, 17, 8, 50, 667385, tzinfo=datetime.timezone.utc)
# <class 'datetime.datetime'>

This seems surprising. I don't see any mention of such weird behavior in the documentation, am I missing something or is it a Python bug?


Solution

  • Now it works correctly as expected.

    Added an alternative option ZoneInfo

    import time
    from datetime import datetime, timezone
    from zoneinfo import ZoneInfo
    
    class MyDatetime(datetime):
        pass
    
    print('My local time (GMT+5)')
    print(type(MyDatetime.fromtimestamp(time.time())))
    print(MyDatetime.fromtimestamp(time.time()))
    print()
    
    print('Time UTC using timezone')
    print(type(MyDatetime.fromtimestamp(time.time(), tz=timezone.utc)))
    print(MyDatetime.fromtimestamp(time.time(), tz=timezone.utc))
    print()
    
    print('Time UTC using ZoneInfo')
    print(type(MyDatetime.fromtimestamp(time.time(), ZoneInfo('UTC'))))
    print(MyDatetime.fromtimestamp(time.time(), ZoneInfo('UTC')))
    

    Result:

    My local time (GMT+5)
    <class '__main__.MyDatetime'>
    2024-09-22 22:29:03.734214
    
    Time UTC using timezone
    <class '__main__.MyDatetime'>
    2024-09-22 17:29:03.734259+00:00
    
    Time UTC using ZoneInfo
    <class '__main__.MyDatetime'>
    2024-09-22 17:29:03.734683+00:00