2010-07-25 208 views
39

我有一個python datetime對象,我想轉換爲UTC。我打算以RFC 2822格式輸出它,以便放入一個HTTP標頭,但我不確定這對於這個問題是否重要。我在這個網站上發現了一些關於轉換時間對象的信息,而且看起來更簡單一些,但是這次我真的很想使用日期時間對象,因爲我使用timedeltas來調整它們:如何將Python日期時間對象轉換爲UTC?

我試過這樣的:

from datetime import datetime, timedelta 

now = datetime.now() 
fiveMinutesLater = datetime.now() + timedelta(minutes=5) 
fiveMinutesLaterUtc = ??? 

沒有在時間或日期時間模塊看起來它會幫助我。看來我可以通過將日期時間對象傳遞給3或4個函數來完成它,但我想知道是否有更簡單的方法。

我寧願不使用第三方模塊,但我可能,如果這是唯一合理的選擇。

+0

與標題相關:[如何在Python中將本地時間轉換爲UTC?](http://stackoverflow.com/q/79797/4279) – jfs 2015-03-27 08:40:28

+0

string:http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python – 2015-12-05 18:30:24

回答

28
from datetime import datetime, timedelta 
datetime.utcnow() + timedelta(minutes=5) 
2

可以將email.Utils模塊中像在RFC 2822格式如下

>>> from email.Utils import formatdate 
>>> print formatdate() 
Sun, 25 Jul 2010 04:02:52 -0000 

上面是日期時間使用formatdate方法。默認情況下,它會返回UTC時間,但如果您需要本地時間,則可以調用formatdate(localtime = True)。

欲瞭解更多信息,做檢查http://docs.python.org/library/email.mime.html#module-email.util

+1

它不適用於Python 3;你可以[使用'email.utils'(小寫)代替](http://stackoverflow.com/a/29296267/4279) – jfs 2015-03-27 08:42:35

9

首先,你需要確認的日期時間是通過設置它的tzinfo成員時區知曉對象:

http://docs.python.org/library/datetime.html#datetime.tzinfo

然後,您可以使用.astimezone()功能將其轉換:

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

+1

根據文檔,我需要想出一個tzinfo類的子類來提出與一個對象,我可以傳遞給「現在」功能,使其知道我的服務器的時區。這似乎很複雜。有誰知道更簡單的方法?如果我找到一個更簡單的方法,我會在這裏發佈。 – 2010-07-26 00:26:24

+7

@ mikez302 - 看看pytz模塊。它實際上是所有常用時區的datetime.tzinfo時區定義數據庫。 – 2010-07-27 19:07:13

+0

@EliasZamaria:以'pytz' tzinfo對象的形式獲取本地時區,您可以[使用'tzlocal.get_localzone()'](http://stackoverflow.com/q/13218506/4279) – jfs 2015-03-27 09:17:39

2

我找到了一種方法把當前時間,增加timedelta反對,結果轉換爲UTC,並把它輸出在RFC 2822:

time.strftime("%a, %d-%b-%Y %H:%M:%S GMT", 
    time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds)) 

這並沒有完全回答我的問題,但我把它放在這裏,因爲它可以幫助別人在我的情況。

編輯:我想補充一點,這個技巧只適用於如果timedelta少於一天。如果你想要的東西適用於任何類型的timedelta值,你可以使用timedelta.total_seconds()(用於Python 2.7及更高版本)或86400*timedelta.days + timedelta.seconds。我實際上沒有嘗試過,所以我不能100%確定它是否可行。

+0

注意:'%b'可能與語言環境有關。 [使用email.utils.formatdate代替](http://stackoverflow.com/a/29296267/4279)。無關:如果您需要支持Python 2.6+並且不關心微秒,那麼'86400 * timedelta.days + timedelta.seconds'總能正常工作。 – jfs 2015-03-27 08:51:46

6

對於那些誰在這裏結束了尋找一種方式爲datetime對象UTC秒轉換自UNIX紀元:

import time 
import datetime 

t = datetime.datetime.now() 
utc_seconds = time.mktime(t.timetuple()) 
+4

這是不準確的,從mktime文檔:將本地時間的時間元組轉換爲自Epoch以來的秒數。 – 2012-02-10 22:35:09

+1

這不是OP詢問的問題的答案。 :( – sneak 2013-02-27 18:44:05

+0

注意:當地時間可能不明確(例如,在「回退」DST轉換期間),並且有50%的「mktime()」可能返回錯誤的值,如果本地時區已經/不同的utc偏移量在過去/未來(許多時區的做法)*和* C'mktime()'不使用tz數據庫(例如,在Windows上)將代表本地時間的樸素日期時間對象轉換爲UTC的便攜式解決方案是to [使用'tzlocal.get_localzone()'獲取本地時區爲'pytz' tzinfo對象](http://stackoverflow.com/q/13218506/4279) – jfs 2015-03-27 08:37:19

2

要轉換爲UTC從日期字符串:

from time import mktime 
from datetime import datetime 

mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M"))) 
+1

這不會起作用--- mktime使用本地時區。看到http://stackoverflow.com/questions/2956886/python-calendar-timegm-vs-time-mktime – teu 2014-10-30 19:38:34

1

解決方案太棒了Delorean lib

>>> import datetime 
>>> import delorean 
>>> dt = datetime.datetime.now() 
>>> dl = delorean.Delorean(dt, timezone='US/Pacific') 
>>> dl.shift('UTC') 
Delorean(datetime=2015-03-27 03:12:42.674591+00:00, timezone=UTC) 

>>> dl.shift('UTC').datetime 
datetime.datetime(2015, 3, 27, 3, 12, 42, 674591, tzinfo=<UTC>) 

>>> dl.shift('EST').datetime 
datetime.datetime(2015, 3, 26, 22, 12, 42, 674591, tzinfo=<StaticTzInfo 'EST'>) 

它允許不同的時區之間的datetime轉向輕鬆

+1

我不會相信它太多,因爲['delorean'的作者不瞭解'.now()'和'.now(tz)'](https://github.com/myusuf3/delorean/pull/46)。 – jfs 2015-03-27 09:10:15

0

下面是兩個Python 2和3

作品要獲得當前UTC時間在STDLIB溶液(無第三方模塊) RFC 2822格式:

>>> from email.utils import formatdate 
>>> formatdate(usegmt=True) 
'Fri, 27 Mar 2015 08:29:20 GMT' 

要獲得UTC時間爲5分鐘到未來:

#!/usr/bin/env python 
import time 
from email.utils import formatdate 

print(formatdate(time.time() + 300, usegmt=True)) # 5 minutes into the future 
# -> Fri, 27 Mar 2015 08:34:20 GMT 
相關問題