2025, Oct 31 16:02

Python में NZ समय को UTC में सही रूपांतरण: replace का सही इस्तेमाल

Python में datetime/zoneinfo से NZ (DST) समय को UTC में बदलना सीखें। replace इन-प्लेस नहीं; सही असाइनमेंट और astimezone से भरोसेमंद कन्वर्ज़न करें—उदाहरण सहित व्याख्या.

Python में टाइम ज़ोन के बीच टाइमस्टैम्प बदलना सीधा लगता है, लेकिन एक छोटी-सी बारीकी पूरा नतीजा बिगाड़ सकती है। आम गलती है replace के जरिए datetime को टाइमज़ोन देना और मान लेना कि ऑब्जेक्ट वहीं पर बदल गया—ऐसा नहीं होता। नीचे न्यूज़ीलैंड की गर्मियों (दिसंबर–फ़रवरी) के समय को UTC में बदलने का एक न्यूनतम उदाहरण है, जब NZ समय UTC से 13 घंटे आगे रहता है।

समस्या सेटअप

उद्देश्य है NZ टाइमस्टैम्प को पार्स करना, NZ टाइमज़ोन जोड़ना और उसे UTC में बदलना। NZ की गर्मियों में 2024-12-16T18:55:10 का अपेक्षित UTC मान 2024-12-16T05:55:10Z है।

from zoneinfo import ZoneInfo
from datetime import datetime
# NZ समय स्ट्रिंग
nz_stamp = '2024-12-16T18:55:10Z'
# अपेक्षित UTC समय स्ट्रिंग
utc_stamp = '2024-12-16T05:55:10Z'  # NZ की गर्मियों में समय UTC से 13 घंटे आगे होता है
# टाइमज़ोन-अनजान (naive) के रूप में पार्स करें
naive_local = datetime.strptime(nz_stamp, '%Y-%m-%dT%H:%M:%SZ')
# NZ टाइमज़ोन सेट करने की कोशिश
naive_local.replace(tzinfo=ZoneInfo('NZ'))
# UTC में बदलें
converted_utc = naive_local.astimezone(ZoneInfo('UTC'))
# अपेक्षित मान तैयार करें (यहां अभी भी naive रूप में प्रिंट होगा)
expected_utc = datetime.strptime(utc_stamp, '%Y-%m-%dT%H:%M:%SZ')
expected_utc.replace(tzinfo=ZoneInfo('UTC'))
print(f'Expected:  {expected_utc}')
print(f'Converted: {converted_utc}')

यह मिलता है:

Expected:  2024-12-16 05:55:10
Converted: 2024-12-16 17:55:10+00:00

गलती कहाँ हुई

मूल समस्या यह है कि replace datetime को जगह पर नहीं बदलता। यह एक नया datetime ऑब्जेक्ट लौटाता है। लौटे हुए मान को कैप्चर न करने के कारण ऑब्जेक्ट टाइमज़ोन-अनजान ही रहा और आगे की कन्वर्ज़न ने गलत UTC परिणाम दे दिया।

समाधान और कार्यशील उदाहरण

astimezone बुलाने से पहले replace के परिणाम को असाइन करें। सिर्फ इतना करने से कन्वर्ज़न अपेक्षित UTC टाइमस्टैम्प से मेल खा जाता है।

from zoneinfo import ZoneInfo
from datetime import datetime
nz_stamp = '2024-12-16T18:55:10Z'
utc_stamp = '2024-12-16T05:55:10Z'
naive_local = datetime.strptime(nz_stamp, '%Y-%m-%dT%H:%M:%SZ')
# सही: लौटे हुए टाइमज़ोन-सचेत datetime को कैप्चर करें
aware_local = naive_local.replace(tzinfo=ZoneInfo('NZ'))
converted_utc = aware_local.astimezone(ZoneInfo('UTC'))
expected_utc = datetime.strptime(utc_stamp, '%Y-%m-%dT%H:%M:%SZ')
expected_utc.replace(tzinfo=ZoneInfo('UTC'))
print(f'Expected:  {expected_utc}')
print(f'Converted: {converted_utc}')

परिणाम:

Expected:  2024-12-16 05:55:10
Converted: 2024-12-16 05:55:10+00:00

संक्षिप्त संस्करण

स्पष्टता के लिए, नीचे इनपुट में अंतिम Z के बिना एक कॉम्पैक्ट संस्करण है। क्रम वही है: अनजान रूप में पार्स करें, replace से NZ टाइमज़ोन जोड़ें, फिर UTC में बदलें।

import datetime as tmod
import zoneinfo as zmod
stamp = '2024-12-16T18:55:10'  # 'Z' की जरूरत नहीं
plain_dt = tmod.datetime.strptime(stamp, '%Y-%m-%dT%H:%M:%S')
nz_dt = plain_dt.replace(tzinfo=zmod.ZoneInfo('NZ'))
utc_dt = nz_dt.astimezone(tmod.UTC)
print(f'{plain_dt = !s}')
print(f'{nz_dt    = !s}')
print(f'{utc_dt   = !s}')

आउटपुट:

plain_dt = 2024-12-16 18:55:10
nz_dt    = 2024-12-16 18:55:10+13:00
utc_dt   = 2024-12-16 05:55:10+00:00

यह बारीकी क्यों महत्वपूर्ण है

डेलाइट सेविंग के दौरान टाइम-सीरीज़ प्रोसेसिंग बिना गलती के होनी चाहिए। tzinfo जोड़ते समय एक असाइनमेंट छूट जाए तो कन्वर्ज़न असली वॉल-टाइम से भटक जाते हैं, और वही त्रुटि आगे की गणनाओं, लॉग्स और इंटीग्रेशनों तक फैलती है। replace के व्यवहार को सही समझना सुनिश्चित करता है कि NZ की गर्मियों के समय से UTC में रूपांतरण सुसंगत और पुनरुत्पाद्य रहे।

मुख्य बातें

Python के datetime और zoneinfo के साथ टाइम ज़ोन बदलते समय replace को एक शुद्ध फ़ंक्शन मानें: astimezone कॉल करने से पहले हमेशा उसका रिटर्न मान कैप्चर करें। न्यूज़ीलैंड की गर्मियों के टाइमस्टैम्प, जो UTC से 13 घंटे आगे होते हैं, के लिए यही छोटी-सी दुरुस्ती अपेक्षित UTC परिणाम देती है और आपकी पाइपलाइनों को ठीक-सटीक बनाए रखती है।

यह लेख StackOverflow पर एक प्रश्न (लेखक: IgorLopez) और Mark Tolonen के उत्तर पर आधारित है।