Rust में समय क्षेत्रों के साथ काम करना: बैकएंड डेवलपर के लिए पूर्ण गाइड

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

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

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

परिचय: समय सिरदर्द क्यों है

\n\n

Rust में किसी भी गंभीर प्रोजेक्ट में, चाहे वह Actix पर वेब सर्वर हो, लॉग पार्सर हो या मॉनिटरिंग सिस्टम, देर-सबेर सवाल उठता है: Rust में समय क्षेत्रों के साथ सही तरीके से कैसे काम करें. लगता है, इससे आसान क्या हो सकता है? Timestamp लिया, स्क्रीन पर दिखाया — और हो गया। लेकिन वास्तविकता क्रूर है: एक भूला हुआ समय क्षेत्र लॉग को गड़बड़ कर देता है, और डेटाबेस झूठ बोलने लगता है।

\n\n

इस लेख में, हम देखेंगे कि Rust का इकोसिस्टम समय की समस्या को कैसे हल करता है। आप जानेंगे कि chrono डी-फैक्टो मानक क्यों बन गया, UTC और Local के साथ पागल कैसे न हों, और "Asia/Yekaterinburg" जैसे विदेशी समय क्षेत्रों को बिना दर्द के कैसे संभालें। चलिए शुरू करते हैं!

\n\n

Rust की मानक लाइब्रेरी क्यों काम नहीं करती?

\n\n

std::time में SystemTime, Instant और Duration हैं। यह प्रदर्शन माप और सरल टाइमर के लिए पर्याप्त है। लेकिन जब Rust में समय क्षेत्रों के साथ काम करने की बात आती है, तो मानक लाइब्रेरी पीछे हट जाती है: इसमें न तो "2024-03-15T10:30:00+05:00" जैसी स्ट्रिंग का पार्सिंग है, न समय क्षेत्रों के बारे में जानकारी, न UTC से स्थानीय समय में रूपांतरण।

\n\n

यहीं पर क्रेट chrono मंच पर आता है। यह Rust में दिनांक और समय के लिए एक स्विस आर्मी चाकू है। इसे Cargo.toml में इंस्टॉल करें:

\n\n
[dependencies]\nchrono = { version = "0.4", features = ["serde"] }
\n\n

serde फ्लैग सीरियलाइज़ेशन/डीसीरियलाइज़ेशन के लिए आवश्यक है — यह तब काम आएगा जब आप JSON API के साथ काम कर रहे हों।

\n\n

chrono की मूल बातें: UTC, Local और नाइव समय

\n\n

chrono में समय के एक क्षण को प्रस्तुत करने के लिए तीन मुख्य प्रकार हैं:

\n\n
    \n
  • DateTime<Utc> — UTC में समय। सर्वर के लिए स्वर्ण मानक।
  • \n
  • DateTime<Local> — सिस्टम का स्थानीय समय। डेस्कटॉप पर लॉग के लिए सुविधाजनक।
  • \n
  • NaiveDateTime — समय क्षेत्र के बिना "नाइव" समय। खतरनाक, लेकिन कभी-कभी आवश्यक।
  • \n
\n\n

आइए देखें कि विभिन्न क्षेत्रों में वर्तमान समय कैसे प्राप्त करें:

\n\n
use chrono::{Utc, Local, DateTime};\n\nfn main() {\n    let utc_now: DateTime<Utc> = Utc::now();\n    println!("अब UTC में: {}", utc_now);\n\n    let local_now: DateTime<Local> = Local::now();\n    println!("अब स्थानीय रूप से: {}", local_now);\n}
\n\n

इस कोड को चलाएँ — और आप अंतर देखेंगे। ध्यान दें: DateTime एक सामान्यीकृत प्रकार है जो समय क्षेत्र द्वारा पैरामीटराइज़ किया जाता है। इसका मतलब है कि कंपाइलर आपको स्पष्ट रूपांतरण के बिना UTC और Local से समय जोड़ने नहीं देगा। समय की रक्षा पर टाइप सुरक्षा!

\n\n

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

\n\n

सबसे आम कार्य UTC को उपयोगकर्ता के स्थानीय समय में बदलना है। मान लीजिए, आपका सर्वर सब कुछ UTC में संग्रहीत करता है, और क्लाइंट Asia/Yekaterinburg (UTC+5) समय क्षेत्र में है। यह कैसे करें?

\n\n

with_timezone विधि का उपयोग करें:

\n\n
use chrono::{Utc, Local, TimeZone, DateTime};\n\nfn main() {\n    let utc_time: DateTime<Utc> = Utc::now();\n    \n    // सिस्टम के स्थानीय समय में रूपांतरित करें\n    let local_time: DateTime<Local> = utc_time.with_timezone(&Local);\n    println!("UTC: {} -> Local: {}", utc_time, local_time);\n    \n    // यदि किसी विशिष्ट क्षेत्र की आवश्यकता है — FixedOffset का उपयोग करें\n    let ekb_offset = chrono::FixedOffset::east_opt(5 * 3600).unwrap();\n    let ekb_time: DateTime<FixedOffset> = utc_time.with_timezone(&ekb_offset);\n    println!("UTC: {} -> EKB: {}", utc_time, ekb_time);\n}
\n\n

ध्यान दें: FixedOffset::east_opt Option लौटाता है, क्योंकि हर ऑफसेट मान्य नहीं है (उदाहरण के लिए, 25 घंटे बहुत अधिक है)। हमेशा None को संभालें।

\n\n

और क्या होगा यदि आपके पास Rust में समय क्षेत्रों के साथ काम एक निश्चित शिफ्ट से अधिक जटिल है? उदाहरण के लिए, डेलाइट सेविंग टाइम को ध्यान में रखना होगा? यहाँ क्रेट

ब्लॉग

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