Get time zone information of the system in Python?

前端 未结 8 1089
情歌与酒
情歌与酒 2020-12-02 11:40

I want to get the default timezone (PST) of my system from Python. What\'s the best way to do that? I\'d like to avoid forking another process.

相关标签:
8条回答
  • 2020-12-02 12:25

    This should work:

    import time
    time.tzname
    

    time.tzname returns a tuple of two strings: The first is the name of the local non-DST timezone, the second is the name of the local DST timezone.

    Example return: ('MST', 'MDT')

    0 讨论(0)
  • 2020-12-02 12:25

    I found this to work well:

    import datetime
    tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()
    

    For me this was able to differentiate between daylight savings and not.

    Reference with more detail: https://stackoverflow.com/a/39079819/4549682

    0 讨论(0)
  • 2020-12-02 12:34

    The code snippets for calculating offset are incorrect, see http://bugs.python.org/issue7229.

    The correct way to handle this is:

    def local_time_offset(t=None):
        """Return offset of local zone from GMT, either at present or at time t."""
        # python2.3 localtime() can't take None
        if t is None:
            t = time.time()
    
        if time.localtime(t).tm_isdst and time.daylight:
            return -time.altzone
        else:
            return -time.timezone
    

    This is in all likelihood, not the exact question that the OP asked, but there are two incorrect snippets on the page and time bugs suck to track down and fix.

    0 讨论(0)
  • 2020-12-02 12:35

    Check out the Python Time Module.

    from time import gmtime, strftime
    print(strftime("%z", gmtime()))
    

    Pacific Standard Time

    0 讨论(0)
  • 2020-12-02 12:37

    Getting offset from UTC as timedelta:

    from datetime import datetime, timezone
    
    now = datetime.now()
    now.replace(tzinfo=timezone.utc) - now.astimezone(timezone.utc)
    

    Or like this (more obscure but also works):

    datetime.now(timezone.utc).astimezone().tzinfo.utcoffset(None)
    

    Both solutions give the same result. For example: datetime.timedelta(seconds=7200)

    0 讨论(0)
  • 2020-12-02 12:37

    For Python 3.6+ this can be easily achieved by following code:

    import datetime
    local_timezone = datetime.datetime.utcnow().astimezone().tzinfo
    
    print(local_timezone)
    

    But with Python < 3.6 calling astimezone() on naive datetime doesn't work. So we've to do it in a slightly different way.

    So for Python 3.x,

    import datetime
    local_timezone = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
    
    print(local_timezone)
    

    Sample Output:
    On Netherlands Server(Python 3.6.9): CEST
    On Bangladesh Server(Python 3.8.2): +06

    More details can be found on this thread.

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