将时区初始日期时间字符串转换为UTC日期时间(但不使用pytz)



我们需要将传入的日期时间字符串转换为UTC日期时间字符串。传入字符串的格式如下:

'01/28/2022 12:00 AM'

预期输出为:

'2022-01-28T08:00:00Z'

该字符串没有声明的时区,但应该是PST。我们希望以一种允许多种时区和日期字符串格式的方式进行编码。我们可以使用以下代码来实现这一点:

from datetime import datetime
import pytz
UTC_TIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
PROVIDER_DATETIME_FORMAT = '%m/%d/%Y %I:%M %p'
PROVIDER_TIMEZONE = 'America/Los_Angeles'
def dt_string_to_utc_converter(datetime_str)
utc_timezone = pytz.utc
pst_timezone = pytz.timezone(PROVIDER_TIMEZONE)
naive_date = datetime.strptime(datetime_str, PROVIDER_DATETIME_FORMAT)
pst_date = pst_timezone.localize(naive_date)
utc_date = pst_date.astimezone(utc_timezone)
utc_date_str = utc_date.strftime(UTC_TIME_FORMAT)
return utc_date_str

然而(出于我不想深入讨论的原因(,我们被要求不要使用pytz库,而是使用Python的本地datetime和dateutil库。目前,我们致力于Python 3.8。

我使用datetime的strptime和dateutil的解析器尝试了很多东西,但到目前为止都没有成功。有什么明显的图案我遗漏了吗?

感谢

对于记录,这里有一个使用Python 3.9的zoneinfo和Python 3.7的isoformat的选项。

from datetime import datetime
from zoneinfo import ZoneInfo
def to_isoformat(s, tzname, inputformat='%m/%d/%Y %I:%M %p'):
"""
convert an input string "s" representing date/time in format "inputformat" in
time zone "tzname" to UTC and return an ISO format string with Z denoting UTC.
Parameters
----------
s : str
string representing date/time.
tzname : str
IANA time zone name of time zone that s belongs in.
inputformat : str, optional
date/time string format. The default is '%m/%d/%Y %I:%M %p'.
Returns
-------
str
ISO format string, with seconds precision and Z denoting UTC.
"""
# to datetime and set time zone
dt = datetime.strptime(s, inputformat).replace(tzinfo=ZoneInfo(tzname))
# convert to UTC and make ISO format with Z for UTC
return dt.astimezone(ZoneInfo("UTC")).isoformat(timespec='seconds').replace('+00:00', 'Z')

print(to_isoformat('01/28/2022 12:00 AM', 'America/Los_Angeles'))
# 2022-01-28T08:00:00Z

使用Python 3.8,基本上可以用from dateutil.tz import gettz as ZoneInfo替换from zoneinfo import ZoneInfo

好吧,经过更多的挖掘,我设法在这里和这里找到了裁判,他们列出了我需要的基本信息。最终代码如下:

from datetime import datetime
from dateutil import tz, parser, utils
UTC_TIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
PROVIDER_TIMEZONE = 'America/Los_Angeles'
def dt_string_to_utc_converter(datetime_str)
parsed_dt = parser.parse(datetime_str)
localized_dt = utils.default_tzinfo(parsed_dt, tz.gettz(PROVIDER_TIMEZONE))
utc_dt = localized_dt.astimezone(tz.tzutc())
utc_dt_str = utc_dt.strftime(UTC_TIME_FORMAT)

最新更新