Python: Figure out local timezone

前端 未结 18 1617
野性不改
野性不改 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 15:54

    Here's a way to get the local timezone using only the standard library, (only works in a *nix environment):

    >>> '/'.join(os.path.realpath('/etc/localtime').split('/')[-2:])
    'Australia/Sydney'
    

    You can use this to create a pytz timezone:

    >>> import pytz
    >>> my_tz_name = '/'.join(os.path.realpath('/etc/localtime').split('/')[-2:])
    >>> my_tz = pytz.timezone(my_tz_name)
    >>> my_tz
    <DstTzInfo 'Australia/Sydney' LMT+10:05:00 STD>
    

    ...which you can then apply to a datetime:

    >>> import datetime
    >>> now = datetime.datetime.now()
    >>> now
    datetime.datetime(2014, 9, 3, 9, 23, 24, 139059)
    
    >>> now.replace(tzinfo=my_tz)
    >>> now
    datetime.datetime(2014, 9, 3, 9, 23, 24, 139059, tzinfo=<DstTzInfo 'Australia/Sydney' LMT+10:05:00 STD>)
    
    0 讨论(0)
  • 2020-12-07 15:57

    In Python 3.x, local timezone can be figured out like this:

    import datetime
    LOCAL_TIMEZONE = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
    

    It's a tricky use of datetime's code .

    For python >= 3.6, you'll need

    import datetime
    LOCAL_TIMEZONE = datetime.datetime.now(datetime.timezone(datetime.timedelta(0))).astimezone().tzinfo
    
    0 讨论(0)
  • 2020-12-07 15:58

    Based on J. F. Sebastian's answer, you can do this with the standard library:

    import time, datetime
    local_timezone = datetime.timezone(datetime.timedelta(seconds=-time.timezone))
    

    Tested in 3.4, should work on 3.4+

    0 讨论(0)
  • 2020-12-07 15:58

    Here's a slightly more concise version of @vbem's solution:

    from datetime import datetime as dt
    
    dt.utcnow().astimezone().tzinfo
    

    The only substantive difference is that I replaced datetime.datetime.now(datetime.timezone.utc) with datetime.datetime.utcnow(). For brevity, I also aliased datetime.datetime as dt.

    For my purposes, I want the UTC offset in seconds. Here's what that looks like:

    dt.utcnow().astimezone().utcoffset().total_seconds()
    
    0 讨论(0)
  • 2020-12-07 15:58
    now_dt = datetime.datetime.now()
    utc_now = datetime.datetime.utcnow()
    now_ts, utc_ts = map(time.mktime, map(datetime.datetime.timetuple, (now_dt, utc_now)))
    offset = int((now_ts - utc_ts) / 3600)
    

    hope this will help you.

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

    I was asking the same to myself, and I found the answer in 1:

    Take a look at section 8.1.7: the format "%z" (lowercase, the Z uppercase returns also the time zone, but not in the 4-digit format, but in the form of timezone abbreviations, like in [3]) of strftime returns the form "+/- 4DIGIT" that is standard in email headers (see section 3.3 of RFC 2822, see [2], which obsoletes the other ways of specifying the timezone for email headers).

    So, if you want your timezone in this format, use:

    time.strftime("%z")
    

    [1] http://docs.python.org/2/library/datetime.html

    [2] http://tools.ietf.org/html/rfc2822#section-3.3

    [3] Timezone abbreviations: http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations , only for reference.

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