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

Python 如何在本地时区打印日期时间?,python,timezone,Python,Timezone,假设我有一个变量t设置为: datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>) 除了打印在本地时区而不是UTC之外,我怎样才能得到类似的字符串呢?我想你应该四处看看:datetime.astimezone() 另请参见pytz模块——它非常易于使用——例如: eastern = timezone('US/Eastern') 例如: from datetime import datetime impo

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

datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)

除了打印在本地时区而不是UTC之外,我怎样才能得到类似的字符串呢?

我想你应该四处看看:datetime.astimezone()

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

eastern = timezone('US/Eastern')

例如:

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

前几天我写了这样的东西:

import time, datetime
def nowString():
    # we want something like '2007-10-18 14:00+0100'
    mytz="%+4.4d" % (time.timezone / -(60*60) * 100) # time.timezone counts westwards!
    dt  = datetime.datetime.now()
    dts = dt.strftime('%Y-%m-%d %H:%M')  # %Z (timezone) would be empty
    nowstring="%s%s" % (dts,mytz)
    return nowstring
因此,您感兴趣的部分可能是以“mytz=…”开头的行。time.timezone返回本地时区,尽管与UTC的符号相反。所以它说“-3600”表示UTC+1


尽管它对夏令时(DST,见注释)一无所知,我还是把它留给那些摆弄
Time.timezone

的人。我相信最好的方法是使用
datetime.tzinfo
文档中定义的
LocalTimezone
类(转到并向下滚动到“示例tzinfo类”部分):

假设
Local
LocalTimezone

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc)
local_t = t.astimezone(Local)
然后
str(本地)
给出:

'2009-07-11 04:44:59.193982+10:00'
这就是你想要的


(注意:您可能觉得这很奇怪,因为我在澳大利亚新南威尔士,比UTC早10或11个小时)

我使用此功能
datetime\u to\u local\u timezone()
,这似乎过于复杂,但我发现没有更简单的函数版本可以将
日期时间
实例转换为本地时区,如操作系统中配置的那样,并使用当时生效的UTC偏移:

此示例打印四个日期。对于两个时间点,一个在2009年1月,一个在2009年7月,它分别在UTC和本地时区打印一次时间戳。在这里,冬季使用CET(UTC+01:00),夏季使用CEST(UTC+02:00),它打印以下内容:

2009-07-10 18:44:59.193982+00:00
2009-07-10 20:44:59.193982+02:00

2009-01-10 18:44:59.193982+00:00
2009-01-10 19:44:59.193982+01:00
$ ./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
#!/usr/bin/env python3

from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc)

print("Local time {}".format(utc_dt.astimezone().isoformat()))

从python 3.2开始,仅使用标准库函数:

u_tm = datetime.datetime.utcfromtimestamp(0)
l_tm = datetime.datetime.fromtimestamp(0)
l_tz = datetime.timezone(l_tm - u_tm)

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=l_tz)
str(t)
'2009-07-10 18:44:59.193982-07:00'
只需使用
l_tm-u_tm
u_tm-l_tm
,这取决于您是否希望显示为UTC的+小时或-小时。我在MST,这就是-07的来源。更智能的代码应该能够找出减法的方式


并且只需要计算一次本地时区。这不会改变。至少在您从/切换到夏时制之前。

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

它的输出如下:

2009-07-10 18:44:59.193982+00:00
2009-07-10 20:44:59.193982+02:00

2009-01-10 18:44:59.193982+00:00
2009-01-10 19:44:59.193982+01:00
$ ./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
#!/usr/bin/env python3

from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc)

print("Local time {}".format(utc_dt.astimezone().isoformat()))
从python 3.6开始,在没有时区对象的情况下调用
astimezone()
默认为本地区()。这意味着您不需要导入
tzlocal
,只需执行以下操作:

2009-07-10 18:44:59.193982+00:00
2009-07-10 20:44:59.193982+02:00

2009-01-10 18:44:59.193982+00:00
2009-01-10 19:44:59.193982+01:00
$ ./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
#!/usr/bin/env python3

from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc)

print("Local time {}".format(utc_dt.astimezone().isoformat()))

那么如何获取当前的本地时区呢?不是datetime.datetime(2009,7,10,18,44,59193982)-你需要什么?这个答案是错误的。我住在英国,美国/东部不是本地时区。@Muhail-不,因为生成的对象不知道日期时间。你不知道你在哪个时区。@Phillumati:给你本地时区。如果你已经根据datetime文档定义了本地,这同样有效:
str(datetime.datetime.now)(tz=Local))
请注意,这将打印当前生效的UTC偏移量的任何使用,该偏移量可能与
日期时间
实例给定的时间(由于DST)的生效时间不同如果基本的
时间
实现不使用历史时区数据库(Windows明显属于此类),则
LocalTimezone
可能会在过去的日期失败。我认为astimezone的参数应该为空:
t.astimezone()
-1.如果您在使用DST的时区中,这将在一半时间内返回错误的结果。
time.timezone
包含DST未生效时使用的UTC偏移量,无论其当前是否生效。相关:Python>=3.6:使用
astimezone()
,例如
datetime.datetime(2010,4,27,12,0,0).astimezone().isoformat()
->
'2010-04-27T12:00:00+02:00'
它看起来像Python 3.3+代码(
.timestamp()
方法)。在这种情况下,您可以使用更简单的代码:。还可以使用
时区.utc
而不是
时区(datetime.timedelta())
。这是最好的答案!顺便说一句,python 3.6支持
astimezone()
不带tz表示系统本地时间()的功能。@code未解决感谢您澄清
astimezone()的行为
在没有tz对象的情况下调用。这不考虑DST。在基本设置中,它使用UTC和本地之间的增量作为历元日期。其他任何内容都不能是“自动”的。在显示最终时间时,如果当前日期是DST,还是显示的日期是/过去/将来是DST,则要使用DST?因此需要由周围的程序逻辑,适当时调整l_tz。可能在1月1日和当前或目标年的当前或目标日期之间取类似的增量。