2012-09-25 13 views
9

मेरे पास एक जावास्क्रिप्ट कैलेंडर है जो मुझे एक unixtimestamp भेज रहा है। मैं सिंगापुर में हूँ मैं इस टाइमस्टैम्प को सिंगापुर टाइमस्टैम्प के रूप में व्याख्या करना चाहता हूं और फिर डीबी के साथ तुलना के लिए यूटीसी में परिवर्तित करना चाहता हूं।टाइमज़ोन के साथ django में डेटाटाइम के लिए यूनिक्स टाइमस्टैम्प

मैं अपने जीवन के लिए नहीं कर सकता, यह पता लगाने के लिए कि इस समय टिकट वर्तमान समय क्षेत्र, सिंगापुर से है।

जब मैं टाइमस्टैम्प का एक प्रिंट बयान करते हैं, यह समय (जिसका अर्थ है कि Django यूटीसी में मैं इनपुट समय सोचता है और सिंगापुर के संदर्भ के लिए यह स्थानीयकृत है) कई अन्य बातों के अलावा

को 8 घंटे कहते हैं , मैंने कोशिश की: start=datetime.datetime.fromtimestamp(int(start_date)).replace(tzinfo=get_current_timezone())

प्रारंभ_तिथि १३२५३७६०००

(जो 2012-01-01 00:00:00 करने के लिए अनुवाद) बहरहाल, जब मैं इस के उत्पादन में मुद्रित मैं 2012-01-01 08 मिलता है : 00: 00 + 06: 55। मैं यह भी नहीं जानता कि सिंगापुर +08: 00 कब से +06: 55 आ रहा है। मैं बहुत खो गया हूँ।

आपकी मदद के लिए धन्यवाद।

settings.py:

TIME_ZONE = 'Asia/Singapore'

USE_TZ = True

+0

पॉज़िक्स टाइमस्टैम्प '1325376000'' 2012-01-01 00:00:00 यूटीसी +0000'' और '2012-01-01 08:00:00 एसजीटी + 0800''' है। सिंगापुर में आपको ऐसा क्यों लगता है कि यह 00: 00: 00' होना चाहिए? – jfs

उत्तर

13

मान लिया जाये कि आप pytz स्थापित मिल गया है:

from datetime import datetime 
import pytz 
local_tz = pytz.timezone("Asia/Singapore") 
utc_dt = datetime.utcfromtimestamp(timestamp).replace(tzinfo=pytz.utc) 
local_dt = local_tz.normalize(utc_dt.astimezone(local_tz)) 

उदाहरण के लिए:

>>> from datetime import datetime 
>>> import pytz 
>>> local_tz = pytz.timezone("Asia/Singapore") 
>>> utc_dt = datetime.utcfromtimestamp(1325376000).replace(tzinfo=pytz.utc) 
>>> utc_dt 
datetime.datetime(2012, 1, 1, 0, 0, tzinfo=<UTC>) 
>>> local_dt = local_tz.normalize(utc_dt.astimezone(local_tz)) 
>>> local_dt 
datetime.datetime(2012, 1, 1, 8, 0, tzinfo=<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>) 
>>> local_dt.replace(tzinfo=None) 
datetime.datetime(2012, 1, 1, 8, 0) 
+0

धन्यवाद! अच्छी तरह से काम। – nknj

+0

मेरे उत्तर का कौन सा हिस्सा सर्वर के टाइमज़ोन पर निर्भर करता है? साथ ही, 'pytz' 'tz.localize (dt)' समान है (इस मामले में) 'tz.normalize (dt.replace (tzinfo = pytz.utc) .astimezone (tz))': http: // pytz.sourceforge.net/#localized- टाइम्स-and-date-arithmetic –

+2

FFUUU! आह, धन्यवाद! आप सही हे। मैं बेवकूफ़ हूँ। मेरा जवाब वास्तविक, सही उत्तर देने के लिए अद्यतन किया गया है। –

4

fromtimestamp() विधि करने के लिए वस्तु tzinfo pytz दर्रा:

#!/usr/bin/env python 
from datetime import datetime 
import pytz # $ pip install pytz 

tz = pytz.timezone("Asia/Singapore") 
print(datetime.fromtimestamp(1325376000, tz)) 
# -> 2012-01-01 08:00:00+08:00 

नोट: परिणाम वस्तु समय क्षेत्र अवगत है: आप के साथ अन्य जागरूक datetime वस्तुओं यानी यह तुलना कर सकते हैं, तो आप इसे यूटीसी में बदलने की जरूरत नहीं है तुलना के लिए - आप इसका उपयोग कर सकते हैं।

मुझे यह भी पता नहीं है कि सिंगापुर +08: 00 कब से +06: 55 आ रहा है।

अमान्य .replace() कॉल के कारण आप +06:55 देखते हैं। get_current_timezone()pytz.timezone("Asia/Singapore") देता है जिसमें एक परिवर्तनीय यूटीसी ऑफ़सेट होता है (इसमें अलग-अलग तिथियों पर एक अलग यूटीसी ऑफ़सेट हो सकता है)। जब आप .replace() कुछ यादृच्छिक (कार्यान्वयन पर निर्भर करता है) को कॉल करते हैं तो tzinfo ऑब्जेक्ट का उपयोग किया जाता है। मुद्दा यह है कि इनपुट तिथि के लिए सही tzinfo चुनने के लिए .replace() विधि pytz.timezone("Asia/Singapore") की अनुमति नहीं देती है।

>>> list(tz._tzinfos.values()) 
[<DstTzInfo 'Asia/Singapore' MALT+7:00:00 STD>, 
<DstTzInfo 'Asia/Singapore' MALT+7:20:00 STD>, 
<DstTzInfo 'Asia/Singapore' JST+9:00:00 STD>, 
<DstTzInfo 'Asia/Singapore' SMT+6:55:00 STD>, 
<DstTzInfo 'Asia/Singapore' SGT+7:30:00 STD>, 
<DstTzInfo 'Asia/Singapore' MALT+7:30:00 STD>, 
<DstTzInfo 'Asia/Singapore' MALST+7:20:00 DST>, 
<DstTzInfo 'Asia/Singapore' LMT+6:55:00 STD>, 
<DstTzInfo 'Asia/Singapore' SGT+8:00:00 STD>] 

अर्थात, +06:55 और +0800 दोनों (अलग तारीखों पर) सिंगापुर के लिए मान्य हैं। यही कारण है कि आपको .replace() का उपयोग केवल उन समय क्षेत्रों के साथ करना चाहिए जिनके पास निरंतर यूटीसी ऑफसेट है जैसे यूटीसी टाइमज़ोन स्वयं (ऑफसेट शून्य है, हमेशा किसी भी तारीख के लिए)।

fromtimestamp(,tz) विधि tz.fromutc() आंतरिक रूप से कॉल करता है जो किसी दिए गए यूटीसी समय के लिए सही ऑफ़सेट चुनने के लिए tz को अनुमति देता है।

संबंधित मुद्दे