केवल अजगर मानक पुस्तकालय का उपयोग करके एक अजगर यूटीसी डेटाइम को स्थानीय डेटाइम में परिवर्तित करें?


189

मेरे पास एक पायथन डेटाइम उदाहरण है, जो डेटटाइम.टॉकन () का उपयोग करके बनाया गया था और डेटाबेस में जारी था।

प्रदर्शन के लिए, मैं डेटाबेस से पुनर्प्राप्त डेटाइम उदाहरण को डिफ़ॉल्ट स्थानीय टाइमज़ोन का उपयोग करके स्थानीय डेटाटाइम में कनवर्ट करना चाहूंगा (जैसे कि, डेटाटाइम को डेटाइम.वन () का उपयोग करके बनाया गया था)।

मैं केवल अजगर मानक पुस्तकालय (उदाहरण के लिए, कोई pytz निर्भरता) का उपयोग करके UTC डेटाटाइम को स्थानीय डेटाटाइम में कैसे परिवर्तित कर सकता हूं?

ऐसा लगता है कि एक समाधान datetime.astimezone (tz) का उपयोग करने के लिए होगा, लेकिन आप डिफ़ॉल्ट स्थानीय समय क्षेत्र कैसे प्राप्त करेंगे?


डेटाबेस को किस प्रारूप में समय दिया गया था? यदि यह एक मानक प्रारूप है तो यह हो सकता है कि आपको कोई रूपांतरण करने की आवश्यकता न हो।
अपाला

1
यह उत्तर pytz का उपयोग करने का एक सरल तरीका दिखाता है
जुआन

जवाबों:


275

पायथन में 3.3+:

from datetime import datetime, timezone

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)

अजगर 2/3 में:

import calendar
from datetime import datetime, timedelta

def utc_to_local(utc_dt):
    # get integer timestamp to avoid precision lost
    timestamp = calendar.timegm(utc_dt.timetuple())
    local_dt = datetime.fromtimestamp(timestamp)
    assert utc_dt.resolution >= timedelta(microseconds=1)
    return local_dt.replace(microsecond=utc_dt.microsecond)

प्रयोग pytz(दोनों पायथन 2/3):

import pytz

local_tz = pytz.timezone('Europe/Moscow') # use your local timezone name here
# NOTE: pytz.reference.LocalTimezone() would produce wrong result here

## You could use `tzlocal` module to get local timezone on Unix and Win32
# from tzlocal import get_localzone # $ pip install tzlocal

# # get local timezone    
# local_tz = get_localzone()

def utc_to_local(utc_dt):
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
    return local_tz.normalize(local_dt) # .normalize might be unnecessary

उदाहरण

def aslocaltimestr(utc_dt):
    return utc_to_local(utc_dt).strftime('%Y-%m-%d %H:%M:%S.%f %Z%z')

print(aslocaltimestr(datetime(2010,  6, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime(2010, 12, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime.utcnow()))

उत्पादन

अजगर ३.३
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.093745 MSK+0400
अजगर २
2010-06-06 21:29:07.730000 
2010-12-06 20:29:07.730000 
2012-11-08 14:19:50.093911 
pytz
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.146917 MSK+0400

नोट: यह डीएसटी और एमएसके टाइमज़ोन के लिए utc ऑफसेट के हालिया बदलाव को ध्यान में रखता है।

मुझे नहीं पता कि गैर-पाइत्ज़ समाधान विंडोज पर काम करते हैं या नहीं।


1
'सामान्यीकरण' क्या करता है?
अवनि

4
@avi: सामान्य तौर पर: pytz : टाइमज़ोन के बीच रूपांतरण करते समय सामान्यीकरण की आवश्यकता क्यों होती है? । नोट: यह वर्तमान कार्यान्वयन के साथ आवश्यक नहीं है .normalize()क्योंकि स्रोत समयक्षेत्र .astimezone()UTC है।
JFS

1
मैं TypeError: replace() takes no keyword argumentspytz समाधान की कोशिश कर जब मिलता है ।
क्रेग

@Craig कोड काम करता है, जैसा कि उत्तर में आउटपुट प्रदर्शित करता है। TypeError की ओर जाने वाले पूर्ण न्यूनतम कोड उदाहरण बनाएं, अपने पायथन, pytz संस्करणों का उल्लेख करें जो आप उपयोग करते हैं और इसे एक अलग स्टैक ओवरफ्लो प्रश्न के रूप में पोस्ट करते हैं।
JFS

पायथन 3.3+ समाधान के लिए त्वरित टिप। विपरीत दिशा में जाने के लिए (Native to UTC), यह काम करता है: local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
jasonrhaas

50

आप इसे केवल मानक पुस्तकालय के साथ नहीं कर सकते क्योंकि मानक पुस्तकालय में कोई टाइमज़ोन नहीं है। आपको pytz या डेटटिल की आवश्यकता है ।

>>> from datetime import datetime
>>> now = datetime.utcnow()
>>> from dateutil import tz
>>> HERE = tz.tzlocal()
>>> UTC = tz.gettz('UTC')

The Conversion:
>>> gmt = now.replace(tzinfo=UTC)
>>> gmt.astimezone(HERE)
datetime.datetime(2010, 12, 30, 15, 51, 22, 114668, tzinfo=tzlocal())

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


धन्यवाद, अगर मैं कभी भी एक पूर्ण समाधान की जरूरत है तो मैं इसे संभाल कर रखूंगा। क्या खजूर पायथन 3.1 का समर्थन करता है (पायथन 2.3+ कहता है लेकिन यह संदिग्ध है)?
नाइट्रो जर्क


pytz वास्तव में DST बदलाव को बेहतर तरीके से संभालता है।
लेनार्ट रेगेब्र

2
अपडेट: पायज और डेटटिल दोनों आजकल पायथन 3 का समर्थन करते हैं।
लेनार्ट रेगेब्र

1
@JFSebastian: डेटसाइल दो 1:30 बार के बीच अंतर नहीं कर सकता है जो एक डीएसटी बदलाव के दौरान होता है। यदि आपको उन दो बार के बीच अंतर करने में सक्षम होने की आवश्यकता है, तो पाइट्ज़ का उपयोग करने के लिए इसे हल करें, जो इसे संभाल सकता है।
लेनार्ट रेगेब्रो

8

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

कक्षा विधि के माध्यम से बनाई गई भोली वस्तुएं utcnow()

किसी भोली वस्तु को किसी अन्य समय क्षेत्र में परिवर्तित करने के लिए, पहले आपको इसे जागरूक डेटाटाइम ऑब्जेक्ट में बदलना होगा । आप replaceएक भोली डेटाइम ऑब्जेक्ट को एक जागरूक डेटाटाइम ऑब्जेक्ट में कनवर्ट करने के लिए विधि का उपयोग कर सकते हैं । फिर किसी जागरूक टाइमटाइम ऑब्जेक्ट को किसी अन्य टाइमज़ोन में कनवर्ट करने के लिए आप astimezoneविधि का उपयोग कर सकते हैं ।

चर pytz.all_timezonesआपको pytz मॉड्यूल में सभी उपलब्ध समय क्षेत्रों की सूची देता है।

import datetime,pytz

dtobj1=datetime.datetime.utcnow()   #utcnow class method
print(dtobj1)

dtobj3=dtobj1.replace(tzinfo=pytz.UTC) #replace method

dtobj_hongkong=dtobj3.astimezone(pytz.timezone("Asia/Hong_Kong")) #astimezone method
print(dtobj_hongkong)

कक्षा विधि के माध्यम से बनाई गई भोली वस्तुएं now()

क्योंकि nowविधि वर्तमान तिथि और समय लौटाती है, इसलिए आपको पहले डेटटाइम ऑब्जेक्ट टाइमज़ोन को जागरूक करना होगा। localize समारोह एक धर्मान्तरित अनुभवहीन एक समयक्षेत्र अवगत datetime वस्तु में datetime वस्तु। फिर आप astimezoneइसे किसी अन्य समयक्षेत्र में बदलने के लिए विधि का उपयोग कर सकते हैं ।

dtobj2=datetime.datetime.now()

mytimezone=pytz.timezone("Europe/Vienna") #my current timezone
dtobj4=mytimezone.localize(dtobj2)        #localize function

dtobj_hongkong=dtobj4.astimezone(pytz.timezone("Asia/Hong_Kong")) #astimezone method
print(dtobj_hongkong)

6

मुझे लगता है कि मुझे यह समझ में आया: युग के बाद से सेकंड की संख्या की गणना करता है, फिर time.localtime का उपयोग करके एक स्थानीय टाइमज़ोन में परिवर्तित होता है, और फिर समय संरचना को एक डेटाइम में परिवर्तित करता है ...

EPOCH_DATETIME = datetime.datetime(1970,1,1)
SECONDS_PER_DAY = 24*60*60

def utc_to_local_datetime( utc_datetime ):
    delta = utc_datetime - EPOCH_DATETIME
    utc_epoch = SECONDS_PER_DAY * delta.days + delta.seconds
    time_struct = time.localtime( utc_epoch )
    dt_args = time_struct[:6] + (delta.microseconds,)
    return datetime.datetime( *dt_args )

यह समर / विंटर डीएसटी को सही तरीके से लागू करता है:

>>> utc_to_local_datetime( datetime.datetime(2010, 6, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 6, 6, 19, 29, 7, 730000)
>>> utc_to_local_datetime( datetime.datetime(2010, 12, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 12, 6, 18, 29, 7, 730000)

1
ओह। लेकिन वह यूनिक्स पर काम करना चाहिए, कम से कम। विंडोज के लिए यह गलत हो सकता है यदि आपके दिन की बचत के नियम परिवर्तित तिथि से बदल गए हैं। आप लाइब्रेरी का उपयोग क्यों नहीं करना चाहते हैं?
लेन्आर्ट रेगेब्र

मुझे केवल utc / स्थानीय रूपांतरण की आवश्यकता है इसलिए इस तरह के पुस्तकालय को खींचना अधिक कठिन प्रतीत होता है। चूंकि मैं एप्लिकेशन का एकमात्र उपयोगकर्ता हूं जो मैं कुछ सीमाओं के साथ रह सकता हूं। यह निर्भरता से संबंधित मुद्दों (पायथन 3 ;, विंडोज; गुणवत्ता ...) का समर्थन करने से भी बचता है, जो मेरी छोटी स्क्रिप्ट पर काम करने से अधिक महंगा होगा।
नाइट्रो ज़र्क

1
कुंआ। यदि आपको Python3 की आवश्यकता है, तो आप भाग्य से बाहर हैं। लेकिन अन्यथा एक पुस्तकालय का उपयोग करने की तुलना में शोध करना और अपना खुद का समाधान बनाना अधिक कठिन है।
लेनर्ट रेगेब्र

1
+1 (डाउनवोट को ऑफ़सेट करने के लिए: यह @Lartart उल्लेख किए गए कैविट के साथ stdlib- केवल समाधान की तलाश करने के लिए वैध आवश्यकता हो सकती है)। यह देखते हुए कि डेटिक्सिल यूनिक्स और विंडोज दोनों पर विफल हो सकता है । btw, आप utctotimestamp(utc_dt) -> (seconds, microseconds)स्पष्टता के लिए अपने कोड से निकाल सकते हैं , पायथन 2.6-3.x कार्यान्वयन
jfs

1
कुछ समय के बाद से पायथॉन (और डेटटील) पायथन 3 पर काम करता है, इसलिए पायथन 3 / विंडोज / गुणवत्ता के मुद्दे अब कोई समस्या नहीं हैं।
लेनार्ट रेगेब्र

6

एलेक्सी की टिप्पणी पर बिल्डिंग। यह डीएसटी के लिए भी काम करना चाहिए।

import time
import datetime

def utc_to_local(dt):
    if time.localtime().tm_isdst:
        return dt - datetime.timedelta(seconds = time.altzone)
    else:
        return dt - datetime.timedelta(seconds = time.timezone)

4

मानक पायथन पुस्तकालय किसी भी tzinfoकार्यान्वयन के साथ नहीं आता है । मैंने हमेशा इसे डेटाइम मॉड्यूल की एक आश्चर्यजनक कमी माना है।

Tzinfo वर्ग के लिए प्रलेखन कुछ उपयोगी उदाहरण के साथ आता है। अनुभाग के अंत में बड़े कोड ब्लॉक की तलाश करें।


1
कोर कार्यान्वयन के प्रकार के बारे में मेरा अनुमान है क्योंकि समय क्षेत्र डेटाबेस को नियमित रूप से अपडेट करने की आवश्यकता है क्योंकि कुछ देशों के पास डीएसटी अवधि निर्धारित करने के लिए निश्चित नियम नहीं हैं। अगर मैं गलत नहीं हूँ, उदाहरण के लिए JVM को अंतिम टाइमज़ोन डेटाबेस प्राप्त करने के लिए अद्यतन करने की आवश्यकता है ...
नाइट्रो ज़र्क

@ निट्रो ज़र्क, कम से कम उन्हें यूटीसी के लिए एक होना चाहिए था। osमॉड्यूल ऑपरेटिंग सिस्टम कार्यों के आधार पर स्थानीय समय के लिए यह सेवा प्रदान कर सकते थे।
मार्क रैनसम

1
मैं 3.2 में नई विशेषताओं की सूची की जाँच कर रहा था और उन्होंने 3.2 में यूटीसी टाइमज़ोन जोड़ा ( docs.python.org/dev/whatsnew/3.2.html#datetime )। हालांकि स्थानीय समयक्षेत्र नहीं लगता है ...
नाइट्रो ज़र्क

2

अजगर 3.9 zoneinfoमॉड्यूल को जोड़ता है इसलिए अब इसे निम्नानुसार किया जा सकता है (केवल स्टडलिब):

from zoneinfo import ZoneInfo
from datetime import datetime

utc_unaware = datetime(2020, 10, 31, 12)  # loaded from database
utc_aware = utc_unaware.replace(tzinfo=ZoneInfo('UTC'))  # make aware
local_aware = utc_aware.astimezone(ZoneInfo('localtime'))  # convert

मध्य यूरोप UTC से 1 या 2 घंटे आगे है, इसलिए local_awareहै:

datetime.datetime(2020, 10, 31, 13, 0, tzinfo=backports.zoneinfo.ZoneInfo(key='localtime'))

के रूप में str:

2020-10-31 13:00:00+01:00

Windows का कोई सिस्टम टाइम ज़ोन डेटाबेस नहीं है, इसलिए यहाँ एक अतिरिक्त पैकेज की आवश्यकता है:

pip install tzdata  

पायथन 3.6 से 3.8 में उपयोग की अनुमति देने के लिए एक बैकपोर्ट है :

sudo pip install backports.zoneinfo

फिर:

from backports.zoneinfo import ZoneInfo

आपको यहां भी ज़रूरत नहीं zoneinfoहै - जेफ़ के जवाब का पहला भाग (पायथन 3.3 + भाग) देखें; ;-)
MrFuppes

@MrFuppes मुझे लगता ZoneInfo('localtime')है कि इससे बहुत स्पष्ट है tz=None(सब के बाद, किसी को tz=Noneटाइमजोन को हटाने या स्थानीय समय के बजाय यूटीसी को वापस करने की उम्मीद हो सकती है )।
xjcl

@MrFuppes प्लस प्रश्न में ओपी को एक वेबसाइट शामिल करना और उपयोगकर्ताओं को अपने स्थानीय समय में टाइमस्टैम्प दिखाना शामिल हो सकता है। इसके लिए आपको स्थानीय समय के बजाय उपयोगकर्ता के स्पष्ट समयक्षेत्र में बदलना होगा।
xjcl

0

पायथन 2 और 3 में काम करने वाला एक सरल (लेकिन शायद त्रुटिपूर्ण) तरीका:

import time
import datetime

def utc_to_local(dt):
    return dt - datetime.timedelta(seconds = time.timezone)

इसका लाभ यह है कि यह एक उलटा कार्य लिखने के लिए तुच्छ है


1
यह गलत परिणाम देता है, जैसा time.timezoneकि दिन के उजाले की बचत पर ध्यान नहीं देता है ।
मसराद

0

मैंने जो सबसे आसान तरीका ढूंढा है , वह है कि आप जहां हैं, वहां समय की भरपाई कर लें, फिर उस समय को घटाएं।

def format_time(ts,offset):
    if not ts.hour >= offset:
        ts = ts.replace(day=ts.day-1)
        ts = ts.replace(hour=ts.hour-offset)
    else:
        ts = ts.replace(hour=ts.hour-offset)
    return ts

यह मेरे लिए, पायथन 3.5.2 में काम करता है।


0

यहां टाइमटाइम को डेटाइम फॉर्मेट में बदलने का एक और तरीका है (मुझे पता है कि मैंने इस पर अपनी ऊर्जा बर्बाद की है लेकिन मैंने इस पृष्ठ को नहीं देखा है इसलिए मुझे पता नहीं है कि मिनट के बिना)। और सेकंड। कारण मुझे अपने प्रोजेक्ट के लिए इसकी आवश्यकता नहीं है:

def change_time_zone(year, month, day, hour):
      hour = hour + 7 #<-- difference
      if hour >= 24:
        difference = hour - 24
        hour = difference
        day += 1
        long_months = [1, 3, 5, 7, 8, 10, 12]
        short_months = [4, 6, 9, 11]
        if month in short_months:
          if day >= 30:
            day = 1
            month += 1
            if month > 12:
              year += 1
        elif month in long_months:
          if day >= 31:
            day = 1
            month += 1
            if month > 12:
              year += 1
        elif month == 2:
          if not year%4==0:
            if day >= 29:
              day = 1
              month += 1
              if month > 12:
                year += 1
          else:
            if day >= 28:
              day = 1
              month += 1
              if month > 12:
                year += 1
      return datetime(int(year), int(month), int(day), int(hour), 00)

टाइमज़ोन के बीच स्विच करने के लिए टाइमडेल्टा का उपयोग करें। आप सभी की जरूरत timezones के बीच घंटे में ऑफसेट है। एक डेटाइम ऑब्जेक्ट के सभी 6 तत्वों के लिए सीमाओं के साथ बेला नहीं है। टाइमडेल्टा लीप इयर्स, लीप सेंचुरी आदि को भी बड़े आराम से हैंडल करता है। आपको must डेटटाइम इंपोर्ट टाइमडेल्टा से ’होना चाहिए। फिर यदि ऑफ़सेट घंटों में एक चर है: टाइमआउट = टाइमइन + टाइमलील्टा (घंटे = ऑफसेट), जहां टाइमइन और टाइमआउट डेटाइम ऑब्जेक्ट हैं। जैसे टाइमइन + टाइमलीटेल (घंटे = -8) जीएमटी से पीएसटी में परिवर्तित होता है।
कार्ल रुडिक

0

यह करने के लिए एक भयानक तरीका है लेकिन यह एक परिभाषा बनाने से बचता है। यह मूल पायथन 3 पुस्तकालय के साथ चिपके रहने की आवश्यकता को पूरा करता है।

# Adjust from UST to Eastern Standard Time (dynamic)
# df.my_localtime should already be in datetime format, so just in case
df['my_localtime'] = pd.to_datetime.df['my_localtime']

df['my_localtime'] = df['my_localtime'].dt.tz_localize('UTC').dt.tz_convert('America/New_York').astype(str)
df['my_localtime'] = pd.to_datetime(df.my_localtime.str[:-6])

हालांकि यह दिलचस्प है और मैं इस पद्धति का उपयोग करने जा रहा हूं, यह सिर्फ स्टैडलिब का उपयोग नहीं कर रहा है। यह रूपांतरण ऐसा करने के लिए पांडा उपयोग कर रहा है pandas.pydata.org/pandas-docs/version/0.25/reference/api/...
टिम ह्यूजेस

-3

टाइमज़ोन के बीच स्विच करने के लिए टाइमडेल्टा का उपयोग करें। आप सभी की जरूरत timezones के बीच घंटे में ऑफसेट है। एक डेटाइम ऑब्जेक्ट के सभी 6 तत्वों के लिए सीमाओं के साथ बेला नहीं है। टाइमडेल्टा लीप इयर्स, लीप सेंचुरी आदि को भी बड़े आराम से हैंडल करता है। आपको पहले होना चाहिए

from datetime import datetime, timedelta

अगर offsetघंटों में टाइमजोन डेल्टा है तो :

timeout = timein + timedelta(hours = offset)

जहां टाइमलाइन और टाइमआउट डेटाइम ऑब्जेक्ट हैं। जैसे

timein + timedelta(hours = -8)

GMT से PST में परिवर्तित हो जाता है।

तो, कैसे निर्धारित करें offset? यहाँ एक सरल कार्य है, बशर्ते कि आपके पास केवल समय-सीमा "जागरूक" का उपयोग किए बिना रूपांतरणों के लिए कुछ संभावनाएं हैं जो "जागरूक" हैं, जो कुछ अन्य उत्तर अच्छी तरह से करते हैं। थोड़ा मैनुअल, लेकिन कभी-कभी स्पष्टता सबसे अच्छा है।

def change_timezone(timein, timezone, timezone_out):
    '''
    changes timezone between predefined timezone offsets to GMT
    timein - datetime object
    timezone - 'PST', 'PDT', 'GMT' (can add more as needed)
    timezone_out - 'PST', 'PDT', 'GMT' (can add more as needed)
    ''' 
    # simple table lookup        
    tz_offset =  {'PST': {'GMT': 8, 'PDT': 1, 'PST': 0}, \
                  'GMT': {'PST': -8, 'PDT': -7, 'GMT': 0}, \
                  'PDT': {'GMT': 7, 'PST': -1, 'PDT': 0}}
    try:
        offset = tz_offset[timezone][timezone_out]
    except:
        msg = 'Input timezone=' + timezone + ' OR output time zone=' + \
            timezone_out + ' not recognized'
        raise DateTimeError(msg)

    return timein + timedelta(hours = offset)

कई उत्तरों को देखने और सबसे कठिन कोड के साथ खेलने के बाद मैं (अब के लिए) सोच सकता हूं कि यह सबसे अच्छा लगता है कि सभी अनुप्रयोगों, जहां समय महत्वपूर्ण है और मिश्रित टाइमज़ोन के लिए जिम्मेदार होना चाहिए, सभी डेटाटाइम ऑब्जेक्ट बनाने के लिए एक वास्तविक प्रयास करना चाहिए "पता"। तब यह सबसे सरल उत्तर होगा:

timeout = timein.astimezone(pytz.timezone("GMT"))

उदाहरण के लिए GMT में बदलना। बेशक, किसी भी अन्य समय-क्षेत्र से, जिसे आप चाहते हैं, स्थानीय या अन्यथा में परिवर्तित करने के लिए, बस उपयुक्त टाइमज़ोन स्ट्रिंग का उपयोग करें जो पाइत्ज़ समझता है (pytz.all_timezones से)। डेलाइट बचत समय को भी ध्यान में रखा जाता है।


1
यह एक अच्छा विचार नहीं है। पूरी दुनिया के लिए DST एक ही तारीख में शिफ्ट नहीं होता है। ऐसा करने के लिए डेटाइम कार्यों का उपयोग करें।
गाबे

@gabe - समझें कि तालिका एक अच्छा विचार नहीं है, हालांकि यह केवल यूएस टाइमज़ोन को कवर करने वाले किसी व्यक्ति के अनुरूप हो सकता है। जैसा कि मैंने अंत में कहा, सबसे अच्छा तरीका यह है कि आप हमेशा के लिए डेटाइम वस्तुओं को "जागरूक" बना दें ताकि आप आसानी से डेटाइम कार्यों का उपयोग कर सकें।
कार्ल रुडिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.