2010-07-02 10 views
35

में कंप्यूटर के यूटीसी ऑफसेट प्राप्त करना पाइथन में, आप कैसे पाते हैं कि यूटीसी समय कंप्यूटर को ऑफसेट करने के लिए सेट किया गया है?पायथन

उत्तर

24

gmtime() यूटीसी समय लौटाएगा और localtime() स्थानीय समय लौटाएगा ताकि दोनों को घटाकर आपको यूटीसी ऑफ़सेट देना चाहिए।

+0

शानदार! मुझे सरल सोचने की जरूरत है :) – Paul

+0

यह यहां कुछ सुरुचिपूर्ण सादगी है। –

+1

उन्हें घटाना 'टाइप एरर: असमर्थित ऑपरेंड प्रकार (-) के लिए -' time.struct_time 'और' time.struct_time'' देता है। आप वास्तव में क्या मतलब था? – rakslice

62

time.timezone:

import time 

print -time.timezone 

यह यूटीसी सेकंड (खाते डेलाइट सेविंग टाइम (डीएसटी में रखना) में ऑफसेट time.altzone देखने के प्रिंट:

is_dst = time.daylight and time.localtime().tm_isdst > 0 
utc_offset = - (time.altzone if is_dst else time.timezone) 

जहां ऑफसेट यूटीसी के माध्यम से परिभाषित किया गया है: "प्राप्त करने के लिए स्थानीय समय, यूटीसी समय में यूटीसी ऑफसेट जोड़ें। "

पायथन 3.3+ में tm_gmtoff attribute है यदि अंतर्निहित सी लाइब्रेरी इसका समर्थन करता है:

utc_offset = time.localtime().tm_gmtoff 

नोट: time.daylightsome edge cases में एक गलत परिणाम दे सकता है। ,

from datetime import datetime, timedelta, timezone 

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

वर्तमान यूटीसी एक तरीका है कि time.daylight मुद्दा workarounds और कहा कि काम करता है, भले ही tm_gmtoff उपलब्ध नहीं है में ऑफसेट पाने के लिए:

tm_gmtoff दिनांक द्वारा स्वचालित रूप से प्रयोग किया जाता है अगर यह अजगर पर उपलब्ध है 3.3+ @jts's suggestion स्थानीय और UTC समय substruct के लिए इस्तेमाल किया जा सकता है:

import time 
from datetime import datetime 

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

प्राप्त करने के लिए यूटीसी पिछले/भविष्य दिनांकों ऑफसेट, pytz समय-क्षेत्रों में इस्तेमाल किया जा सकता है:

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() 

यह डीएसटी संक्रमण के दौरान काम करता है, यह अतीत के लिए काम करता है/भविष्य तारीखें भले ही स्थानीय समय क्षेत्र 2010-2015 की अवधि में समय उदाहरण के लिए, यूरोप/मास्को समयक्षेत्र पर ऑफसेट विभिन्न यूटीसी था।

+1

यह अच्छा और साफ है। – Rockallite

+1

सुपर सहायक। धन्यवाद, जेएफ –

+0

ध्यान दें कि 'total_seconds()' केवल पायथन 3.2+ में उपलब्ध है। – mattst

2

मुझे पसंद है:

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

मैं जेटीएस 'जवाब की कोशिश की पहले, लेकिन यह मुझे गलत परिणाम दे दी है। मैं अब -0700 में हूं, लेकिन यह कह रहा था कि मैं -0800 में था। लेकिन मुझे कुछ रूपांतरण करना पड़ता था इससे पहले कि मैं कुछ घटा सकूं, इसलिए शायद गलत गलत से अधिक अधूरा था।

+1

''% z'' पायथन द्वारा समर्थित नहीं है (यह कुछ सिस्टम पर काम कर सकता है जहां आप संभवतः' time.localtime()। Tm_gmtoff' का उपयोग कर सकते हैं, यूटीसी ऑफ़सेट को संख्या के रूप में प्राप्त करने के लिए, स्ट्रिंग नहीं)। परिणाम ('% z'') का होना @jts के उत्तर के समान होना चाहिए। यदि आप अन्यथा सोचते हैं तो अपना कोड शामिल करें। – jfs

+0

आयात समय time0 = time.time() utc_time = time.mktime (time.gmtime (time0)) LOCAL_TIME = time.mktime (time.localtime (time0)) ऑफसेट = LOCAL_TIME - utc_time प्रिंट (ऑफसेट/(60 * 60)) देता है -8। – dstromberg

+0

1. टिप्पणियों में कोड न डालें, इसके बजाय अपना उत्तर अपडेट करें 2. mktime() का उपयोग करना गलत है, अंतर – jfs

-1

यहां कुछ पायथन 3 कोड है जो बस समय और आयात के रूप में समय के साथ है। 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

यह मेरे लिए काम करता है:

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

अंतर खोजने के लिए 'calendar.timegm()' या 'डेटाटाइम()' का उपयोग करें। गलत। नोटिस: ['time.localtime()। Tm_isdst> 0' मेरे उत्तर में एक समान कोड में] (http://stackoverflow.com/a/3168394/4279) – jfs

+0

क्षमा करें, आपकी पोस्ट इतनी लंबी है और पूर्ण है कि मैं करता हूं समझा नहीं है कि वही जवाब है। मेरी पोस्ट निश्चित रूप से एक ही समाधान का एक छोटा संस्करण है। – Alecs

+1

नहीं, कोड गलत है। 'time.daylight' यह नहीं कहता कि गर्मी का समय अभी है या नहीं। यह कहता है कि स्थानीय समय में डीएसटी हो सकती है। यही कारण है कि आपको 'time.localtime()। Tm_isdst' को कॉल करना होगा – jfs