繁体   English   中英

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

[英]How do I print a datetime in the local timezone?

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

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

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

'2009-07-10 18:44:59.193982+00:00'

除了在本地时区而不是 UTC 中打印之外,如何获得类似的字符串?

此脚本演示了使用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()))

它输出以下内容:

$ ./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

从 python 3.6 astimezone()没有时区对象的情况下调用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()))

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

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

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

eastern = timezone('US/Eastern')

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

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

假设LocalLocalTimezone一个实例

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc)
local_t = t.astimezone(Local)

然后str(local_t)给出:

'2009-07-11 04:44:59.193982+10:00'

这就是你想要的。

(注意:这对您来说可能很奇怪,因为我在澳大利亚新南威尔士州,UTC10 或 11 小时)

从 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_tmu_tm - l_tm取决于你想显示为 + 或 - UTC 小时。 我在 MST,这就是 -07 的来源。 更聪明的代码应该能够找出减法的方法。

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

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

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_to_local_timezone()这似乎过于错综复杂,但我发现了一个功能没有简化版本,其转换datetime实例的本地时区中的配置,操作系统,与UTC偏移量实际上是在当时

import time, datetime

def datetime_to_local_timezone(dt):
    epoch = dt.timestamp() # Get POSIX timestamp of the specified datetime.
    st_time = time.localtime(epoch) #  Get struct_time for the timestamp. This will be created using the system's locale and it's time zone information.
    tz = datetime.timezone(datetime.timedelta(seconds = st_time.tm_gmtoff)) # Create a timezone object with the computed offset in the struct_time.

    return dt.astimezone(tz) # Move the datetime instance to the new time zone.

utc = datetime.timezone(datetime.timedelta())
dt1 = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, utc) # DST was in effect
dt2 = datetime.datetime(2009, 1, 10, 18, 44, 59, 193982, utc) # DST was not in effect

print(dt1)
print(datetime_to_local_timezone(dt1))

print(dt2)
print(datetime_to_local_timezone(dt2))

此示例打印四个日期。 对于两个时刻,一个在 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM