python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp
我正在尝试在python中生成一个RFC3339 UTC时间戳。到目前为止,我已经能够做到以下几点:
>>> d = datetime.datetime.now()
>>> print d.isoformat('T')
2011-12-18T20:46:00.392227
我的问题是设置UTC偏移量。
根据文档,类方法datetime.now([tz])采用可选的tz参数,其中tz must be an instance of a class tzinfo subclass和datetime.tzinfo是an abstract base class for time zone information objects.参数。
这就是我迷路的地方——为什么TZINFO是一个抽象类,我应该如何实现它?
(注意:在PHP中,它和timestamp = date(DATE_RFC3339);一样简单,这就是为什么我不理解为什么python的方法如此复杂的原因…)
刚刚发现了类似的问题:Python中的iso时间(iso8601)?
时区是一种痛苦,这可能就是为什么它们选择不将它们包括在日期时间库中的原因。
试试PYTZ,它有你要找的TZINFO:http://pytz.sourceforge.net网站/
您需要首先创建datetime对象,然后按如下方式应用时区,然后您的.isoformat()输出将包括所需的UTC偏移量:
d = datetime.datetime.utcnow()
d_with_timezone = d.replace(tzinfo=pytz.UTC)
d_with_timezone.isoformat()
'2017-04-13T14:34:23.111142+00:00'
或者,只需使用UTC,在末尾加上一个"Z"(表示祖鲁时区),将"时区"标记为UTC。
d = datetime.datetime.utcnow() #
print d.isoformat("T") +"Z"
'2017-04-13T14:34:23.111142Z'
@Monkut-谢谢-Pytz类看起来像另一个可以工作的实现,但是我最终使用了包含在文档中的示例,按照Ruakh的答案。
@蒙库特-+1你的第二个例子也是个好主意。
它不会为我返回微秒:-/
在Python 3.3 +中:
>>> from datetime import datetime, timezone
>>> local_time = datetime.now(timezone.utc).astimezone()
>>> local_time.isoformat()
'2015-01-16T16:52:58.547366+01:00'
在旧的python版本上,如果只需要一个以UTC表示当前时间的感知日期时间对象,那么可以定义一个简单的TZINFO子类,如文档中所示,以表示UTC时区:
from datetime import datetime
utc_now = datetime.now(utc)
print(utc_now.isoformat('T'))
# -> 2015-05-19T20:32:12.610841+00:00
您还可以使用tzlocal模块获取表示您的本地时区的pytz时区:
#!/usr/bin/env python
from datetime import datetime
from tzlocal import get_localzone # $ pip install tzlocal
now = datetime.now(get_localzone())
print(now.isoformat('T'))
它可以在python 2和3上工作。
手放低,python 3.3的最佳答案+
从技术上讲,ISO 8601和RFC 3339不完全兼容……存在一些差异,例如ISO 8601允许UTC偏移部分使用减号或连字符,而RFC 3339只允许使用连字符。到目前为止,我看到的每一个.isoformat()实现(只有两个)都与RFC3339重叠,但最好让自己意识到这些差异
@Villapx:RFC3339是ISO 8601的简介。碰巧,datetime.isoformat()是用于时区感知日期时间的RFC3339(这就是我使用它的原因)。
@J.F.Sebastian是的,看起来你是对的……从文件中,isotime()[gives] the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM,这是RFC3339。它没有明确地说它将使用连字符,而不是减号,但它是由示例所隐含的
虽然,isoformat()没有考虑tzinfo对象的夏令时偏移量——当我更改dst()返回值时,isoformat()仍然返回相同的字符串。
@villapx:isoformat()返回正确的值,它只是反映datetime对象包含的内容。也就是说,它显示了它的.utcoffset()值。
@J.F.Sebastian是的,这就是我的意思——只是想让潜在用户知道isoformat()不知道DST
@维拉克斯:不,是错的。你误导了"潜在用户"。如果.utcoffset()没有反映.dst()的值,那么你的datetime类就坏了。
@J.F.塞巴斯蒂安哦,哇,你说得对。我完全被datetime.tzinfo.dst()文件误导了:Note that DST offset, if applicable, has already been added to the UTC offset returned by utcoffset(), so there’s no need to consult dst() unless you’re interested in obtaining DST info separately.我没有直接在上面看到,对于utcoffset()文件,上面写着"Note that this is intended to be the total offset from UTC."。
在您链接到的同一个文档中,它进一步解释了如何实现它,给出了一些示例,包括UTC类(表示UTC)的完整代码、FixedOffset类(表示与UTC有固定偏移的时区,而不是带有dst和whatnot的时区)以及其他一些示例。
@Ruakh-谢谢,我错过了那些例子-LocalTimezone()班的技巧。
@雅林:不客气!
@吉恩·伍德:希望你不要介意,我已经恢复了你的编辑。问题是,您实现的内容与OP实际需要的内容不匹配。
@鲁克没问题。我误解了。这是否是解决OP问题的代码示例?:gist.github.com/gene1wood/11386298
为什么不在问题中包括一个完整的示例而不是链接,这是stackoverflow的首选方法?@吉恩·伍德,为什么不用你的全部答案创造一个新的答案呢?
@Joakim当然,这是完整的答案
我很难使用rfc339日期时间格式,但我找到了一个合适的解决方案来在两个方向上转换日期字符串<=>datetimeu对象。
您需要两个不同的外部模块,因为其中一个模块只能在一个方向上进行转换(不幸的是):
第一次安装:
sudo pip install rfc3339
sudo pip install iso8601
然后包括:
import datetime # for general datetime object handling
import rfc3339 # for date object -> date string
import iso8601 # for date string -> date object
为了不需要记住哪个模块是哪个方向,我编写了两个简单的助手函数:
def get_date_object(date_string):
return iso8601.parse_date(date_string)
def get_date_string(date_object):
return rfc3339.rfc3339(date_object)
在代码中,您可以这样轻松地使用:
input_string = '1989-01-01T00:18:07-05:00'
test_date = get_date_object(input_string)
# >>> datetime.datetime(1989, 1, 1, 0, 18, 7, tzinfo=)
test_string = get_date_string(test_date)
# >>> '1989-01-01T00:18:07-05:00'
test_string is input_string # >>> True
尤里卡!现在,您可以轻松地(哈哈)使用日期字符串和日期字符串的可用格式。
"HueCKA"。失去"H"。
pytz包可用于python 2.x和3.x。它实现了tzinfo的具体子类,以及其他服务,因此您不必这样做。
要添加UTC偏移量:导入日期时间进口吡兹
dt = datetime.datetime(2011, 12, 18, 20, 46, 00, 392227)
utc_dt = pytz.UTC.localize(dt)
现在这个:
print utc_dt.isoformat()
将打印:
2011-12-18T20:46:00.392227+00:00
如果您只需要UTC时区,则不需要pytz模块。定义UTC TZINFO很简单
谢谢。当我需要stdlib解决方案时,我会保存您的答案。UTC只是最短的一个例子。OP没有特别要求。pytz知道所有时区及其DST,我觉得这很有用。
注:在我的回答中,get_localzone()返回与本地时区相对应的时区。
我想它会返回pytz时区。自动更正?
对。应该是"pytz时区",而不是"puts时区"
您确实可以使用内置的日期时间模块。AS卢卡提到,在显示方式的页面。如果你看一下你会的请参阅一个显示许多不同用例的长示例。这是密码您正在寻找,它将生成一个RFC3339 UTC时间戳。
from datetime import tzinfo, timedelta, datetime
import time as _time
ZERO = timedelta(0)
STDOFFSET = timedelta(seconds=-_time.timezone)
if _time.daylight:
DSTOFFSET = timedelta(seconds=-_time.altzone)
else:
DSTOFFSET = STDOFFSET
DSTDIFF = DSTOFFSET - STDOFFSET
class LocalTimezone(tzinfo):
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
def dst(self, dt):
if self._isdst(dt):
return DSTDIFF
else:
return ZERO
def tzname(self, dt):
return _time.tzname[self._isdst(dt)]
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, 0)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
Local = LocalTimezone()
d = datetime.now(Local)
print d.isoformat('T')
# which returns
# 2014-04-28T15:44:45.758506-07:00
我刚开始使用的另一个有用的实用程序:用于时区处理和日期分析的dateutil库。推荐,包括这个答案
总结
以上是生活随笔为你收集整理的python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python done()什么意思_Py
- 下一篇: python变量运算符_Python(三