如何在本地时区打印Python日期时间?

mik*_*ike 23 python timezone

假设我有一个变量t设置为:

datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)

如果我说str(t),我得到:

'2009-07-10 18:44:59.193982+00:00'
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得类似的字符串,除了以本地时区而不是UTC打印?

hta*_*ess 40

此脚本演示了几种使用以下方法显示本地时区的方法astimezone()

#!/usr/bin/env python3

import pytz
from datetime import datetime, timezone
from tzlocal import get_localzone

utc_dt = datetime.now(timezone.utc)

PST = pytz.timezone('US/Pacific')
EST = pytz.timezone('US/Eastern')
JST = pytz.timezone('Asia/Tokyo')
NZST = pytz.timezone('Pacific/Auckland')

print("Pacific time {}".format(utc_dt.astimezone(PST).isoformat()))
print("Eastern time {}".format(utc_dt.astimezone(EST).isoformat()))
print("UTC time     {}".format(utc_dt.isoformat()))
print("Japan time   {}".format(utc_dt.astimezone(JST).isoformat()))

# Use astimezone() without an argument
print("Local time   {}".format(utc_dt.astimezone().isoformat()))

# Use tzlocal get_localzone
print("Local time   {}".format(utc_dt.astimezone(get_localzone()).isoformat()))

# Explicitly create a pytz timezone object
# Substitute a pytz.timezone object for your timezone
print("Local time   {}".format(utc_dt.astimezone(NZST).isoformat()))
Run Code Online (Sandbox Code Playgroud)

它输出以下内容:

$ ./timezones.py 
Pacific time 2019-02-22T17:54:14.957299-08:00
Eastern time 2019-02-22T20:54:14.957299-05:00
UTC time     2019-02-23T01:54:14.957299+00:00
Japan time   2019-02-23T10:54:14.957299+09:00
Local time   2019-02-23T14:54:14.957299+13:00
Local time   2019-02-23T14:54:14.957299+13:00
Local time   2019-02-23T14:54:14.957299+13:00
Run Code Online (Sandbox Code Playgroud)

从 python 3.6 开始,astimezone()没有时区对象的调用默认为本地区域 ( docs )。这意味着您不需要导入tzlocal,只需执行以下操作:

#!/usr/bin/env python3

from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc)

print("Local time {}".format(utc_dt.astimezone().isoformat()))
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下,python 3.6支持不带tz的astimezone()代表系统本地时间的功能([参考](https://docs.python.org/3.6/library/datetime.html#datetime.datetime.astimezone) )。 (4认同)

Mik*_*nov 24

认为你应该环顾四周:datetime.astimezone()

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

另请参阅pytz模块 - 它非常易于使用 - 例如:

eastern = timezone('US/Eastern')
Run Code Online (Sandbox Code Playgroud)

http://pytz.sourceforge.net/

例:

from datetime import datetime
import pytz
from tzlocal import get_localzone # $ pip install tzlocal

utc_dt = datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=pytz.utc)
print(utc_dt.astimezone(get_localzone())) # print local time
# -> 2009-07-10 14:44:59.193982-04:00
Run Code Online (Sandbox Code Playgroud)

  • 那么我如何获得当前的本地时区? (15认同)
  • 这个答案是对的.我住在英格兰,美国/东部不是**本地**时区. (14认同)
  • @Philluminati:[`tzlocal.get_localzone()`](https://pypi.python.org/pypi/tzlocal)为您提供当地时区. (2认同)

Hug*_*ghE 10

我认为最好的方法是使用文档中LocalTimezone定义的类datetime.tzinfo(转到http://docs.python.org/library/datetime.html#tzinfo-objects并向下滚动到"示例tzinfo类"部分) :

假设Local是一个实例LocalTimezone

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc)
local_t = t.astimezone(Local)
Run Code Online (Sandbox Code Playgroud)

然后str(local_t)给出:

'2009-07-11 04:44:59.193982+10:00'
Run Code Online (Sandbox Code Playgroud)

这就是你想要的.

(注意:这可能看起来很奇怪,因为我在澳大利亚新南威尔士州, UTC 10或11小时)