GVKun编程网logo

Python strptime()和时区?(python time strptime)

13

这篇文章主要围绕Pythonstrptime和和时区?展开,旨在为您提供一份详细的参考资料。我们将全面介绍Pythonstrptime的优缺点,解答和时区?的相关问题,同时也会为您带来datetime

这篇文章主要围绕Python strptime和时区?展开,旨在为您提供一份详细的参考资料。我们将全面介绍Python strptime的优缺点,解答和时区?的相关问题,同时也会为您带来datetime.datetime.strptime在Python 2.4.1中不存在、datetime.strptime()的Python时区'%z'指令不可用、PHP date()和strtotime()在31日返回错误的月份、Python astimezone()意外结果的实用方法。

本文目录一览:

Python strptime()和时区?(python time strptime)

Python strptime()和时区?(python time strptime)

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

Tue Jun 22 07:46:22 EST 2010

我需要能够在Python中解析此日期。首先,我尝试strptime()从datettime开始使用该功能。

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

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

我确实在该页面上阅读了显然是datetime.strptime默默丢弃的内容tzinfo,但是,我检查了文档,但找不到此处记录的任何效果。

我已经能够使用第三方Pythondateutil来解析日期,但是我仍然对如何strptime()错误地使用内置函数感到好奇?有什么办法可以使strptime()时区与时俱进吗?

答案1

小编典典

datetime模块的文件说:

返回对应于date_stringdatetime,并根据格式进行解析。等同于datetime(*(time.strptime(date_string, format)[0:6]))

看到了[0:6]吗?那让你(year, month, day, hour, minute, second)。没有其他的。没有提及时区。

有趣的是,[Win XP SP2,Python 2.6、2.7] time.strptime无法将示例传递给你,但是如果你去除了“%Z”和“ EST”,它就可以工作。也可以使用“ UTC”或“ GMT”代替“ EST”。“ PST”和“ MEZ”无效。令人费解。

值得注意的是,此版本已从3.2版开始更新,并且同一文档现在也声明以下内容:

当%z指令提供给strptime()方法时,将生成一个已知的datetime对象。结果的tzinfo将设置为时区实例。

请注意,这不适用于%Z,因此大小写很重要。请参见以下示例:

In [1]: from datetime import datetimeIn [2]: start_time = datetime.strptime(''2018-04-18-17-04-30-AEST'',''%Y-%m-%d-%H-%M-%S-%Z'')In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))TZ NAME: NoneIn [4]: start_time = datetime.strptime(''2018-04-18-17-04-30-+1000'',''%Y-%m-%d-%H-%M-%S-%z'')In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))TZ NAME: UTC+10:00

答案2

小编典典

我建议使用python-dateutil。到目前为止,它的解析器已经能够解析我抛出的每种日期格式。

>>> from dateutil import parser>>> parser.parse("Tue Jun 22 07:46:22 EST 2010")datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal())>>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400")datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400))>>> parser.parse("Sun")datetime.datetime(2011, 12, 18, 0, 0)>>> parser.parse("10-11-08")datetime.datetime(2008, 10, 11, 0, 0)

等等。不用处理strptime()格式废话……只要在它上面加上一个日期,它就可以解决问题。

更新:糟糕。我错过了你提到你使用过的原始问题dateutil,对此感到抱歉。但是,我希望这个答案对于在日期解析问题时看到该模块实用程序的其他人仍然有用。

datetime.datetime.strptime在Python 2.4.1中不存在

datetime.datetime.strptime在Python 2.4.1中不存在

在某些情况下,我们的团队需要使用Python 2.4.1。在Python
2.4.1strptime中的datetime.datetime模块中不存在:

Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)]Type "help", "copyright", "credits" or "license" for more information.>>> import datetime>>> datetime.datetime.strptimeTraceback (most recent call last):  File "<string>", line 1, in <fragment>AttributeError: type object ''datetime.datetime'' has no attribute ''strptime''

与2.6相反:

Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> import datetime>>> datetime.datetime.strptime<built-in method strptime of type object at 0x1E1EF898>

键入时,我在2.4.1的时间模块中找到了它:

Python 2.4.1 (#65, Mar 30 2005, 09:16:17) [MSC v.1310 32 bit (Intel)]Type "help", "copyright", "credits" or "license" for more information.>>> import time>>> time.strptime<built-in function strptime>

我认为它strptime在某个时候动了吗?检查这种事情的最好方法是什么。我尝试查看python的发行历史,但找不到任何东西。

答案1

小编典典

请注意,即使在2.7.1及更高版本中,该strptime功能仍在time模块中datetime

但是,如果您查看最新版本的datetime文档,则会在strptime以下位置看到此内容:

这相当于 datetime(*(time.strptime(date_string, format)[0:6]))

因此您可以改用该表达式。请注意,同一条目还显示“ 2.5版的新功能”。

datetime.strptime()的Python时区'%z'指令不可用

datetime.strptime()的Python时区'%z'指令不可用

如何解决datetime.strptime()的Python时区''%z''指令不可用?

strptime()用纯Python实现。不像strftime(); 它[支持哪些指令]与平台无关。%z从Python 3.2开始受支持:

>>> from datetime import datetime
>>> datetime.strptime(''24/Aug/2014:17:57:26 +0200'', ''%d/%b/%Y:%H:%M:%s %z'')
datetime.datetime(2014, 8, 24, 17, 57, 26, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

如何在不知道语言环境时间的情况下使用strptime()解析电子邮件时区指示符?

Python 2.7中没有具体的时区实现。您可以轻松实现UTC偏移量解析,

解决方法

使用datetime.strptime()的’%z’模式

我有一个表示日期的字符串文本,我完全能够解析它并将其转换为干净的datetime对象:

date = "[24/Aug/2014:17:57:26"
dt = datetime.strptime(date,"[%d/%b/%Y:%H:%M:%S")

除了无法使用此处指定的
%z模式 捕获带有 时区 的整个日期字符串
__

date_tz = 24/Aug/2014:17:57:26 +0200
dt = datetime.strptime(date,"[%d/%b/%Y:%H:%M:%S %z]")
>>> ValueError: ''z'' is a bad directive in format ''[%d/%b/%Y:%H:%M:%S %z]''

因为正如这个错误报告所说

每个平台* 都实现了strftime() *

我精确地指出,朴素的tzinfo指令’%Z’没有这样的问题

解决方法:将tzinfo字符串转换为tzinfo对象

通过使用dateutil模块将GST时间格式字符串转换为tzinfo对象[如此处建议] [4]
,然后将tzinfo插入datetime对象,我可以完美地实现以下解决方法

问题:使%z适用于我的平台?

但是由于显然我将需要%z模式来进行进一步的项目,因此我想找到一个避免这种解决方法的解决方案,并使用外部模块来完成此简单任务。你可以建议我阅读一下吗?我以为较新版本的python(我在2.7上)可以处理它,但是我现在不打算为这个小而重要的细节更改版本。

[编辑]

好吧,看到评论让我重新提出了我的问题:如何在不知道语言环境时间的情况下使用strptime()解析电子邮件时区指示符?

PHP date()和strtotime()在31日返回错误的月份

PHP date()和strtotime()在31日返回错误的月份

如何解决PHP date()和strtotime()在31日返回错误的月份?

如文档中所述,您应该将当月第一天的日期作为第二个参数传递给strtotime()函数:

$base = strtotime(date(''Y-m'',time()) . ''-01 00:00:01'');
echo date(''m/Y'',strtotime(''+0 month'', $base));
echo date(''m/Y'',strtotime(''+1 month'', $base));
echo date(''m/Y'',strtotime(''+2 month'', $base));

看到它有效:http ://ideone.com/eXis9

01/2012

02/2012

03/2012

解决方法

我正在使用date()strtotime()函数在下拉列表中显示接下来的3个月。

PHP代码:

   echo date("m/Y",strtotime("+0 months")); 
   echo date("m/Y",strtotime("+1 months"));
   echo date("m/Y",strtotime("+2 months"));

但是,如果脚本在服务器日期为30日或31日时运行,则下个月(二月)将显示为三月。即上面的脚本应该返回

01/2012
02/2012
03/2012

但是,相反,它实际上显示

01/2012
03/2012
03/2012

那是因为2月没有30号或31号,所以脚本将“ 31/02”转换为“ 01/03”。

我已经阅读了strtotime()php.net上的页面,此问题已经提出,但是还没有任何有用的解决方案。因此,有人可以帮助我找到解决此问题的简单方法吗?提前致谢!

Python astimezone()意外结果

Python astimezone()意外结果

给定一个变量,该变量包含巴黎时区的日期时间2000-01-01 00:01(冬季afaik中为UTC + 2):

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone(''Europe/Paris''))

我希望转换为UTC会导致日期时间为1999-12-31 22:01,但是却得到了:

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone(''Europe/Paris'')).astimezone(pytz.utc)datetime.datetime(1999, 12, 31, 23, 52, tzinfo=<UTC>)

我想念什么?

谢谢

答案1

小编典典

不幸的是 ,在许多时区使用tzinfo标准datetime构造函数的参数“不起作用” pytz

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)''2002-10-27 12:00:00 LMT+0020''

但是对于没有夏令时转换的时区来说是安全的,例如UTC:

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)''2002-10-27 12:00:00 UTC+0000''

您会注意到:

>>> datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone(''Europe/Paris''))datetime.datetime(2000, 1, 1, 0, 1, tzinfo=<DstTzInfo ''Europe/Paris'' LMT+0:09:00 STD>)

“ LMT + 0:09:00 STD”…?! 那是历史的偏移,不是当前的标准。

pytz不能正确处理传回的时区捆绑包(包含永远的所有历史偏移量)datetime,它选择一些随机的(可能是 第一个
可能的)偏移量,而不是与实际时间相关的偏移量。可以说,由于它需要首先正确地解释时间,因此不能从时区束中选择正确的时间偏移。

该库仅支持构建本地时间的两种方式。第一种是使用库localize()提供的方法pytz。这用于本地化天真datetimedatetime没有时区信息):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))>>> print(loc_dt.strftime(fmt))2002-10-27 06:00:00 EST-0500

建立本地化时间的第二种方法是使用标准astimezone()方法转换现有的本地化时间:

>>> ams_dt = loc_dt.astimezone(amsterdam)>>> ams_dt.strftime(fmt)''2002-10-27 12:00:00 CET+0100''

http://pytz.sourceforge.net

关于Python strptime和时区?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于datetime.datetime.strptime在Python 2.4.1中不存在、datetime.strptime()的Python时区'%z'指令不可用、PHP date()和strtotime()在31日返回错误的月份、Python astimezone()意外结果的相关知识,请在本站寻找。

本文标签: