2010-07-02 18 views

cevap

24

gmtime(), UTC saatini döndürecek ve localtime() yerel saati döndürecek, böylece ikisini çıkararak, utc ofsetini vermeniz gerekir.

+0

Parlak! Basit düşünmeyi öğrenmeliyim :) – Paul

+0

Bu, burada bazı zarif sadeliktir. –

+1

Onları çıkarmak, TypeError: -: 'time.struct_time' ve 'time.struct_time' için desteklenmeyen işlenen türü/türlerini verir. Gerçekten ne demek istedin? – rakslice

62

time.timezone:

import time 

print -time.timezone 

Saniyeler (hesap Yaz Saati (DST içine almaya) 'de ofset UTC time.altzone bkz yazdırır:

ofset utc aracılığıyla tanımlanır
is_dst = time.daylight and time.localtime().tm_isdst > 0 
utc_offset = - (time.altzone if is_dst else time.timezone) 

: "gösterilmesi için Yerel saat, utc zaman için utc ofset ekleyin. "

Python 3.3 + 'da, C kütüphanesi destekliyorsa tm_gmtoff attribute var:

utc_offset = time.localtime().tm_gmtoff 

Not

: time.daylight some edge cases bir yanlış sonuç verebilir.

tm_gmtoff o 3.3+ Python geçerli olup olmadığını otomatik olarak datetime tarafından kullanılır:

from datetime import datetime, timedelta, timezone 

d = datetime.now(timezone.utc).astimezone() 
utc_offset = d.utcoffset() // timedelta(seconds=1) 

time.daylight sorunu geçici çözümler ve bu tm_gmtoff mevcut olmasa bile çalışır şekilde ofset akım UTC almak için, @jts's suggestion yerel ve UTC zamanı substruct için kullanılabilir:

import time 
from datetime import datetime 

ts = time.time() 
utc_offset = (datetime.fromtimestamp(ts) - 
       datetime.utcfromtimestamp(ts)).total_seconds() 

UTC geçmiş/gelecek tarihlerde ofset almak için pytz saat dilimleri kullanılabilir:

Bu DST geçişleri sırasında çalışır
from datetime import datetime 
from tzlocal import get_localzone # $ pip install tzlocal 

tz = get_localzone() # local timezone 
d = datetime.now(tz) # or some other local date 
utc_offset = d.utcoffset().total_seconds() 

, geçmişte için çalışıyor/gelecek yerel saat dilimi 2010-2015 döneminde zaman örneğin Avrupa/Moskova zaman dilimi de ofset farklı UTC olsaydı bile büyük.

+1

Bu güzel ve temiz. – Rockallite

+1

Çok yardımsever. Teşekkürler, J.F. –

+0

'total_seconds()' ın yalnızca Python 3.2+ sürümünde mevcut olduğunu unutmayın. – mattst

2

Sevdiğim:

>>> strftime('%z') 
'-0700' 

İlk OTS' cevabını çalıştı, ama bana yanlış sonuç verdi. Şu an -0700'üm ama, -0800'lü olduğumu söylüyordu. Ama çıkarabileceğim bir şey elde edebilmek için biraz dönüşüm yapmalıydım, bu yüzden cevap yanlıştan daha eksikti.

+1

'% z ', Python tarafından desteklenmiyor (' time.localtime(). Tm_gmtoff' yerine kullanabileceğin bazı sistemlerde çalışabilir, bunun yerine utc ofsetini bir sayı değil, string olarak alır). ('% Z'') sonucu, Jts'ın cevabı ile aynı olmalıdır. Aksini düşünüyorsanız kodunuzu ekleyin. – jfs

+0

ithalat süresi time0 = time.time() utc_time = time.mktime (time.gmtime (time0)) LOCAL_TIME = time.mktime (time.localtime (time0)) offset = LOCAL_TIME - utc_time baskı (ofset/(60 * 60)) -8. – dstromberg

+0

1. Yorumlara kod koymayın, cevabınızı 2. yerine güncelleyin. Buradaki mktime() işlevini kullanmak yanlıştır, – jfs

-1

İşte bazı python3 kodları, yalnızca tarih ve zaman olarak içe aktarılır. HTH

>>> from datetime import datetime 
>>> import time 
>>> def date2iso(thedate): 
...  strdate = thedate.strftime("%Y-%m-%dT%H:%M:%S") 
...  minute = (time.localtime().tm_gmtoff/60) % 60 
...  hour = ((time.localtime().tm_gmtoff/60) - minute)/60 
...  utcoffset = "%.2d%.2d" %(hour, minute) 
...  if utcoffset[0] != '-': 
...   utcoffset = '+' + utcoffset 
...  return strdate + utcoffset 
... 
>>> date2iso(datetime.fromtimestamp(time.time())) 
'2015-04-06T23:56:30-0400' 
-3

Bu benim için çalışıyor:

if time.daylight > 0: 
     return time.altzone 
    else: 
     return time.timezone 
+0

farkını bulmak için calendar.timegm() 'veya' datetime() 'yi kullanın. yanlış. Uyarı: ['time.localtime(). Tm_isdst> benim cevapta benzer bir kodda 0'] (http://stackoverflow.com/a/3168394/4279) – jfs

+0

Üzgünüz, yazınız çok uzun ve eksiksiz aynı cevabı olduğu anlaşılmadı. Benim yazı kesinlikle aynı çözümün daha kısa bir versiyonudur. – Alecs

+1

no, kod yanlış. time.daylight' yaz saatinin şu an olup olmadığını söylemez. Yerel saatin DST olabileceğini söylüyor. Işte bu yüzden time.localtime(). Tm_isdst' demek zorundasınız. – jfs