Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python3中的str到time对象_Python_Python 3.x - Fatal编程技术网

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)