UTC में स्थानीय समय स्ट्रिंग कैसे बदलें?


307

कैसे मैं एक datetime परिवर्तित स्थानीय समय में स्ट्रिंग एक को UTC समय में स्ट्रिंग ?

मुझे यकीन है कि मैंने पहले भी ऐसा किया है, लेकिन यह नहीं मिल सकता है और एसओ भविष्य में मुझे (और अन्य) ऐसा करने में उम्मीद करेंगे।

स्पष्टीकरण : उदाहरण के लिए, यदि 2008-09-17 14:02:00मेरे स्थानीय समयक्षेत्र ( +10) में है, तो मैं समतुल्य UTCसमय के साथ एक स्ट्रिंग उत्पन्न करना चाहूंगा 2008-09-17 04:02:00:।

इसके अलावा, http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ से , ध्यान दें कि सामान्य रूप से यह डीएसटी और अन्य मुद्दों के साथ संभव नहीं है क्योंकि स्थानीय समय से कोई अद्वितीय रूपांतरण नहीं है UTC समय।


1
कृपया अवगत रहें mktime () विधि इनपुट के रूप में एक "स्थानीय समय" लें जो कि आप से अपेक्षित नहीं हो सकता है, मैंने इसका इस्तेमाल किया और इसने सब कुछ गड़बड़ कर दिया। कृपया इस लिंक
हैफेंग झांग

जवाबों:


287

सबसे पहले, स्ट्रिंग को एक भोली डेटाइम ऑब्जेक्ट में पार्स करें। यह एक उदाहरण है datetime.datetimeजिसमें कोई संलग्न समयक्षेत्र जानकारी नहीं है। के लिए प्रलेखन देखेंdatetime.strptimeदिनांक स्ट्रिंग को पार्स करने की जानकारी लिए ।

pytzमॉड्यूल का उपयोग करें , जो समय क्षेत्र + यूटीसी की पूरी सूची के साथ आता है। स्थानीय टाइमज़ोन क्या है, इसके बारे में एक टाइमज़ोन ऑब्जेक्ट का निर्माण करें, और इसे जोड़-तोड़ और भोले डेटाइम से जोड़ दें।

अंत में, datetime.astimezone()यूटीसी को डेटाइम बदलने के लिए विधि का उपयोग करें ।

स्रोत कोड, "2001-2-3 10:11:12" स्ट्रिंग के लिए स्थानीय समय-क्षेत्र "अमेरिका / लॉस_अंगेल्स" का उपयोग कर रहा है:

import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

वहां से, आप strftime()आवश्यकतानुसार यूटीसी डेटाइम को प्रारूपित करने के लिए विधि का उपयोग कर सकते हैं :

utc_dt.strftime ("%Y-%m-%d %H:%M:%S")

7
कृपया निम्नलिखित कोड के साथ अपने उत्तर को संपादित करें: [कोड] local.localize (भोले) [/ कोड] दस्तावेज़ देखें: लिंक दुर्भाग्य से मानक डेटाइम कंस्ट्रक्टर्स के tzinfo तर्क का उपयोग करते हुए कई टाइमज़ोन के साथ pytz के साथ '' काम नहीं करता ''। >>> डेटाइम (2002, 10, 27, 12, 0, 0, tzinfo = am Amsterdam) .strftime (fmt) '2002-10-27 12:00:00 AMT + 0020'
सैम स्टेलिंगा

2
जाहिरा तौर पर कदम "स्थानीय समयक्षेत्र क्या है" यह पता लगाने की तुलना में कठिन लगता है (व्यावहारिक रूप से असंभव)।
जेसन आर। कोम्ब्स

2
@SamStoelinga द्वारा सुझाए गए रूप में local.localize का उपयोग करें, अन्यथा आप दिन के उजाले की बचत के समय को ध्यान में नहीं रखेंगे।
एमिल स्टेनस्ट्रॉम

यह जवाब मेरे लिए बहुत मददगार रहा है, लेकिन मैं अपने सामने आई एक कमी को इंगित करना चाहूंगा। यदि आप समय प्रदान करते हैं, लेकिन तारीख नहीं, तो आपको अप्रत्याशित परिणाम मिल सकते हैं। इसलिए सुनिश्चित करें कि आप एक पूर्ण टाइमस्टैम्प प्रदान करते हैं।
स्टीवन मर्कटांटे


144

वर्तमान UTC समय प्राप्त करने के लिए डेटाटाइम मॉड्यूल के utcnow () फ़ंक्शन का उपयोग किया जा सकता है।

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

जैसा कि टॉम द्वारा ऊपर उल्लिखित लिंक: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ कहता है:

यूटीसी डेलाइट सेविंग टाइम के बिना एक समयक्षेत्र है और अभी भी अतीत में कॉन्फ़िगरेशन परिवर्तन के बिना एक समय क्षेत्र है।

हमेशा यूटीसी में समय को मापें और स्टोर करें

यदि आपको यह रिकॉर्ड करने की आवश्यकता है कि समय कहां लिया गया था, तो उसे अलग से स्टोर करें। स्थानीय समय + समयक्षेत्र की जानकारी संग्रहीत करें!

नोट - यदि आपका कोई डेटा डीएसटी का उपयोग करने वाले क्षेत्र में है, तो उपयोग करेंpytz जॉन मिलिकिन के उत्तर का और उसका ।

यदि आप किसी दिए गए स्ट्रिंग से UTC समय प्राप्त करना चाहते हैं और दुनिया में एक ऐसे क्षेत्र में होना चाहते हैं जो या तो डीएसटी का उपयोग नहीं करता है, या आपके पास डेटा है जो केवल यूटीसी से डीएसटी लागू किए बिना ऑफसेट है:

-> ऑफसेट मूल्य के आधार के रूप में स्थानीय समय का उपयोग करना:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

-> या, एक ज्ञात ऑफसेट से, datetime.timedelta () का उपयोग कर:

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

अपडेट करें:

चूंकि अजगर 3.2 datetime.timezoneउपलब्ध है। आप नीचे दिए गए आदेश के साथ टाइमजोन जागरूक डेटाटाइम ऑब्जेक्ट उत्पन्न कर सकते हैं:

import datetime

timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)

यदि आपका समय-समय पर रूपांतरण लेने के लिए तैयार है, तो इसे पढ़ें:

https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7


14
यह केवल वर्तमान समय को परिवर्तित करता है, मुझे किसी भी समय (स्ट्रिंग के रूप में) और UTC में परिवर्तित होने की आवश्यकता है।
टॉम

मुझे नहीं लगता कि यह आपके लिए मानक ऑफसेट मूल्यों का उपयोग करते हुए यहां मायने रखता है। local_time = utc_time + utc_offset और utc_time = local_time - utc_offset।
मोनकूट

5
यह केवल वर्तमान समय के साथ काम करता है क्योंकि DST के कारण पिछले और भविष्य के टाइमस्टैम्प में अलग-अलग UTC ऑफसेट हो सकते हैं।
एलेक्स बी

अच्छी बात है ... अगर आपको डीएसटी से निपटना है तो आपको संभवतः जॉन मिलिकिन द्वारा बताए गए पाइत्ज़ का उपयोग करना चाहिए।
मोनकुट

1
कॉल करने के लिए (और) और अब () के बीच एक छिटपुट डेल्टा है। यह एक खतरनाक कोड लाइन है जो बाद में tzinfo.utcoffset() must return a whole number of minutesऔर इसी तरह की अजीब त्रुटियों को जन्म दे सकती है ।
पावेल वलसोव

62

धन्यवाद @ स्पष्ट रूप से, स्ट्रिंग से स्ट्रिंग में पूर्ण रूपांतरण इस प्रकार है:

time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

time/ calendarकार्यों का मेरा सारांश :

time.strptime
स्ट्रिंग -> टपल (कोई टाइमज़ोन लागू नहीं होता है, इसलिए स्ट्रिंग से मेल खाता है)

time.mktime
स्थानीय समय टुपल -> सेकंड के बाद से युग (हमेशा स्थानीय समय)

time.gmtime
युग के बाद से सेकंड - यूटीसी में टपल

तथा

calendar.timegm
यूटीसी में ट्यूपल - सेकंड के बाद से सेकंड

time.localtime
युग के बाद से सेकंड -> स्थानीय समय क्षेत्र में तुगलकी


4
(always local time)गलत प्रतीत होता है: mktime () के लिए इनपुट स्थानीय समय है, आउटपुट सेकंड के बाद से है ( 1970-01-01 00:00:00 +0000 (UTC)जो कि समयक्षेत्र पर निर्भर नहीं करता है)।
jfs

3
इसके अलावा 50% संभावना है कि यह डीएसटी संक्रमण के दौरान विफल रहता है। देखें LOCALTIME के साथ कोई समस्या
JFS

38

यहां सामान्य पायथन समय रूपांतरणों का सारांश दिया गया है।

कुछ तरीकों सेकंड के भिन्न छोड़ देते हैं और साथ चिह्नित हैं (रों)ts = (d - epoch) / unitइसके बजाय एक स्पष्ट सूत्र का उपयोग किया जा सकता है (धन्यवाद jfs)।

  • संरचना_ समय (UTC) → POSIX (s) :
    calendar.timegm(struct_time)
  • Na (ve डेटाटाइम (स्थानीय) → POSIX (s) :
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (DST परिवर्तन के दौरान अपवाद, jfs से टिप्पणी देखें)
  • Nave डेटाटाइम (UTC) → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • अवेयर डेटाइम → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • POSIX → struct_time (UTC, s ):
    time.gmtime(t)
    (jfs से टिप्पणी देखें)
  • Nave डेटाटाइम (स्थानीय) → struct_time (UTC, s ):
    stz.localize(dt, is_dst=None).utctimetuple()
    (डीएसटी बदलाव के दौरान अपवाद, टिप्पणी के बारे में देखें)
  • Nave डेटाटाइम (UTC) → struct_time (UTC, s ):
    dt.utctimetuple()
  • अवेयर डेटाइम → स्ट्रक्चर_टाइम (यूटीसी, एस ):
    dt.utctimetuple()
  • POSIX → NaOSve डेटाटाइम (स्थानीय):
    datetime.fromtimestamp(t, None)
    Naetimeve डेटाटाइम (कुछ स्थितियों में विफल हो सकता है, नीचे दिए गए jfs से टिप्पणी देखें)
  • संरचना_टाइम (UTC) → Naïve डेटाटाइम (स्थानीय, s ):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (लीप सेकंड का प्रतिनिधित्व नहीं कर सकता, jfs से टिप्पणी देखें)
  • Nave डेटाटाइम (UTC) → Naïve डेटाटाइम (स्थानीय):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • अवेयर डेटाइम → नाओवे डेटाइम (स्थानीय):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → NaOSve डेटाटाइम (UTC):
    datetime.utcfromtimestamp(t)
  • स्ट्रक्चर_टाइम (UTC) → Naïve डेटाटाइम (UTC, s ):
    datetime.datetime(*struct_time[:6])
    (लीप सेकंड का प्रतिनिधित्व नहीं कर सकता, jee से टिप्पणी देखें)

  • stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    Nave डेटाटाइम (स्थानीय) → Naïve डेटाटाइम (UTC): (DST ट्रांज़िशन के दौरान अपवाद, कमेंट देखें)
  • अवेयर डेटाइम → नाओवे डेटाइम (UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → अवेयर डेटाइम:
    datetime.fromtimestamp(t, tz)
    डेटाइम (नॉन-पाइट्स टाइमज़ोन के लिए विफल हो सकता है)
  • struct_time (यूटीसी) → वाकिफ datetime (रों) :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (छलांग सेकंड का प्रतिनिधित्व नहीं कर सकते, JFS से टिप्पणी देखें)
  • Nave डेटाटाइम (स्थानीय) → अवेयर डेटाइम:
    stz.localize(dt, is_dst=None)
    Naetimeve डेटाटाइम डेटाइम (DST ट्रांज़िशन के दौरान अपवाद, jfs से टिप्पणी देखें)
  • Nave डेटाटाइम (UTC) → अवेयर डेटाइम:
    dt.replace(tzinfo=UTC)

स्रोत: taaviburns.ca


1
(1) fromtimestamp(t, None)विफल हो सकता है अगर स्थानीय टाइमज़ोन में अलग-अलग utc ऑफसेट थे t और C लाइब्रेरी में दिए गए प्लेटफ़ॉर्म पर tz डेटाबेस तक कोई पहुँच नहीं है। आप tzlocal.get_localzone()एक पोर्टेबल तरीके से tzdata प्रदान करने के लिए उपयोग कर सकते हैं । (2) fromtimestamp(t, tz)नॉन-पाइट्ज़ टाइमज़ोन के लिए विफल हो सकता है। (३) datetime(*struct_time[:6])आप गायब हैं *। (4) timegm(), utctimetuple(), struct_timeआधारित समाधान छोड़ एक दूसरे के भिन्न। आप एक स्पष्ट सूत्र का उपयोग कर सकते हैं जैसे: ts = (d - epoch) / unitइसके बजाय।
jfs

1
(5) stz.localize(dt, is_dst=None)अस्पष्ट या गैर-मौजूद स्थानीय समय के लिए एक अपवाद को उठाता है, उदाहरण के लिए, डीएसटी संक्रमण के दौरान। अपवाद से बचने के लिए, stz.normalize(stz.localize(dt))वह उपयोग करें जो परिणामों को प्रभावित कर सकता है। (6) डेटाटाइम () एक छलांग दूसरे का प्रतिनिधित्व नहीं कर सकता। पहले एक वर्कअराउंड के रूप में "सेकंड के बाद से युग" में बदलें struct_time(7) time.gmtime(t)इसके विपरीत calendar.timegm()गैर-पोसिक्स इनपुट की उम्मीद कर सकते हैं यदि "सही" टाइमज़ोन का उपयोग किया जाता है। स्पष्ट सूत्र का उपयोग करता है, तो इनपुट POSIX बजाय है:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
JFS

काश, यह एक तालिका में होता, पढ़ने में आसान (यह लिंक में है)
माइकलक्रिको

1
@MichaelChirico, इस उत्तर में कहा गया है कि "हम (और नहीं करेंगे) <table>टैग की अनुमति देते हैं । क्षमा करें। यह जानबूझकर और डिजाइन द्वारा है। यदि आपको एक त्वरित और गंदे" तालिका "की आवश्यकता है, तो <pre>ASCII लेआउट का उपयोग करें ।" मुझे विश्वास नहीं है कि ऊपर दी गई सूची की तुलना में ASCII तालिका अधिक पठनीय होगी।
एकाइहोला

यह दुर्भाग्यपूर्ण है। आपके पास मेरा उत्थान वैसे भी है ... हो सकता है कि आपके उत्तर के लिंक में तालिका हो?
माइकलचिरिको

25
def local_to_utc(t):
    secs = time.mktime(t)
    return time.gmtime(secs)

def utc_to_local(t):
    secs = calendar.timegm(t)
    return time.localtime(secs)

स्रोत: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

उदाहरण bd808 से उपयोग : यदि आपका स्रोत एक datetime.datetimeवस्तु है t, तो इस रूप में कॉल करें:

local_to_utc(t.timetuple())

5
यदि आपका स्रोत tडेटाटाइम लाइफटाइम है, तो कॉल करें: local_to_utc (t.timetuple ())
bd808

2
.timetuple()सेट फोन tm_isdstकरने के लिए -1; mktime()डीएसटी संक्रमण के दौरान 50% संभावना विफल रहती है।
jfs

1
चक द्वारा समाधान मिलीसेकंड जानकारी खो देता है।
लुका

21

मुझे खजूर के साथ सौभाग्य मिला है (जो अन्य संबंधित प्रश्नों के लिए SO पर व्यापक रूप से अनुशंसित है):

from datetime import *
from dateutil import *
from dateutil.tz import *

# METHOD 1: Hardcode zones:
utc_zone = tz.gettz('UTC')
local_zone = tz.gettz('America/Chicago')
# METHOD 2: Auto-detect zones:
utc_zone = tz.tzutc()
local_zone = tz.tzlocal()

# Convert time string to datetime
local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')

# Tell the datetime object that it's in local time zone since 
# datetime objects are 'naive' by default
local_time = local_time.replace(tzinfo=local_zone)
# Convert time to UTC
utc_time = local_time.astimezone(utc_zone)
# Generate UTC time string
utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')

(इस उत्तर से कोड प्राप्त किया गया था यूटीसी डेटाटाइम स्ट्रिंग को स्थानीय डेटाटाइम में परिवर्तित )


dateutilपिछली तिथियों के लिए विफल हो सकता है यदि स्थानीय टाइमज़ोन में अलग-अलग utc ऑफ़सेट थे (सिस्टम से डीएसटी संक्रमणों के लिए असंबंधित) जहां कार्यान्वयन एक ऐतिहासिक टाइमज़ोन डेटाबेस (विशेष रूप से विंडोज) का उपयोग नहीं करता है। इसके बजाय pytz+ tzlocalका उपयोग किया जा सकता है।
jfs

@ JFSebastian- के बारे में नहीं सुना था- हम और जानकारी कहाँ से प्राप्त कर सकते हैं?
यारिन

विंडोज मशीन ले लो, किसी भी समय क्षेत्र को सेट करें, जिसमें पिछले उदाहरणों में अलग-अलग utc ऑफसेट थे जैसे, यूरोप / मॉस्को। Pytz के साथ परिणामों की तुलना करें । इसके अलावा, आप इस बग का परीक्षण कर सकते हैं जो उबंटू पर भी विफल रहता है, हालांकि मैं इस मामले में सही एपीआई उपयोग के बारे में निश्चित नहीं हूं।
jfs

आउटपुट क्या है? कृपया आउटपुट पोस्ट करें।
नॉटआउट 2

18

पाइत्ज़ के साथ एक और उदाहरण, लेकिन इसमें स्थानीयकरण () भी शामिल है, जिसने मेरा दिन बचाया।

import pytz, datetime
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
amsterdam = pytz.timezone('Europe/Amsterdam')

dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
am_dt = amsterdam.localize(dt)
print am_dt.astimezone(utc).strftime(fmt)
'2012-04-06 08:00:00'


7
import time

import datetime

def Local2UTC(LocalTime):

    EpochSecond = time.mktime(LocalTime.timetuple())
    utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)

    return utcTime

>>> LocalTime = datetime.datetime.now()

>>> UTCTime = Local2UTC(LocalTime)

>>> LocalTime.ctime()

'Thu Feb  3 22:33:46 2011'

>>> UTCTime.ctime()

'Fri Feb  4 05:33:46 2011'

mktime(dt.timetuple())डीएसटी संक्रमण के दौरान विफल हो सकता है । नहीं है LocalTimezoneडॉक्स (यह सबसे हाल ही में समय क्षेत्र परिभाषा के लिए काम करता है लेकिन (डीएसटी के लिए अतीत दिनांकों असफल हो सकता है असंबंधित)) में
JFS

5

यदि आप डेटाटाइम पसंद करते हैं:

dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
print dt.strftime("%Y-%m-%d %H:%M:%S")

1
ज़रूर, लेकिन मैं यह नहीं देख सकता कि आप ऐसा क्यों पसंद करेंगे। इसके लिए मेरे संस्करण की तुलना में एक अतिरिक्त आयात और 3 और फ़ंक्शन कॉल की आवश्यकता है ...
टॉम

% Z और% z अभी भी सफेद स्थानों को प्रिंट करते हैं।
पावेल वेलसोव

2
यह गलत है। यदि स्थानीय समयक्षेत्र UTC नहीं है तो यह विफल हो जाता है। mktime()इनपुट के रूप में स्थानीय समय की अपेक्षा करता है। fromtimestamp()स्थानीय समय देता है, utc नहीं। यदि आप इसे ठीक कर लेते हैं तो इन अतिरिक्त मुद्दों कोdateutil
jfs

5

सरल

मैंने इसे इस तरह किया:

>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996

फैंसी कार्यान्वयन

यदि आप फैंसी प्राप्त करना चाहते हैं, तो आप इसे एक फ़नकार में बदल सकते हैं:

class to_utc():
    utc_delta = datetime.utcnow() - datetime.now()

    def __call__(cls, t):
        return t + cls.utc_delta

परिणाम:

>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996

5
यह डेलाइट सेविंग टाइम के लिए काम नहीं करता है - उदाहरण के लिए अगर यह वर्तमान में गर्मियों में है और जिस तारीख को आप परिवर्तित कर रहे हैं वह सर्दियों में है। और प्रश्न तार के रूप में संग्रहीत तिथियों को परिवर्तित करने के बारे में था ...
टॉम

1
FYI करें। इस विधि के साथ सबसे बड़ी समस्या (दिन के उजाले की बचत के अलावा) कुछ मिलीसेकंड है जिससे डेल्टा बंद हो जाएगा। मेरे सभी कैलेंडर आमंत्रण 1 मिनट के अनुसार दिखाई दे रहे हैं।
Nostalg.io


3

कैसा रहेगा -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

यदि सेकंड है, Noneतो यह स्थानीय समय को यूटीसी समय में परिवर्तित करता है, अन्यथा पारित समय को यूटीसी में परिवर्तित करता है।


2

दिन-ब-दिन बचत, आदि के लिए।

उपरोक्त उत्तर में से किसी ने भी विशेष रूप से मेरी मदद नहीं की। नीचे दिया गया कोड GMT के लिए काम करता है।

def get_utc_from_local(date_time, local_tz=None):
    assert date_time.__class__.__name__ == 'datetime'
    if local_tz is None:
        local_tz = pytz.timezone(settings.TIME_ZONE) # Django eg, "Europe/London"
    local_time = local_tz.normalize(local_tz.localize(date_time))
    return local_time.astimezone(pytz.utc)

import pytz
from datetime import datetime

summer_11_am = datetime(2011, 7, 1, 11)
get_utc_from_local(summer_11_am)
>>>datetime.datetime(2011, 7, 1, 10, 0, tzinfo=<UTC>)

winter_11_am = datetime(2011, 11, 11, 11)
get_utc_from_local(winter_11_am)
>>>datetime.datetime(2011, 11, 11, 11, 0, tzinfo=<UTC>)

2

Http://crsmithdev.com/arrow/ का उपयोग करना

arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')

arrowObj.to('UTC') or arrowObj.to('local') 

यह पुस्तकालय जीवन को आसान बनाता है :)


तीर भयानक है: arrow.get (datetime.now (), 'लोकल')। to ('utc')। भोला
स्टीव जेएन

1

मुझे यहां एक और सवाल पर सबसे अच्छा जवाब मिला । यह केवल अंतर्निहित अंतर्निहित पुस्तकालयों का उपयोग करता है और आपको अपने स्थानीय समयक्षेत्र (मेरे मामले में एक आवश्यकता) के लिए इनपुट की आवश्यकता नहीं होती है

import time
import calendar

local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
local_seconds = time.mktime(local_time)
utc_time = time.gmtime(local_seconds)

मैं इस उत्तर को यहाँ फिर से प्रस्तुत कर रहा हूँ क्योंकि यह प्रश्न Google पर खोज कीवर्ड के आधार पर लिंक किए गए प्रश्न के बजाय पॉप अप करता है।


1

मेरी एक परियोजना में यह कोड है:

from datetime import datetime
## datetime.timezone works in newer versions of python
try:
    from datetime import timezone
    utc_tz = timezone.utc
except:
    import pytz
    utc_tz = pytz.utc

def _to_utc_date_string(ts):
    # type (Union[date,datetime]]) -> str
    """coerce datetimes to UTC (assume localtime if nothing is given)"""
    if (isinstance(ts, datetime)):
        try:
            ## in python 3.6 and higher, ts.astimezone() will assume a
            ## naive timestamp is localtime (and so do we)
            ts = ts.astimezone(utc_tz)
        except:
            ## in python 2.7 and 3.5, ts.astimezone() will fail on
            ## naive timestamps, but we'd like to assume they are
            ## localtime
            import tzlocal
            ts = tzlocal.get_localzone().localize(ts).astimezone(utc_tz)
    return ts.strftime("%Y%m%dT%H%M%SZ")

0

अजगर 3 में:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 

यह काम करने के लिए प्रतीत नहीं होता है, यह एक मानदंड अपवाद को जन्म देता है: ValueError: astimezone () एक भोली
डेटाइम पर

यह होना चाहिए: from dateutil import tz
जेवियर

-3

कैसा रहेगा -

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

यदि सेकंड है, Noneतो यह स्थानीय समय को यूटीसी समय में परिवर्तित करता है, अन्यथा पारित समय को यूटीसी में परिवर्तित करता है।


1
यह मदद नहीं करता है, सवाल किसी दिए गए स्थानीय समय स्ट्रिंग को utc स्ट्रिंग में बदलने का था।
टॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.