بر مفاهیم ضروری برای دستکاری تاریخ و زمان در پروژه های Rust خود مسلط شوید.
رسیدگی به تاریخ و زمان یکی از جنبههای حیاتی بسیاری از برنامهها است، از زمانبندی وظایف و تجزیه و تحلیل دادهها گرفته تا انجام محاسبات و اطمینان از نمایش دادهها.
Rust کتابخانه ها و ماژول های زیادی برای کار با تاریخ و زمان دارد. Rust یک جعبه زمانی داخلی برای عملیات مربوط به زمان فراهم می کند، و کتابخانه Chrono با بسیاری از کتابخانه های Rust دیگر برای عملیات تاریخ و زمان تعامل دارد.
شروع کار با تاریخ و زمان در Rust
Chrono یک کتابخانه تاریخ-زمان برای مدیریت تاریخ، زمان، منطقه زمانی و مدت زمان در Rust است. Chrono چندین ویژگی و یک API بصری برای انواع تاریخ و زمان، مناطق زمانی و تنظیم تاریخ، زمان و بازه زمانی، تجزیه و قالببندی و کار با تقویمها ارائه میکند.
Chrono به خوبی با کتابخانه های دیگر در اکوسیستم Rust بازی می کند و به طور یکپارچه با ویژگی های I/O کتابخانه استاندارد ادغام می شود و به شما امکان می دهد مقادیر تاریخ و زمان Chrono را از و به جریان های مختلف بخوانید و بنویسید.
علاوه بر این، Chrono از سریالسازی و سریالزدایی از طریق جعبه Serde پشتیبانی میکند و کار با انواع Chrono را در JSON، YAML و فرمتهای دیگر آسان میکند. ادغام Chrono با Serde آن را برای عملیات تاریخ در هنگام ساخت برنامه های وب در Rust مناسب می کند.
میتوانید از Chrono برای بازیابی UTC (زمان جهانی هماهنگ) مکان خود برای عملیاتهای متعددی مانند تبدیل استفاده کنید.
برای نصب و استفاده از chrono crate، این دستورالعمل را به بخش وابستگی ها در فایل Cargo.toml خود اضافه کنید:
[dependencies]
chrono = "0.4.24"
پس از نصب جعبه کرونو، می توانید با وارد کردن جعبه به صورت زیر از کرونو در پروژه Rust خود استفاده کنید:
use chrono::prelude::*;
Chrono یکی از جعبههای Rust است که در زرادخانه توسعه خود به آن نیاز خواهید داشت زیرا بیشتر ویژگیها را برای عملیات تاریخ و زمان ارائه میکند.
مناطق زمانی و مدیریت زمان در Rust با Chrono
مناطق زمانی تضمین میکنند که مُهرهای زمانی و اطلاعات مربوط به زمان در مکانهای مختلف جغرافیایی دقیق و سازگار هستند. هنگام کار با داده های مربوط به زمان، در نظر گرفتن مناطق زمانی برای جلوگیری از ابهام و عدم دقت ضروری است. عملیاتی مانند مقایسه مهرهای زمانی، محاسبه مدت زمان، یا زمانبندی رویدادها بدون مدیریت مناسب منطقه زمانی میتواند نتایج غیرمنتظرهای به همراه داشته باشد.
با Chrono می توانید بین مناطق زمانی تبدیل کنید. در اینجا مثالی از تبدیل DateTime از یک منطقه زمانی به منطقه دیگر آورده شده است:
use chrono::{DateTime, Utc, Local, TimeZone};
fn convert_timezone() {
let utc_time: DateTime<Utc> = Utc::now();
let local_time: DateTime<Local> = utc_time.with_timezone(&Local);
println!("UTC time: {}", utc_time);
println!("Local time: {}", local_time);
}
تابع convert_timezone UTC فعلی را با متد Utc::now بازیابی می کند، UTC را با متد with_timezone به منطقه زمانی محلی تبدیل می کند که به ساختار Local اشاره می کند و یک شی DateTime را نشان می دهد که همان نقطه زمانی را نشان می دهد اما در منطقه زمانی محلی. .
وقتی تابع convert_timezone را فراخوانی میکنید، UTC و زمان محلی را در کنسول چاپ میکند.
علاوه بر این، Chrono روش ها و عملکردهای مناسبی را برای زمان صرفه جویی در تابستان (DST) و تغییر منطقه زمانی ارائه می دهد. در سیستم خود، می توانید ساعت را برای زمان تابستانی از طریق برنامه تنظیمات یا کنترل پنل تنظیم کنید.
در اینجا یک مثال نشان می دهد که قابلیت های Chrono با DST و زمان جبران را نشان می دهد:
use chrono::{DateTime, Utc, FixedOffset};
fn handle_dst() {
let utc_time: DateTime<Utc> = Utc::now();
let ny_timezone = FixedOffset::east(5 * 3600);
// Eastern Daylight Time (EDT) UTC-4:00
let ny_time: DateTime<FixedOffset> = utc_time.with_timezone(&ny_timezone);
println!("UTC time: {}", utc_time);
println!("New York time: {}", ny_time);
}
تابع handle_dst با روش now به زمان فعلی دسترسی پیدا می کند و زمان در نیویورک را بازیابی می کند در حالی که زمان افست را با روش FixedOffset::east محاسبه می کند.
با فراخوانی تابع with_timezone، UTC را به منطقه زمانی نیویورک تبدیل می کنید. Chrono تنظیمات زمان را مطابق DST مناسب انجام می دهد و یک شی DateTime را برمی گرداند.
هنگام کار با DST، بسیار مهم است که به یاد داشته باشید که انتقال DST در تاریخ ها و زمان های خاص رخ می دهد. ساختار DateTime Chrono برای مدیریت این انتقال ها و اطمینان از نمایش دقیق زمان در مناطق زمانی مختلف مجهز شده است.
محاسبات مدت و بازه زمانی
مدت زمان زمانی مستقل از هر نقطه زمانی خاص است. ممکن است لازم باشد مدت زمان بین دو رویداد را محاسبه کنید، زمان سپری شده را اندازه گیری کنید یا مقدار مشخصی را از یک زمان مشخص اضافه یا کم کنید.
جعبه زمان کتابخانه استاندارد Rust ابزارهای جامعی را برای مدیریت کارآمد مدت زمان فراهم می کند.
در اینجا نحوه اندازه گیری زمان اجرای یک تابع با جعبه زمان آورده شده است:
use chrono::{DateTime, Utc};
use std::time::Instant;
fn main() {
let start = Instant::now();
// Perform some operation
// ...
let end = Instant::now();
let duration = end.duration_since(start);
println!("Elapsed time: {:?}", duration);
}
تابع اصلی زمان جاری را با روش Instant از جعبه زمان داخلی بازیابی می کند. بعد از عملیات، تابع main زمان را در آن لحظه بازیابی می کند و قبل از چاپ اختلاف زمانی در کنسول، تفاوت را با تابع duration_since ارزیابی می کند.
سریالسازی و سریالزدایی: تبدیل تاریخ و زمان JSON به ساختارهای Rust با استفاده از Chrono
سریال کردن و جداسازی مقادیر تاریخ و زمان از JSON با استفاده از Chrono و Serde یک فرآیند ساده است. ابتدا جعبه های serde و serde_json را به وابستگی های پروژه خود اضافه کنید.
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
در مرحله بعد، باید نوع Rust را تعریف کنید و ویژگی های #[derive(Serialize, Deserialize)] را برای نوعی که در آن نوع داده را مشخص می کنید، پیاده سازی کنید:
use chrono::{DateTime, Utc};
#[derive(Serialize, Deserialize)]
struct Meeting {
start_time: DateTime<Utc>,
end_time: DateTime<Utc>,
}
میتوانید ساختار Meeting را به JSON با Serde در کنار قابلیتهای قالببندی Chrono به صورت سریالی درآورید.
در اینجا نحوه تبدیل یک نمونه از نوع Meeting به JSON آمده است:
use serde_json::to_string;
fn main() {
let meeting = Meeting {
start_time: Utc::now(),
end_time: Utc::now(),
};
let json = to_string(&meeting).unwrap();
println!("{}", json);
}
تابع اصلی قبل از استفاده از تابع to_string برای تبدیل نمونه ساختار به رشته JSON چاپ شده در کنسول، یک نمونه Meeting با UTC فعلی برای فیلدها ایجاد می کند.
شما به راحتی میتوانید دادههای تاریخ-زمان JSON را به یک نوع ساختار با تابع from_str serde_json که یک رشته JSON را میگیرد و یک نمونه ساختاری را برمیگرداند، غیر سریالی کنید.
use serde_json::from_str;
fn main() {
let json = r#"{"start_time": "2023-05-28T12:00:00Z", "end_time": "2023-05-28T14:00:00Z"}"#;
let meeting: Meeting = from_str(json).unwrap();
println!("{:#?}", meeting);
}
تابع اصلی قبل از چاپ نمونه ساختار در کنسول، رشته JSON را از متغیر json به نمونه جلسه ساختار Meeting تبدیل می کند.
شما می توانید برنامه های پیچیده با Rust بسازید
استحکام، سهولت استفاده و عملکرد گسترده Chrono آن را به ابزاری ضروری برای مدیریت تاریخ، زمان، مدت زمان و فواصل برنامههای شما تبدیل کرده است. با استفاده از قابلیتهای Chrono میتوانید از محاسبات زمان دقیق، زمانبندی کارآمد و عملیاتهای مرتبط با تاریخ مطمئن شوید.
یکی از موارد استفاده کلیدی برای Chrono در ساخت برنامه های کاربردی وب است. میتوانید از Chrono برای ثبت زمان فعالیت، زمانبندی فعالیت کاربر و سایر عملیاتهای وب استفاده کنید.