C++ में समय क्षेत्र: समय क्षेत्रों में भ्रम से कैसे बचें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

समय एक समस्या क्यों है (और C++ कैसे मदद कर सकता है)

\n

कल्पना करें: आपका सर्वर न्यूयॉर्क, लंदन और टोक्यो से ऑर्डर प्रोसेस करता है। आप ऑर्डर बनाने का समय UTC में रिकॉर्ड करते हैं, और फिर उपयोगकर्ता को दिखाते हैं: "आपका ऑर्डर 03:15 पर बनाया गया था"। न्यूयॉर्क के निवासी के लिए यह पिछले दिन का 22:15 है, लंदन के लिए सुबह के 04:15, और टोक्यो का व्यक्ति तो आधी रात में नोटिफिकेशन से जाग जाएगा। एक क्लासिक समस्या जो एक साधारण लॉग को पहेली में बदल देती है।

\n

C++ में लंबे समय तक समय क्षेत्रों के साथ काम करने का कोई मानक तरीका नहीं था। डेवलपर्स या तो time_t और struct tm से जूझते थे, या Boost.DateTime जैसी भारी लाइब्रेरी का उपयोग करते थे। लेकिन C++20 के आने से स्थिति पूरी तरह बदल गई। std::chrono लाइब्रेरी में समय क्षेत्रों का पूर्ण समर्थन जुड़ गया। और हालांकि कई कंपाइलर अभी भी मानक को पकड़ रहे हैं, हम देखेंगे कि आज ही C++ में समय क्षेत्रों के साथ काम करने के लिए स्वच्छ और पोर्टेबल कोड कैसे लिखें।

\n

इस लेख में, मैं आपको दिखाऊंगा कि कैसे C++ में समय क्षेत्रों की अराजकता को एक व्यवस्थित प्रणाली में बदला जाए। आप std::chrono::tzdb के साथ काम करना, UTC को स्थानीय समय में बदलना, डेलाइट सेविंग टाइम को ध्यान में रखना और सामान्य गलतियों से बचना सीखेंगे।

\n\n

मूल बातें: chrono के दृष्टिकोण से C++ में समय क्षेत्र क्या है

\n

C++20 में, समय क्षेत्र UTC से केवल घंटों का अंतर नहीं है। यह एक पूर्ण वस्तु है जो क्षेत्र में समय में हुए बदलावों के इतिहास के बारे में जानती है: घड़ियाँ कब आगे-पीछे की गईं, डेलाइट सेविंग टाइम कब रद्द किया गया, और वहाँ कौन से नियम लागू हैं। यह सारी जानकारी समय क्षेत्र डेटाबेस (tzdb) में संग्रहीत है, जो मानक लाइब्रेरी में निर्मित है।

\n\n

समय क्षेत्रों के साथ काम करने के लिए मुख्य प्रकार

\n

भ्रम से बचने के लिए, तीन मुख्य प्रकार याद रखें:

\n
    \n
  • std::chrono::time_zone — एक विशिष्ट समय क्षेत्र का प्रतिनिधित्व करता है (उदाहरण के लिए, "America/New_York")।
  • \n
  • std::chrono::zoned_time — "समय क्षेत्र + समय का क्षण" का संयोजन। यह क्षेत्र के अनुसार समय को संग्रहीत और प्रदर्शित करने के लिए सबसे सुविधाजनक प्रकार है।
  • \n
  • std::chrono::time_zone_link — क्षेत्रों के वैकल्पिक नाम (उदाहरण के लिए, "US/Eastern" "America/New_York" का लिंक हो सकता है)।
  • \n
\n\n

सभी समय क्षेत्रों की सूची प्राप्त करना

\n

आइए सरल से शुरू करें: सभी उपलब्ध समय क्षेत्रों को प्रदर्शित करें। यह तब उपयोगी होता है जब आप उपयोगकर्ता को अपना समय क्षेत्र चुनने देते हैं।

\n\n
#include <iostream>\n#include <chrono>\n#include <string>\n\nint main() {\n    // समय क्षेत्र डेटाबेस तक पहुंच प्राप्त करें\n    const auto& tzdb = std::chrono::get_tzdb();\n    \n    // सभी क्षेत्रों के नाम प्रदर्शित करें\n    std::cout << "उपलब्ध समय क्षेत्र (" << tzdb.zones.size() << "):\\n";\n    for (const auto& zone : tzdb.zones) {\n        std::cout << zone.name() << '\\n';\n    }\n    return 0;\n}
\n\n

ध्यान दें: get_tzdb() एक कॉन्स्टेंट रेफरेंस लौटाता है। डेटाबेस पहली कॉल पर एक बार लोड होता है और कैश हो जाता है। इसका मतलब है कि आप प्रोग्राम के विभिन्न भागों में इस फ़ंक्शन को सुरक्षित रूप से कॉल कर सकते हैं — ओवरहेड केवल पहली बार होगा।

\n\n

C++ में समय क्षेत्रों के बीच समय का रूपांतरण

\n

अब सबसे महत्वपूर्ण भाग पर आते हैं — रूपांतरण। मान लीजिए, आपके पास UTC में समय है, और आप इसे उपयोगकर्ता को उसके स्थानीय क्षेत्र में दिखाना चाहते हैं। या इसके विपरीत: उपयोगकर्ता अपने समय में एक तिथि दर्ज करता है, और आपको इसे UTC में सहेजना है।

\n\n

UTC से स्थानीय समय में

\n

परिदृश्य: सर्वर को UTC में एक घटना का समय प्राप्त हुआ (उदाहरण के लिए, 2024-12-01 15:30:00 UTC)। इसे "Europe/Moscow" क्षेत्र के लिए दिखाना है।

\n\n
#include <iostream>\n#include <chrono>\n#include <format> // फ़ॉर्मेटिंग के लिए C++20\n\nint main() {\n    using namespace std::chrono;\n    \n    // 1. UTC में समय का एक क्षण बनाएं\n    // 2024-12-01 15:30:00 UTC\n    auto tp = sys_days{December / 1 / 2024} + 15h + 30min;\n                

ब्लॉग

पुस्तक अनुशंसाएँ