相关疑难解决方法(0)

Python strptime()和时区?

我有一个使用IPDDump创建的Blackberry IPD备份的CSV转储文件.这里的日期/时间字符串看起来像这样(EST澳大利亚时区在哪里):

Tue Jun 22 07:46:22 EST 2010
Run Code Online (Sandbox Code Playgroud)

我需要能够在Python中解析这个日期.起初,我尝试使用strptime()datettime中的函数.

>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Run Code Online (Sandbox Code Playgroud)

但是,由于某种原因,返回的datetime对象似乎没有任何tzinfo关联它.

我在这个页面上读到的显然是datetime.strptime默默地丢弃了tzinfo,但是,我检查了文档,我找不到任何有关此处记录的效果.

我已经能够使用第三方Python库dateutil来解析日期,但是我仍然很好奇我是如何使用内置strptime()错误的?有什么方法可以strptime()很好地与时区玩吗?

python timezone datetime

141
推荐指数
4
解决办法
14万
查看次数

datetime:从时区名称的字符串转换不起作用

我有以下字符串"2017-03-30 08:25:00CET",我想将其转换为日期时间tz感知对象.

根据这个问题,从python 3.2可以只使用datetime模块完成.另外,从文档中我看到了

%z |  UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). |  (empty), +0000, -0400, +1030
%Z |  Time zone name (empty string if the object is naive).                        |  (empty), UTC, EST, CST
Run Code Online (Sandbox Code Playgroud)

所以我尝试以下方法

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z')
Run Code Online (Sandbox Code Playgroud)

我没有得到任何错误,但是我得到的对象不是tz意识到的

datetime.datetime(2017, 3, 30, 8, 25)
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我将我的字符串转换为"2017-03-30 08:25:00+0200"然后将其转换为对象

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%z')

我确实得到了一个tz感知的日期时间:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
Run Code Online (Sandbox Code Playgroud)

任何想法为什么它适用%z但不与%Z …

python timezone python-3.x python-datetime

8
推荐指数
1
解决办法
2981
查看次数

无法使用python中的posix样式时区解析解析时间字符串

我有这样的时间字符串: 2013-08-22 16:56:19 Etc/GMT

我需要将它解析为datetime对象.我陷入了posix风格的时区,我无法让Python本地化.

这是一些尝试和他们的失败.我首先包括时区剥离版本,以显示解析是否正确.

datetime.strptime

>>> datetime.datetime.strptime("2013-08-22 16:56:19 UTC", "%Y-%m-%d %H:%M:%S %Z")
datetime.datetime(2013, 8, 22, 16, 56, 19)
>>> datetime.datetime.strptime("2013-08-22 16:56:19 Etc/GMT", "%Y-%m-%d %H:%M:%S %Z")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2013-08-22 16:56:19 Etc/GMT' does not match format '%Y-%m-%d %H:%M:%S %Z'
Run Code Online (Sandbox Code Playgroud)

time.strptime

>>> time.strptime("2013-08-22 16:56:19 UTC", "%Y-%m-%d %H:%M:%S %Z")
time.struct_time(tm_year=2013, tm_mon=8, tm_mday=22, tm_hour=16, tm_min=56, tm_sec=19, tm_wday=3, tm_yday=234, tm_isdst=0)
>>> time.strptime("2013-08-22 16:56:19 Etc/GMT", …
Run Code Online (Sandbox Code Playgroud)

python timezone datetime posix

6
推荐指数
1
解决办法
1060
查看次数

如何将未知时区的字符串日期时间转换为python中的时间戳

我有一个这样的日期时间Thu Jun 02 11:56:53 CDT 2011 我试图使用下面的代码将它转换为日期时间对象

from dateutil import parser
timestamp = parser.parse("Thu Jun 02 11:56:53 CDT 2011")
Run Code Online (Sandbox Code Playgroud)

但我收到这个警告

UnknownTimezoneWarning: tzname CDT identified but not understood. 
Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.
In a future version, this raise an exception.
category=UnknownTimezoneWarning)
Run Code Online (Sandbox Code Playgroud)

当我使用UTC代替时没有警告CDT。我可以tzinfos用来解决这个问题吗?

python datetime python-3.x

6
推荐指数
2
解决办法
7149
查看次数

将时区缩写的非UTC时间字符串转换为python中的UTC时间,同时考虑夏令时

由于时区缩写,我很难将非UTC时间的字符串表示转换为UTC.

(更新:似乎时区缩写可能不是唯一的.如果是这样,也许我也应该考虑这一点.)

我一直在尝试使用datetutil和pytz寻找方法,但没有任何运气.

建议或解决方法将不胜感激.

string = "Jun 20, 4:00PM EDT" 
Run Code Online (Sandbox Code Playgroud)

我想将其转换为UTC时间,在适当的时候考虑夏令时.

更新:找到一些可能有助于更有经验的用户回答Q的参考资料.

从本质上讲,我会想象的解决方案做相反的一部分这个.

最终更新(重要)

取自dateutil docs示例.

一些基于date命令的简单示例,使用TZOFFSET字典提供BRST时区偏移量.

解析("Thu Sep 25 10:36:28 BRST 2003",tzinfos = TZOFFSETS)datetime.datetime(2003,9,25,10,36,28,tzinfo = tzoffset('BRST', - -10800))

parse("2003 10:36:28 BRST 25 Sep Thu",tzinfos = TZOFFSETS)datetime.datetime(2003,9,25,10,36,28,tzinfo = tzoffset('BRST', - -10800))

将其与此处的库相结合.你将有一个解决这个问题的方法.

python utc pytz dst python-dateutil

5
推荐指数
1
解决办法
1226
查看次数

将字符串转换为datetime对象

我试图将字符串转换为日期时间对象.我从新闻Feed获得的字符串采用以下格式:"星期四,2014年10月16日01:16:17 EDT"

我尝试使用datetime.strptime()来转换它.即

datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

回溯(最近一次调用最后一次):
  文件"",第1行,在datetime.strptime('星期四,2014年10月16日01:16:17 EDT','%a,%d%b%Y%H:%M: %S%Z')
  文件"C:\ Anaconda\lib_strptime.py",第325行,在_strptime(data_string,format)中)
ValueError:时间数据'星期四,2014年10月16日01:16:17 EDT'格式不匹配'%a,%d%b%Y%H:%M:%S%Z'

但是,如果我尝试没有"EDT"的字符串,它就可以了.即

datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解析"EDT"部分?

python datetime rfc2822

5
推荐指数
1
解决办法
1421
查看次数

ValueError时间数据'Fri Mar 11 15:59:57 EST 2016'与格式'%a%b%d%H:%M:%S%Z%Y'不匹配

我试图从以下日期创建一个日期时间对象:'Fri Mar 11 15:59:57 2016 2016'使用格式:'%a%b%d%H:%M:%S%Z%Y' .

这是代码.

from datetime import datetime
date = datetime.strptime('Fri Mar 11 15:59:57 EST 2016', '%a %b %d %H:%M:%S %Z %Y')
Run Code Online (Sandbox Code Playgroud)

但是,这会导致ValueError,如下所示.

ValueError: time data 'Fri Mar 11 15:59:57 EST 2016' does not match format '%a %b %d %H:%M:%S %Z %Y'
Run Code Online (Sandbox Code Playgroud)

也许我错过了我的格式字符串明显错误的东西,但我一遍又一遍地检查它.非常感谢任何帮助,谢谢.

编辑以反映评论/问题以获取更多信息:

我正在使用的Python版本是2.7.6.

在Ubuntu 14.04上使用'locale'命令我得到这个:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

python datetime strptime

5
推荐指数
1
解决办法
625
查看次数

将时区缩写解析为UTC

如何将表单的日期时间字符串转换为Feb 25 2010, 16:19:20 CETunix时代?

目前我最好的方法是用time.strptime()这个:

def to_unixepoch(s):
    # ignore the time zone in strptime
    a = s.split()
    b = time.strptime(" ".join(a[:-1]) + " UTC", "%b %d %Y, %H:%M:%S %Z")
    # this puts the time_tuple(UTC+TZ) to unixepoch(UTC+TZ+LOCALTIME)
    c = int(time.mktime(b))
    # UTC+TZ
    c -= time.timezone
    # UTC
    c -= {"CET": 3600, "CEST": 2 * 3600}[a[-1]]
    return c
Run Code Online (Sandbox Code Playgroud)

我从其他问题中看到可能会使用calendar.timegm(),以及pytz其中简化这一点,但这些不处理缩写的时区.

我想要一个需要最少多余库的解决方案,我希望尽可能多地保留标准库.

python time timezone datetime pytz

4
推荐指数
1
解决办法
7534
查看次数

linux将时间(对于不同的时区)转换为UTC

有没有办法,在linux中,有问题地获得给定时间字符串的UTC时间

Tue Dec  14 10:30:23 PST 2012
Tue Jan  4 11:30:23 EST 2013
Run Code Online (Sandbox Code Playgroud)

到UTC时间,无论(并且不更改)本地时区设置?

c linux timezone gcc

3
推荐指数
1
解决办法
2998
查看次数

Python - 如何从 RSS 提要中获取时区

我需要获取 RSS 提要的已发布字段,并且我需要知道时区是什么。我以 UTC 格式存储日期,并且我想要另一个字段来存储时区,以便我以后可以操纵日期时间。

我目前的代码如下:

for entry in feed['entries']:
    if hasattr(entry, 'published'):
        if isinstance(entry.published_parsed, struct_time):
            dt = datetime(*entry.published_parsed[:-3])
Run Code Online (Sandbox Code Playgroud)

dt 的最终值是 UTC 中的正确日期时间,但我还需要获取原始时区。任何人都可以帮忙吗?

编辑:

为了将来参考,即使它不是我最初问题的一部分,如果您需要操作非标准时区(如 est),您需要根据您的规范制作一个转换表。感谢这个答案:Parsing date/time string with timezone abbreviated name in Python?

python rss timezone datetime feedparser

3
推荐指数
1
解决办法
2948
查看次数

python将PST时间转换为UTC isoformat

例如:我有一个日期字符串

2018-02-17 16:15:36.519 PST
Run Code Online (Sandbox Code Playgroud)

我如何在 UTC 中转换为 isoformat,如下所示

2018-02-18T00:15:36.519Z
Run Code Online (Sandbox Code Playgroud)

我试过这个

from dateutil.parser import parse
d1='2018-02-17 16:15:36.519 PST'
print parse(d1)
it prints like this.  How do i convert it to UTC with Z at the end.
2018-02-17 16:15:36.519000-08:00
Run Code Online (Sandbox Code Playgroud)

使用 python 2.7 进行编辑

import dateutil
import pytz
from dateutil.parser import parse
d1='2018-02-17 16:15:36.519 PST'
d2=dateutil.parser.parse(d1)
d2.replace(tzinfo=pytz.utc) - d2.utcoffset()
d3=(d2.replace(tzinfo=pytz.utc) - d2.utcoffset()).isoformat()
print d3
Run Code Online (Sandbox Code Playgroud)

然后按照建议使用 Z 进行格式化

python parsing date

3
推荐指数
1
解决办法
4502
查看次数

如何使用 dateutil.tz.tz.tzoffset 来本地化使用 strptime 创建的时区天真日期时间?

我如何使用 dateutil.tz.tz.tzoffset 类型的对象来本地化具有正确时区和 DST 信息的时区原始日期时间对象,以便它可以正确转换为 UTC?或者,如何将 dateutil.tz.tz.tzoffset 转换为 pytz.timezone?

我一直无法找到有关使用 dateutil.tz.tz.tzoffset 对象本地化日期时间对象的好信息。请参阅下面的一些我审查过的更好的文章。

背景资料:

我正在处理大量日期字符串,其中大多数没有时区信息。在某些情况下,时间是格林威治标准时间,在其他情况下是本地时间。我必须首先确定创建这些各种日志的设备的时区,然后解析各种日期字符串,如果是本地时间,则添加添加时区,最后将其转换为 UTC。

我几乎让这一切都在工作,除了确定时区的唯一可靠方法是从文本文件中获取日期格式为 EDT、IST 等,因此我使用了以下链接中最高投票的帖子来完成这使用 dateutil 的 parser.parse() 函数并将其发送给它的 tzinfos 参数的字典。(在 Python 中使用时区缩写名称解析日期/时间字符串?

但是,这给我留下了一个 DateTime,它有一个 tzinfo type=dateutil.tz.tz.tzoffset。我没问题,除非我需要使用这个 tzinfo 来本地化不包含时区信息的字符串,并且 dateutil.tz.tz.tzoffset 类型没有像 pytz.timezone 那样的本地化选项,这是关键我的问题。

我让这太难了吗?我是否只是用我保存的 dateutil.tz.tz.tzoffset 对象替换了时区天真日期时间中的 tzinfo ?

代码:

下面读取日期字符串并将其保存为日期时间对象,将时区保存在 var 中以备后用,然后将日期字符串转换为 UTC:

from dateutil.parser import parse as parsedate
import pytz
from pytz import timezone
from datetime import datetime

timestr = 'Sat, 5/01/2019 8:00PM EDT' #only reliable source of timezone info
dtfromstrEDT = parsedate(timestr, tzinfos=tzd) …
Run Code Online (Sandbox Code Playgroud)

python datetime pytz python-dateutil

1
推荐指数
1
解决办法
1610
查看次数