我试图将给定字符串转换为Unix时间。该字符串总是有一个时间,并且可选地也有一个日期。例如,int children(node* tree)
{
if (!tree)
{
return 0;
}
int count = 0;
if (tree->left)
{
count += 1;
}
if (tree->right)
{
count += 1;
}
return count;
}
int grandchildren(node* tree)
{
if (!tree)
{
return 0;
}
return children(tree->left) + children(tree->right);
}
int grandparents(node* tree)
{
if (!tree)
{
return 0;
}
int count = grandchildren(tree);
if (count == 2 || count == 3)
{
return 1 + grandparents(tree->left) + grandparents(tree->right);
}
else
{
return grandparents(tree->left) + grandparents(tree->right);
}
}
,12/31/15 11:59PM
和12/31/15 11:59
是我可以获得的字符串。
使用以下内容,可以正确转换任何字符串:
11:59
然而,如果给出时区,例如, from dateutil import parser
import time
timezone = "12/31/15 11:59"
target = time.mktime(parser.parse(timestamp).timetuple())
,时区被12/31/15 11:59PM PST
删除,当转换有效时,它仍然会给出相同的结果,就好像时区不在字符串中一样(因此只对本地有效)系统的时间)。
我还没有找到一种优雅的方法1)在给定时区时将字符串正确转换为适当的时区,同时2)允许时区字符串存在,或者如果缺少则假设当地时区。
答案 0 :(得分:1)
输入时间字符串可能不明确:
11:59
:utc偏移量可能取决于日期,例如,夏季时间可能不同。要消除日期歧义,您可以将default
参数传递给.parse()
方法PST
may correspond to different timezones。要消除utc偏移的歧义,您可以传递tzinfos
参数 mktime()
可能在某些系统上或在DST转换期间失败。 tzlocal
支持便携式解决方案:
#!/usr/bin/env python
from datetime import datetime
from dateutil.parser import parse # $ pip install python-dateutil
from pytz import utc # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
epoch = datetime(1970, 1, 1, tzinfo=utc) # POSIX Epoch
default = datetime(2016, 1, 1)
tzinfos = dict(PST=-8 * 3600)
tz = get_localzone() # local timezone
for time_string in ["12/31/15 11:59PM", "12/31/15 11:59PM PST", "12/31/15 11:59",
"11:59"]:
dt = parse(time_string, default=default, tzinfos=tzinfos)
if dt.tzinfo is None or dt.utcoffset() is None: # naive
dt = tz.normalize(tz.localize(dt)) # assume local timezone
posix_timestamp = (dt - epoch).total_seconds()
dt = datetime.fromtimestamp(posix_timestamp, dt.tzinfo)
print("{dt} <- {posix_timestamp:.0f} <- {time_string}".format(**vars()))
2015-12-31 23:59:00+01:00 <- 1451602740 <- 12/31/15 11:59PM
2015-12-31 23:59:00-08:00 <- 1451635140 <- 12/31/15 11:59PM PST
2015-12-31 11:59:00+01:00 <- 1451559540 <- 12/31/15 11:59
2016-01-01 11:59:00+01:00 <- 1451645940 <- 11:59
tz.localize()
使用is_dst=False
来消除DST转换期间的时间或不存在的本地时间,请参阅"Can I just always set is_dst=True?" section。