字符串中的日期时间时区

时间:2020-10-21 17:38:05

标签: python datetime timezone

我试图弄清楚如何通过使用变量使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

2 个答案:

答案 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>)