Python 将timedelta格式化为时区偏移字符串

Python 将timedelta格式化为时区偏移字符串,python,datetime,string-formatting,timedelta,Python,Datetime,String Formatting,Timedelta,作为输入,我有两个时间戳字符串,一个是本地时间,另一个是UTC时间中的同一时刻。我想得到它们之间的差异,基本上是以特定格式获取本地时区偏移量作为字符串,例如+1100或-0500 import datetime local = '2018-01-31 18:34:42.172' utc = '2018-01-31 23:34:42.172' local_dt = datetime.datetime.strptime(local, '%Y-%m-%d %H:%M:%S.%f') utc_d

作为输入,我有两个时间戳字符串,一个是本地时间,另一个是UTC时间中的同一时刻。我想得到它们之间的差异,基本上是以特定格式获取本地时区偏移量作为字符串,例如+1100或-0500

import datetime

local = '2018-01-31 18:34:42.172'

utc = '2018-01-31 23:34:42.172'

local_dt = datetime.datetime.strptime(local, '%Y-%m-%d %H:%M:%S.%f')

utc_dt = datetime.datetime.strptime(utc, '%Y-%m-%d %H:%M:%S.%f')

offset_timedelta = local_dt - utc_dt

offset = offset_timedelta.total_seconds() / 3600

offset
Out[8]: -5.0
例如,使用timedelta,我可以将偏移量设置为float-5.0。从那里,我可能会创建一个函数,将浮点转换为我想要的格式的字符串,但我很好奇是否有我缺少的datetime/timedelta方法或格式,或者一些字符串格式可以更干净、更高效地完成这项工作

任何帮助都将不胜感激

编辑,因为我发现我的问题不清楚:
有没有办法通过datetime库或字符串格式获取-0500 I need string的特定格式,而不是float

实际上你已经完成了所有的工作。但您可以使用模块dateutil隐藏混乱的细节:

>>> local = '2018-01-31 18:34:42.172'
>>> utc = '2018-01-31 23:34:42.172'

>>> from dateutil import parser, relativedelta
>>> tzh=relativedelta.relativedelta(parser.parse(local), parser.parse(utc))
>>> tzh
relativedelta(hours=-5)
要按您想要的方式格式化,请执行以下操作:

>>> f"{tzh.hours:+03d}{abs(tzh.minutes):02d}"
'-0500'
或者,Python 2.6到3.5:

>>> "{hours:+03d}{minutes:02d}".format(hours=tzh.hours, minutes=abs(tzh.minutes))
'-0500'

dateutil模块不在标准库中,但值得下载。它可以做的远不止这些。

如果你想清理你的代码,就把它放到一个函数中!我做了大部分工作,但不是全部,因为我的问题是以特定格式获取偏移量作为字符串:我编辑了我的帖子,因为他们的问题显然不清楚:有没有办法获取-0500我需要特定格式的字符串,而不是浮点数,无论是通过datetime库还是字符串格式?谢谢你的提示,我一定会查的@rstk:稍微扩展一下答案。一开始我不明白格式是问题的关键。这表明我没有足够仔细地阅读它。感谢更新,它帮助了我,我在代码中使用了类似的格式,并得到了相同的输出。现在,这个解决方案的问题是,它只适用于计时的时区。有些时区是30分钟或45分钟。如果偏移量是-3:30,我们得到的是-0350,而不是-0330。这就是为什么我想知道是否有一些datetime技巧或其他格式可以正确处理此问题。现在我看到您在此期间再次编辑了它,您也意识到了这个问题但对于负非圆时区,它仍然不好,得到了-04-30,而不是-0430。完全正确,我只测试了UTC向东的偏移量。我忘了纽芬兰,虽然我认为那是-0330而不是-0430。现在修好了。使用absminutes是安全的,因为在这种情况下,小时和分钟的符号总是一致的。