python3中的str到time对象
给定一对表示时间和时区的python3中的str到time对象,python,python-3.x,Python,Python 3.x,给定一对表示时间和时区的str对象: time_str = '09:30' time_zone_str = 'America/New_York' 如何将这两个字符串解析为()对象? 注意:显然可以将时间\u str拆分为:”,并使用时间构造函数,但解析时要计算结果列表中的元素数以了解str的分辨率(分、秒、微秒)会有点棘手。这是因为允许不同的表示: time_str_short = '09:30' time_str_long = '09:30:00' 提前感谢您的考虑和回复。希望对您
str
对象:
time_str = '09:30'
time_zone_str = 'America/New_York'
如何将这两个字符串解析为()对象?
注意:显然可以将时间\u str
拆分为:”
,并使用时间构造函数,但解析时要计算结果列表中的元素数以了解str的分辨率(分、秒、微秒)会有点棘手。这是因为允许不同的表示:
time_str_short = '09:30'
time_str_long = '09:30:00'
提前感谢您的考虑和回复。希望对您有用
import datetime
# Hello World program in Python
print "Hello World!\n"
time_str = '09:30'
time_zone_str = 'America/New_York'
s = "I am looking for a course in Paris!"
print(s)
print(datetime.datetime.strptime(time_str, '%H:%M').time())
print(datetime.time(3, 55))
谢谢对于“我可以这样做吗?”(带有时区)的回答是是和否。首先,让我们将字符串转换为时间
对象。正如一位评论员所提到的,您可以在python 3.7中使用以下方法来实现这一点:
如果不使用3.7,可以通过创建datetime
然后转换为time对象来实现:
from datetime import datetime, time
as_time = datetime.datetime.strptime("09:00", "%H:%M").time()
现在来处理时区问题。由于时区是一个名称,我们可以使用非常方便的模块将其转换为tzinfo对象:
pytz.timezone('America/New_York')
此时,您可能会尝试将其作为tzinfo参数传递给时间构造函数,但不幸的是,pytz不起作用:
不幸的是,对于许多时区,使用标准datetime构造函数的tzinfo参数“不适用于”pytz。
~
因此,我们必须使用新创建的tzinfo对象的本地化方法。但不幸的是,我们仍然无法成功地将时间
对象定位到该时区。这样做的原因是pytz需要知道日期,以便确定该时区是否为夏令时。由于我们没有提供日期,因此实现这一目标是不可能的,您将得到如下奇怪的结果:
>>> pytz.timezone('America/New_York').localize(as_dt).isoformat()
'1900-01-01T09:00:00-04:56'
注意-04:56
偏移量,这是胡言乱语。有几个选项可以让你最终得到想要的东西
一种选择是假设时间是今天的时间:
as_time = datetime.datetime.strptime("09:00", "%H:%M").time()
tz = pytz.timezone('America/New_York')
local_time = tz.localize(datetime.datetime.now().replace(hour=as_time.hour, minute=as_time.minute))
另一个选项是使用简单的时区偏移量,而不是时区名称:
from datetime import timezone, timedelta
naive_tz = timezone(timedelta(hours=5))
datetime.time(9, 30).replace(tz_info=naive_tz)
但是我不推荐这种方法,因为它非常脆弱,需要一些中间步骤来从TZ位置名称派生,这是非常重要的。没有日期的时区是没有意义的,所以不,您不能同时使用这两个步骤来生成time
对象。虽然标准库time
对象确实支持具有tzinfo
属性,“timezone”对象实际上不是时区,而只是时间偏移
时区不仅仅是UTC的偏移量。时区偏移量取决于日期,由于夏令时冬季/夏季时间区分等细节部分是政治决策的结果,因此时区偏移量更改的日期也取决于年份
明确地说,美国/纽约
是一个时区,而不是时间偏移。与UTC的准确偏移量取决于日期;夏天是零下4个小时,冬天是5个小时
因此,对于像美国/纽约这样的时区,你也需要选择一个日期。如果你不在乎日期,选择一个固定的日期,这样你的偏移量至少是一致的。如果要转换大量时间戳,请将时区偏移存储为timedelta()
,然后使用该timedelta将time()
对象移到右侧偏移
要仅解析一个时间字符串,请使用datetime.strtime()
方法假装有附加的日期,然后提取时间对象:
from datetime import datetime
try:
timeobject = datetime.strptime(time_str, '%H:%M').time()
except ValueError:
# input includes seconds, perhaps
timeobject = datetime.strptime(time_str, '%H:%M:%S').time()
要更新给定时区的时间,请首先获取支持时区字符串的时区数据库;报告定期更新
from pytz import timezone
timezone = pytz.timezone(time_zone_str)
你如何使用它取决于你想做什么。如果输入时间不是UTC,只需将时区附加到带有的datetime()
对象,然后可以将其移动到UTC时区:
dt_in_timezone = datetime.combine(datetime.now(), timeobject, timezone)
utc_timeobject = dt_in_timezone.astimezone(pytz.UTC).time()
这假设“今天”足以确定正确的偏移量
如果您的时间是UTC时间戳,请将其与UTC
时区组合,然后使用pytz时区;事实恰恰相反:
dt_in_utc = datetime.combine(datetime.now(), timeobject, pytz.UTC)
timeobject_in_timezone = dt_in_timezone.astimezone(timezone).time()
要仅存储批量应用程序的偏移量,请将参考日期传递到:
之后,您可以根据需要将其添加到任何datetime
对象中,以从UTC移动到本地时间,或者减去它以从本地移动到UTC。注意,我说的是datetime
,因为time
对象也不支持timedelta
算法;毕竟,时间差可能大于一天中剩余的秒数或午夜后的秒数,因此加或减可能会改变天数和时间:
# new time after shifting
(datetime.combine(datetime.now(), timeobject) + utc_offset).time()
为了完成,您不能将pytz时区传递给time
对象;这对时间没有任何影响。在这种情况下,时区对象返回UTC偏移量的None
,因为如果没有日期,它无法给出任何有意义的答案:
>>> from datetime import time
>>> from pytz import timezone
>>> tz = timezone('America/New_York')
>>> time_with_zone = time(12, 34, tzinfo=tz)
>>> time_with_zone
datetime.time(12, 34, tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>)
>>> time_with_zone.utcoffset()
>>> time_with_zone.utcoffset() is None
True
>>> tz.utcoffset(None) is None # what time_with_zone.utcoffset() does under the hood
None
这是1883年铁路引入的时区;直到20世纪,“现代”东部时区才被引入。这就是为什么在确定偏移量时,时区对象通常在日期中传递:
>>> tz.utcoffset(datetime(1883, 6, 28))
datetime.timedelta(-1, 68640)
>>> tz.utcoffset(datetime(1918, 6, 28))
datetime.timedelta(-1, 72000)
我同意,一旦你将对象转换为时间对象,你就无法知道原始数据的分辨率是多少,但不管你如何创建时间对象,这不是真的吗?Python 3.7有time。fromisoformat
…@Kevin无论你如何创建,这肯定是真的,但我指的是创建本身。如果我拆分了09:30
和09:30:00
我有两个长度不同的列表…那么字符串可以有不同的格式?有时09:00
,或``09:00:00,或可能
09:00:00.000`?该代码实际上不起作用@RamonjRomeryVigil。。。根据pytz文档,您不能将pytz对象作为tzinfo传递,因为它需要知道日期。如果你真的把它打印到标准上,你会
>>> from datetime import time
>>> from pytz import timezone
>>> tz = timezone('America/New_York')
>>> time_with_zone = time(12, 34, tzinfo=tz)
>>> time_with_zone
datetime.time(12, 34, tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>)
>>> time_with_zone.utcoffset()
>>> time_with_zone.utcoffset() is None
True
>>> tz.utcoffset(None) is None # what time_with_zone.utcoffset() does under the hood
None
tzinfo=<DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>
^^^^^^^^^^^^^^^^^^^^^^^
>>> tz.utcoffset(datetime(1883, 6, 28))
datetime.timedelta(-1, 68640)
>>> tz.utcoffset(datetime(1918, 6, 28))
datetime.timedelta(-1, 72000)