python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp
我正在嘗試在python中生成一個(gè)RFC3339 UTC時(shí)間戳。到目前為止,我已經(jīng)能夠做到以下幾點(diǎn):
>>> d = datetime.datetime.now()
>>> print d.isoformat('T')
2011-12-18T20:46:00.392227
我的問(wèn)題是設(shè)置UTC偏移量。
根據(jù)文檔,類方法datetime.now([tz])采用可選的tz參數(shù),其中tz must be an instance of a class tzinfo subclass和datetime.tzinfo是an abstract base class for time zone information objects.參數(shù)。
這就是我迷路的地方——為什么TZINFO是一個(gè)抽象類,我應(yīng)該如何實(shí)現(xiàn)它?
(注意:在PHP中,它和timestamp = date(DATE_RFC3339);一樣簡(jiǎn)單,這就是為什么我不理解為什么python的方法如此復(fù)雜的原因…)
剛剛發(fā)現(xiàn)了類似的問(wèn)題:Python中的iso時(shí)間(iso8601)?
時(shí)區(qū)是一種痛苦,這可能就是為什么它們選擇不將它們包括在日期時(shí)間庫(kù)中的原因。
試試PYTZ,它有你要找的TZINFO:http://pytz.sourceforge.net網(wǎng)站/
您需要首先創(chuàng)建datetime對(duì)象,然后按如下方式應(yīng)用時(shí)區(qū),然后您的.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,在末尾加上一個(gè)"Z"(表示祖魯時(shí)區(qū)),將"時(shí)區(qū)"標(biāo)記為UTC。
d = datetime.datetime.utcnow() #
print d.isoformat("T") +"Z"
'2017-04-13T14:34:23.111142Z'
@Monkut-謝謝-Pytz類看起來(lái)像另一個(gè)可以工作的實(shí)現(xiàn),但是我最終使用了包含在文檔中的示例,按照Ruakh的答案。
@蒙庫(kù)特-+1你的第二個(gè)例子也是個(gè)好主意。
它不會(huì)為我返回微秒:-/
在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版本上,如果只需要一個(gè)以UTC表示當(dāng)前時(shí)間的感知日期時(shí)間對(duì)象,那么可以定義一個(gè)簡(jiǎn)單的TZINFO子類,如文檔中所示,以表示UTC時(shí)區(qū):
from datetime import datetime
utc_now = datetime.now(utc)
print(utc_now.isoformat('T'))
# -> 2015-05-19T20:32:12.610841+00:00
您還可以使用tzlocal模塊獲取表示您的本地時(shí)區(qū)的pytz時(shí)區(qū):
#!/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的最佳答案+
從技術(shù)上講,ISO 8601和RFC 3339不完全兼容……存在一些差異,例如ISO 8601允許UTC偏移部分使用減號(hào)或連字符,而RFC 3339只允許使用連字符。到目前為止,我看到的每一個(gè).isoformat()實(shí)現(xiàn)(只有兩個(gè))都與RFC3339重疊,但最好讓自己意識(shí)到這些差異
@Villapx:RFC3339是ISO 8601的簡(jiǎn)介。碰巧,datetime.isoformat()是用于時(shí)區(qū)感知日期時(shí)間的RFC3339(這就是我使用它的原因)。
@J.F.Sebastian是的,看起來(lái)你是對(duì)的……從文件中,isotime()[gives] the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM,這是RFC3339。它沒有明確地說(shuō)它將使用連字符,而不是減號(hào),但它是由示例所隱含的
雖然,isoformat()沒有考慮tzinfo對(duì)象的夏令時(shí)偏移量——當(dāng)我更改dst()返回值時(shí),isoformat()仍然返回相同的字符串。
@villapx:isoformat()返回正確的值,它只是反映datetime對(duì)象包含的內(nèi)容。也就是說(shuō),它顯示了它的.utcoffset()值。
@J.F.Sebastian是的,這就是我的意思——只是想讓潛在用戶知道isoformat()不知道DST
@維拉克斯:不,是錯(cuò)的。你誤導(dǎo)了"潛在用戶"。如果.utcoffset()沒有反映.dst()的值,那么你的datetime類就壞了。
@J.F.塞巴斯蒂安哦,哇,你說(shuō)得對(duì)。我完全被datetime.tzinfo.dst()文件誤導(dǎo)了: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.我沒有直接在上面看到,對(duì)于utcoffset()文件,上面寫著"Note that this is intended to be the total offset from UTC."。
在您鏈接到的同一個(gè)文檔中,它進(jìn)一步解釋了如何實(shí)現(xiàn)它,給出了一些示例,包括UTC類(表示UTC)的完整代碼、FixedOffset類(表示與UTC有固定偏移的時(shí)區(qū),而不是帶有dst和whatnot的時(shí)區(qū))以及其他一些示例。
@Ruakh-謝謝,我錯(cuò)過(guò)了那些例子-LocalTimezone()班的技巧。
@雅林:不客氣!
@吉恩·伍德:希望你不要介意,我已經(jīng)恢復(fù)了你的編輯。問(wèn)題是,您實(shí)現(xiàn)的內(nèi)容與OP實(shí)際需要的內(nèi)容不匹配。
@魯克沒問(wèn)題。我誤解了。這是否是解決OP問(wèn)題的代碼示例?:gist.github.com/gene1wood/11386298
為什么不在問(wèn)題中包括一個(gè)完整的示例而不是鏈接,這是stackoverflow的首選方法?@吉恩·伍德,為什么不用你的全部答案創(chuàng)造一個(gè)新的答案呢?
@Joakim當(dāng)然,這是完整的答案
我很難使用rfc339日期時(shí)間格式,但我找到了一個(gè)合適的解決方案來(lái)在兩個(gè)方向上轉(zhuǎn)換日期字符串<=>datetimeu對(duì)象。
您需要兩個(gè)不同的外部模塊,因?yàn)槠渲幸粋€(gè)模塊只能在一個(gè)方向上進(jìn)行轉(zhuǎn)換(不幸的是):
第一次安裝:
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
為了不需要記住哪個(gè)模塊是哪個(gè)方向,我編寫了兩個(gè)簡(jiǎn)單的助手函數(shù):
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
尤里卡!現(xiàn)在,您可以輕松地(哈哈)使用日期字符串和日期字符串的可用格式。
"HueCKA"。失去"H"。
pytz包可用于python 2.x和3.x。它實(shí)現(xiàn)了tzinfo的具體子類,以及其他服務(wù),因此您不必這樣做。
要添加UTC偏移量:導(dǎo)入日期時(shí)間進(jìn)口吡茲
dt = datetime.datetime(2011, 12, 18, 20, 46, 00, 392227)
utc_dt = pytz.UTC.localize(dt)
現(xiàn)在這個(gè):
print utc_dt.isoformat()
將打印:
2011-12-18T20:46:00.392227+00:00
如果您只需要UTC時(shí)區(qū),則不需要pytz模塊。定義UTC TZINFO很簡(jiǎn)單
謝謝。當(dāng)我需要stdlib解決方案時(shí),我會(huì)保存您的答案。UTC只是最短的一個(gè)例子。OP沒有特別要求。pytz知道所有時(shí)區(qū)及其DST,我覺得這很有用。
注:在我的回答中,get_localzone()返回與本地時(shí)區(qū)相對(duì)應(yīng)的時(shí)區(qū)。
我想它會(huì)返回pytz時(shí)區(qū)。自動(dòng)更正?
對(duì)。應(yīng)該是"pytz時(shí)區(qū)",而不是"puts時(shí)區(qū)"
您確實(shí)可以使用內(nèi)置的日期時(shí)間模塊。AS盧卡提到,在顯示方式的頁(yè)面。如果你看一下你會(huì)的請(qǐng)參閱一個(gè)顯示許多不同用例的長(zhǎng)示例。這是密碼您正在尋找,它將生成一個(gè)RFC3339 UTC時(shí)間戳。
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
我剛開始使用的另一個(gè)有用的實(shí)用程序:用于時(shí)區(qū)處理和日期分析的dateutil庫(kù)。推薦,包括這個(gè)答案
總結(jié)
以上是生活随笔為你收集整理的python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python done()什么意思_Py
- 下一篇: python变量运算符_Python(三