首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将结尾处的UTC-#字符串转换为DateTimeField?

如何将结尾处的UTC-#字符串转换为DateTimeField?
EN

Stack Overflow用户
提问于 2021-05-18 18:11:00
回答 1查看 189关注 0票数 1

我的字符串列表格式如下:'2/24/2021 3:37:04 PM UTC-6'

我该如何转换这个?

我试过了

代码语言:javascript
复制
datetime.strptime(my_date_object, '%m/%d/%Y %I:%M:%s %p %Z')

但是,我发现一个错误:“未转换的数据仍然存在:-6”

这是因为UTC-6在最后?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 19:11:13

@MrFuppes在其评论中提到的方法是最简单的方法。

Ok似乎需要拆分'UTC‘上的字符串并分别解析偏移量。然后,您可以从时间增量中设置tzinfo。

代码语言:javascript
复制
input_string = '2/24/2021 3:37:04 PM UTC-6'

try:
    dtm_string, utc_offset = input_string.split("UTC", maxsplit=1)
except ValueError:
    # Couldn't split the string, so no "UTC" in the string
    print("Warning! No timezone!")
    
    dtm_string = input_string
    utc_offset = "0"


dtm_string = dtm_string.strip() # Remove leading/trailing whitespace '2/24/2021 3:37:04 PM'
utc_offset = int(utc_offset)    # Convert utc offset to integer -6

tzinfo = tzinfo = datetime.timezone(datetime.timedelta(hours=utc_offset))

result_datetime = datetime.datetime.strptime(dtm_string, '%m/%d/%Y %I:%M:%S %p').replace(tzinfo=tzinfo)

print(result_datetime)
# prints 2021-02-24 15:37:04-06:00

或者,如果使用正则表达式很容易地提取相关组件,则可以避免使用datetime.strptime

代码语言:javascript
复制
rex = r"(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{2}):(\d{2}) (AM|PM) UTC(\+|-)(\d{1,2})"

input_string = '2/24/2021 3:37:04 PM UTC-6'

r = re.findall(rex, input_string)
# gives:  [('2', '24', '2021', '3', '37', '04', 'PM', '-', '6')]

mm = int(r[0][0])
dd = int(r[0][1])
yy = int(r[0][2])

hrs = int(r[0][3])
mins = int(r[0][4])
secs = int(r[0][5])

if r[0][6].upper() == "PM":
    hrs = hrs + 12

tzoffset = int(f"{r[0][7]}{r[0][8]}")

tzinfo = datetime.timezone(datetime.timedelta(hours=tzoffset))

result_datetime = datetime.datetime(yy, mm, dd, hrs, mins, secs, tzinfo=tzinfo)
print(result_datetime)
# prints 2021-02-24 15:37:04-06:00

正则表达式(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{2}):(\d{2}) (AM|PM) UTC(\+|-)(\d{1,2}) 演示

解释:

  • (\d{1,2}):一到两位数。圆括号表示这是一个捕获组。类似的构造用于获取月份、日期和小时以及UTC偏移量。
  • \/:正斜杠
  • (\d{4}):正好四位数。也是一个捕获小组。一个类似的构造用于分钟和秒。
  • (AM|PM):"AM“或"PM”
  • UTC(\+|-)(\d{1,2}):"UTC",后面是正负号,后面是一个或两个数字。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67591799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档