Python: Figure out local timezone

前端 未结 18 1618
野性不改
野性不改 2020-12-07 15:50

I want to compare UTC timestamps from a log file with local timestamps. When creating the local datetime object, I use something like:

>>&         


        
相关标签:
18条回答
  • 2020-12-07 16:11

    First get pytz and tzlocal modules

    pip install pytz tzlocal
    

    then

    from tzlocal import get_localzone
    local = get_localzone()
    

    then you can do things like

    from datetime import datetime
    print(datetime.now(local))
    
    0 讨论(0)
  • 2020-12-07 16:12

    I want to compare UTC timestamps from a log file with local timestamps

    If this is your intent, then I wouldn't worry about specifying specific tzinfo parameters or any additional external libraries. Since Python 3.5, the built in datetime module is all you need to create a UTC and a local timestamp automatically.

    import datetime
    f = "%a %b %d %H:%M:%S %Z %Y"         # Full format with timezone
    
    # tzinfo=None
    cdatetime = datetime.datetime(2010, 4, 27, 12, 0, 0, 0)  # 1. Your example from log
    cdatetime = datetime.datetime.now()   # 2. Basic date creation (default: local time)
    print(cdatetime.strftime(f))          # no timezone printed
    # Tue Apr 27 12:00:00  2010
    
    utctimestamp = cdatetime.astimezone(tz=datetime.timezone.utc)  # 1. convert to UTC
    utctimestamp = datetime.datetime.now(tz=datetime.timezone.utc) # 2. create in UTC
    print(utctimestamp.strftime(f))
    # Tue Apr 27 17:00:00 UTC 2010
    
    localtimestamp = cdatetime.astimezone()               # 1. convert to local [default]
    localtimestamp = datetime.datetime.now().astimezone()  # 2. create with local timezone
    print(localtimestamp.strftime(f))
    # Tue Apr 27 12:00:00 CDT 2010
    

    The '%Z' parameter of datetime.strftime() prints the timezone acronym into the timestamp for humans to read.

    0 讨论(0)
  • 2020-12-07 16:13

    First, note that the question presents an incorrect initialization of an aware datetime object:

    >>> local_time=datetime.datetime(2010, 4, 27, 12, 0, 0, 0,
    ...                                  tzinfo=pytz.timezone('Israel'))
    

    creates an invalid instance. One can see the problem by computing the UTC offset of the resulting object:

    >>> print(local_time.utcoffset())
    2:21:00
    

    (Note the result which is an odd fraction of an hour.)

    To initialize an aware datetime properly using pytz one should use the localize() method as follows:

    >>> local_time=pytz.timezone('Israel').localize(datetime.datetime(2010, 4, 27, 12))
    >>> print(local_time.utcoffset())
    3:00:00
    

    Now, if you require a local pytz timezone as the new tzinfo, you should use the tzlocal package as others have explained, but if all you need is an instance with a correct local time zone offset and abbreviation then tarting with Python 3.3, you can call the astimezone() method with no arguments to convert an aware datetime instance to your local timezone:

    >>> local_time.astimezone().strftime('%Y-%m-%d %H:%M %Z %z')
    '2010-04-27 05:00 EDT -0400'
    
    0 讨论(0)
  • 2020-12-07 16:16

    I have also been looking for a simple way to read the local host configuration and get timezone aware local_time based on it. As of python 3.6+ the simplest approach is use dateutil.tz which will read /etc/localtime and assist in getting timezone aware datetime object.

    Here is more info on it: https://dateutil.readthedocs.io/en/stable/tz.html

    The implementation to accomplish what you're looking for is as follows:

    from datetime import datetime
    from dateutil import tz
    local_time = datetime.now(tz.gettz())
    

    This will provide you the following local_time:

    2019-10-18 13:41:06.624536-05:00
    

    Additional Resources I used in researching this topic: Paul Ganssle Presentation about time zones: https://www.youtube.com/watch?v=l4UCKCo9FWY

    pytz: The Fastest Footgun in the West https://blog.ganssle.io/articles/2018/03/pytz-fastest-footgun.html

    0 讨论(0)
  • 2020-12-07 16:17

    The following appears to work for 3.7+, using standard libs:

    from datetime import timedelta
    from datetime import timezone
    import time
    
    def currenttz():
        if time.daylight:
            return timezone(timedelta(seconds=-time.altzone),time.tzname[1])
        else:
            return timezone(timedelta(seconds=-time.timezone),time.tzname[0])
    
    0 讨论(0)
  • 2020-12-07 16:20

    You may be happy with pendulum

    >>> pendulum.datetime(2015, 2, 5, tz='local').timezone.name
    'Israel'
    

    Pendulum has a well designed API for manipulating dates. Everything is TZ-aware.

    0 讨论(0)
提交回复
热议问题