在python2.7中将时间戳字符串转换为带或不带时区的Unix时间

时间:2015-12-27 20:40:11

标签: python datetime time

我试图将给定字符串转换为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:59PM12/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)允许时区字符串存在,或者如果缺少则假设当地时区。

1 个答案:

答案 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