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

2024-04-18 08:39:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将给定的字符串转换为Unix时间。字符串中总是有一个时间,也可以选择有一个日期。例如,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,则时区将被timetuple()删除,并且当转换工作时,它仍然会给出相同的结果,就好像时区不在字符串中一样(因此只对系统的本地时间是正确的)。在

我还没有找到一种优雅的方法:1)在给定时区时,将字符串正确地转换为适当的时区;2)允许时区字符串存在;如果缺少,则假定为本地时区。在


Tags: 字符串fromimport命令parsertargettimeparse
1条回答
网友
1楼 · 发布于 2024-04-18 08:39:49

输入时间字符串可能不明确:

  • 11:59:utc偏移量可能取决于日期,例如,在夏季可能不同。为了消除日期的歧义,可以将default参数传递给.parse()方法
  • ^{} may correspond to different timezones。要消除utc偏移量的歧义,可以传递tzinfos参数

mktime()可能在某些系统上或在DST转换期间失败。^{} 启用可移植解决方案:

#!/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()))

输出

^{pr2}$

tz.localize()使用is_dst=False,在DST转换期间或对于不存在的本地时间,请参见"Can I just always set is_dst=True?" section。在

相关问题 更多 >