我试图弄清楚如何通过使用变量使datetime对象知道。我抓住了用户的时区,并将其传递给要使用的表格。
我尝试了以下两种方法,但都没有成功
timezone_variable = "Europe/London"
new_datetime = datetime(int(date_year), int(date_month), int(date_day),
int(time_hour), int(date_minute), tzinfo=timezone_variable)
new_datetime = datetime(int(date_year), int(date_month), int(date_day),
int(time_hour), int(date_minute), tzinfo=timezone.timezone_variable)
这将给我带来TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'str'
的错误
时区不会总是被预先知道,因此不可能简单地将参数设为tzinfo=timezone.utc
。
答案 0 :(得分:2)
您可以使用pytz
通过字符串创建时区对象:
>>> from pytz import timezone
>>> timezone("Europe/London")
<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>
然后可以在datetime.datetime()
构造函数中将其用作tzinfo
参数。如果需要,请按照文档中的说明使用localize()
函数。
答案 1 :(得分:1)
使用dateutil
或Python 3.9的zoneinfo
:
from datetime import datetime
from dateutil.tz import gettz
# from zoneinfo import ZoneInfo # Python 3.9
# e.g.
date_year, date_month, date_day, time_hour, date_minute = 2020, 10, 21, 10, 21
timezone_variable = gettz("Europe/London") # ZoneInfo("Europe/London") # Python 3.9
new_datetime = datetime(int(date_year), int(date_month), int(date_day),
int(time_hour), int(date_minute), tzinfo=timezone_variable)
print(new_datetime)
print(repr(new_datetime))
# 2020-10-21 10:21:00+01:00
# datetime.datetime(2020, 10, 21, 10, 21, tzinfo=tzfile('GB-Eire'))
# with zoneinfo:
# datetime.datetime(2020, 10, 21, 10, 21, tzinfo=zoneinfo.ZoneInfo(key='Europe/London'))
请注意,您可以直接创建datetime
对象。如果使用pytz
(Python 3.9不推荐使用),则必须使用时区对象的localize方法。否则,您将得到LMT
:
import pytz
timezone_variable = pytz.timezone("Europe/London")
# wrong:
new_datetime = datetime(int(date_year), int(date_month), int(date_day),
int(time_hour), int(date_minute), tzinfo=timezone_variable)
print(repr(new_datetime))
# datetime.datetime(2020, 10, 21, 10, 21, tzinfo=<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>)