Rust में डेट और टाइम की एडवांस्ड तकनीक
\n\nआधुनिक Rust डेवलपमेंट में डेट और टाइम के साथ काम करना सिर्फ करंट टाइम लेने से कहीं आगे बढ़ चुका है। हाई-लोड सिस्टम, फाइनेंशियल ऐप्लिकेशन या डिस्ट्रीब्यूटेड सर्विसेज़ बनाते समय टाइम ज़ोन का सटीक हिसाब, एफिशिएंट पार्सिंग, सीरियलाइज़ेशन और जटिल टाइम कैलकुलेशन की ज़रूरत होती है। इस आर्टिकल में हम chrono और time क्रेट्स का उपयोग करके डेट और टाइम की एडवांस्ड तकनीकों पर गहराई से चर्चा करेंगे।
1. chrono लाइब्रेरी: एडवांस्ड काम की नींव
\n\nchrono क्रेट Rust में डेट और टाइम के साथ काम करने का डी-फैक्टो स्टैंडर्ड है। यह दो मुख्य एब्स्ट्रैक्शन प्रदान करता है: NaiveDateTime (बिना टाइम ज़ोन के डेट-टाइम) और DateTime<Tz> (टाइम ज़ोन के साथ डेट-टाइम)।
उदाहरण: टाइम ज़ोन के साथ काम करना
\n\nuse chrono::{DateTime, Utc, Local, FixedOffset, NaiveDateTime};\nuse chrono::format::ParseError;\n\nfn main() -> Result<(), ParseError> {\n // UTC में करंट टाइम\n let utc_now: DateTime<Utc> = Utc::now();\n println!("UTC now: {}", utc_now);\n\n // करंट लोकल टाइम\n let local_now: DateTime<Local> = Local::now();\n println!("Local now: {}", local_now);\n\n // दूसरे टाइम ज़ोन में कन्वर्ट करें (मॉस्को, UTC+3)\n let moscow_offset = FixedOffset::east_opt(3 * 3600).unwrap();\n let moscow_time = utc_now.with_timezone(&moscow_offset);\n println!("Moscow time: {}", moscow_time);\n\n // टाइम ज़ोन के साथ स्ट्रिंग पार्स करें\n let parsed = DateTime::parse_from_rfc3339("2024-03-15T14:30:00+05:00")?;\n println!("Parsed with offset: {}", parsed);\n\n Ok(())\n}\n\nमहत्वपूर्ण: डेटाबेस और API में स्टोर करने के लिए Utc का उपयोग करें, और लोकल टाइम ज़ोन में कन्वर्ज़न सिर्फ प्रेज़ेंटेशन लेवल पर करें।
2. जटिल टाइम कैलकुलेशन और इंटरवल
\n\nchrono लाइब्रेरी Duration टाइप के ज़रिए डेट अरिथमेटिक और TimeDelta ट्रेट के ज़रिए जटिल ऑपरेशन को सपोर्ट करती है। इंटरवल और पीरियड (जैसे "अगला महीना") के लिए Months और Weeks का उपयोग करें।
उदाहरण: डेट के साथ कैलकुलेशन
\n\nuse chrono::{NaiveDate, Duration, Months, Datelike, Weekday};\n\nfn main() {\n let start = NaiveDate::from_ymd_opt(2024, 1, 15).unwrap();\n\n // दिन जोड़ना\n let plus_10_days = start + Duration::days(10);\n println!("+10 days: {}", plus_10_days);\n\n // महीने जोड़ना (महीनों की अलग-अलग लंबाई को ध्यान में रखता है)\n let plus_2_months = start.checked_add_months(Months::new(2)).unwrap();\n println!("+2 months: {}", plus_2_months);\n\n // अगला सोमवार ढूंढना\n let next_monday = start.iter_days()\n .skip(1)\n .find(|d| d.weekday() == Weekday::Mon)\n .unwrap();\n println!("Next Monday: {}", next_monday);\n\n // दो डेट के बीच दिनों का अंतर\n let end = NaiveDate::from_ymd_opt(2024, 12, 31).unwrap();\n let days_diff = end.signed_duration_since(start).num_days();\n println!("Days between: {}", days_diff);\n}\n\nसलाह: फाइनेंशियल कैलकुलेशन के लिए सिर्फ दिन जोड़ने के बजाय checked_add_months का उपयोग करें, ताकि महीने के अंत को सही ढंग से हैंडल किया जा सके (जैसे, 31 जनवरी + 1 महीना = 28/29 फरवरी)।
3. serde के साथ डेट का सीरियलाइज़ेशन और पार्सिंग
\n\nJSON, YAML या डेटाबेस के साथ काम करते समय डेट का सही सीरियलाइज़ेशन बहुत ज़रूरी है। chrono क्रेट serde फीचर के ज़रिए serde के साथ इंटीग्रेट होता है। कस्टम फ़ॉर्मेट के लिए #[serde(with = "...")] एट्रीब्यूट का उपयोग करें।
उदाहरण: ISO 8601 और कस्टम फ़ॉर्मेट में सीरियलाइज़ेशन
\n\nuse chrono::{DateTime, Utc, NaiveDateTime};\nuse serde::{Serialize, Deserialize};\n\n#[derive(Debug, Serialize, Deserialize)]