簡體   English   中英

python time.strftime是否正確處理時區選項(對於RFC 3339)

[英]Does python time.strftime process timezone options correctly (for RFC 3339)

我正在嘗試使用time.strftime()函數從python的時間模塊中獲取與RFC3339兼容的輸出。

通過Linux的“ date”命令,我可以使用如下格式的字符串:“ date +%F_%T%:z”

$ date +%F_%T%:z
2017-06-29_16:13:29-07:00

與python time.strftime一起使用時,似乎不支持%:z。

$ python
>>> import time
>>> print time.strftime("%F %T%:z")
2017-06-29 16:16:15%:z

顯然,支持'%z',但不支持'%:z':

>>> print time.strftime("%F %T%z")
2017-05-29 16:15:35-0700

RFC3339專門將時區偏移量與嵌入式冒號一起使用。 就我而言,這將是07:00,而不是0700。

我認為,省略對“%:z”選項的支持是由於strftime()的基礎C實現不支持帶有冒號的時區偏移量格式化程序的版本。即'%:z','%:: z'等

除了編寫代碼以獲取%z輸出並將其重新格式化為%:z格式以外,是否有解決此問題的方法(例如,另一個python模塊,或者我在'time'模塊中缺少的某些選項)來解決此問題?

編輯:另一個問題( 在Python中生成RFC 3339時間戳 )給出了可用於輸出RFC3339輸出的其他模塊的解決方案。 我將使用在標題中針對問題找到的信息進行自我解答。

標題為“ python time.strftime是否正確處理時區選項(對於RFC3339)時”的問題的嚴格答案? 沒有。

Linux'date'命令支持的“%:z”是GNU擴展,不在POSIX規范或strftime的C實現中(截至撰寫本文時)。

關於變通辦法(在問題正文中要求), Python中的Generate RFC 3339 timestamp中的答案可用作替代time.strftime來輸出兼容RFC3339的軟件。

具體來說,我使用pytz模塊獲取時區信息,並使用datetime類isoformat()函數以符合RFC3339的格式進行打印(輸出的時區偏移量部分帶有冒號)。 像這樣:(在Ubuntu 14.04上的Python 2.7中)

>>> import pytz, datetime
>>> latz = pytz.timezone("America/Los_Angeles")
>>> latz
<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>
>>> dt = datetime.datetime.now(latz)
>>> dt2 = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, latz)
>>> dt2.isoformat()
'2017-07-06T11:50:07-08:00'

請注意從dt到dt2的轉換,以將微秒設置為0。這可以防止isoformat在isoformat輸出中將微秒打印為秒的小數部分(RFC3339不支持)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM