【问题标题】:Python: print the time zone from strftimePython:从 strftime 打印时区
【发布时间】:2015-09-26 18:31:06
【问题描述】:

我想打印时区。我使用了%Z,但它不打印:

import datetime
now = datetime.datetime.now()
print now.strftime("%d-%m-%Y")
print now.strftime("%d-%b-%Y")
print now.strftime("%a,%d-%b-%Y %I:%M:%S %Z") # %Z doesn't work

我是否需要导入pytz

【问题讨论】:

  • 这正是您的代码吗?一旦我删除了“现在”的阴影,它就对我有用。
  • ....嗯,你需要一个时区感知的日期时间,而 pytz 可以解决这个问题,所以我会选择“是”

标签: python date time


【解决方案1】:

对我来说最简单的:

$ python3
>>> import datetime
>>> datetime.datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S %z")
>>> datetime.datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S %Z")
>>> exit()

【讨论】:

  • 这应该是问题的正确答案。
【解决方案2】:

不应使用 pytz。来自帮助:

姓名
pytz.reference

描述
参考 Python 文档中的 tzinfo 实现。
用于测试,因为它们仅在几年内正确
1987 到 2006。不要将这些用于实际代码。

【讨论】:

    【解决方案3】:

    now() 返回一个 datetime.datetime 类的对象,它本身并不包含有关其时区的信息。 (即它是“naive”;参见“naive”与“aware”日期和时间对象的描述in the documentation

    根据documentation

    datetime.datetime.现在tz=None

    返回当前的本地日期和时间。

    ...

    如果可选参数tzNone或未指定,则时间戳转换为平台的本地日期和时间,返回的日期时间对象为naive。

    要获取您平台的本地时区,您应该按照您的建议使用pytzHere's Alex Martelli's code to do this:

    >>> import datetime
    >>> now = datetime.datetime.now()
    >>>
    >>> from pytz import reference
    >>> localtime = reference.LocalTimezone()
    >>> localtime.tzname(now)
    'Mountain Daylight Time'
    

    您还可以通过以下方式获取实际的UTC 偏移量(以小时为单位):

    >>> import time
    >>> print(-time.timezone / 3600) # convert from seconds to hours
    -7.0
    

    所以你可以使用:

    >>> print(now.strftime("%a, %d-%b-%Y %I:%M:%S, " + localtime.tzname(now)))
    Wed, 08-Jul-2015 01:27:49, Mountain Daylight Time
    

    【讨论】:

    • 那是因为在我的代码 sn-p 中,now 没有定义。我假设您将首先运行问题中的代码以首先定义now。我会将我的答案修改为独立的,谢谢。
    【解决方案4】:

    这是一个记录在案的行为:datetime.now() 返回一个幼稚的日期时间对象和%Z returns an empty string in such cases。您需要一个可感知的日期时间对象。

    要打印本地时区缩写,您可以使用tzlocal module,它可以将本地时区作为pytz tzinfo 对象返回,该对象可能包含历史时区信息,例如来自the tz database

    #!/usr/bin/env python
    from datetime import datetime
    import tzlocal # $ pip install tzlocal
    
    now = datetime.now(tzlocal.get_localzone())
    print(now.strftime('%Z'))
    # -> MSK
    print(now.tzname())
    # -> MSK
    

    此代码适用于有/没有夏令时的时区。它在 DST 转换期间和期间工作。如果本地时区过去有不同的 utc 偏移量,即使 python 使用的 C 库无法访问给定平台上的历史时区数据库,它也可以工作。


    在 Python 3.3+ 中,当平台支持时,您可以使用.tm_zone attribute 来获取 tzname:

    >>> import time
    >>> time.localtime().tm_zone
    'MSK'
    

    或者使用datetime模块:

    >>> from datetime import datetime, timezone
    >>> datetime.now(timezone.utc).astimezone().tzname()
    'MSK'
    

    代码是可移植的,但在某些平台上结果可能不正确(没有.tm_zone(在这种情况下datetime 必须使用time.tzname)和"interesting" timezones)。

    在较旧的 Python 版本中,在具有“无趣”时区的系统上,您可以使用 time.tzname

    >>> import time
    >>> is_dst = time.daylight and time.localtime().tm_isdst > 0
    >>> time.tzname[is_dst]
    'MSK'
    

    “有趣”时区的一个例子是 2010-2015 年期间的欧洲/莫斯科时区。

    Getting computer's UTC offset in Python 讨论了类似的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-26
      • 2015-04-30
      • 1970-01-01
      • 2011-01-06
      • 2014-11-16
      • 1970-01-01
      • 2012-09-25
      相关资源
      最近更新 更多