Aware و Naive در تاریخ و زمان در پایتون
در پایتون، اشیاء تاریخ و زمان به دو دسته "Aware" و "Naive" تقسیم میشوند. درک تفاوت بین این دو نوع بسیار مهم است، بهویژه در برنامههایی که با مناطق زمانی مختلف یا نیاز به محاسبات دقیق زمان کار میکنند.
1. Naive
اشیاء naive، اشیائی هستند که هیچ اطلاعاتی دربارهی منطقه زمانی ندارند. این اشیاء صرفاً نمایانگر تاریخ و زمان هستند بدون اینکه به زمانگذاری یا تنظیمات روز روشن (DST) اشاره کنند. به همین دلیل، نمیتوان آنها را بهطور دقیق نسبت به اشیاء دیگر تاریخ و زمان مرتبط ساخت.
ویژگیهای اشیاء Naive:
- عدم وجود اطلاعات منطقه زمانی: این اشیاء اطلاعاتی دربارهی منطقه زمانی ندارند و بنابراین برای استفاده در مناطق زمانی مختلف، نیاز به اطلاعات اضافی دارند.
- سادگی: کار کردن با این اشیاء سادهتر است، اما ممکن است مشکلاتی ایجاد کند اگر برنامه نیاز به مدیریت مناطق زمانی یا DST داشته باشد.
- مثالها: اشیاء datetime.date، datetime.time و datetime.datetime بدون منطقه زمانی (یعنی tzinfo برابر با None).
مثال از یک شیء Naive:
from datetime import datetime # Naive datetime object naive_dt = datetime(2024, 1, 6, 12, 0, 0) print(naive_dt) # Output: 2024-01-06 12:00:00
2. Aware
اشیاء Aware شامل اطلاعاتی دربارهی منطقه زمانی هستند و بنابراین میتوانند بهطور دقیق نسبت به سایر اشیاء تاریخ و زمان موقعیتیابی شوند. این اشیاء برای برنامههایی که نیاز به مدیریت اختلافهای زمانی یا تنظیمات روز روشن دارند، بسیار مفید هستند.
ویژگیهای اشیاء Aware:
- شامل اطلاعات منطقه زمانی: این اشیاء ویژگی tzinfo را دارند که اطلاعاتی دربارهی منطقه زمانی، مانند اختلاف زمانی از UTC و تأثیر DST را ارائه میدهد.
- غیر مبهم: این اشیاء یک لحظه خاص در زمان را نشان میدهند و میتوانند بهطور دقیق بین مناطق زمانی مقایسه یا تبدیل شوند.
- مثالها: اشیاء datetime.datetime با ویژگی tzinfo تنظیم شده، که با استفاده از کلاسهایی مانند timezone یا کتابخانههای خارجی مثل pytz یا zoneinfo ساخته میشوند.
مثال از یک شیء Aware:
from datetime import datetime, timezone, timedelta # Aware datetime object aware_dt = datetime(2024, 1, 6, 12, 0, 0, tzinfo=timezone(timedelta(hours=3.5))) print(aware_dt) # Output: 2024-01-06 12:00:00+03:30
کلاسها و ثابتها
کلاسها:
- datetime.date: نمایانگر یک تاریخ (سال، ماه، روز) بدون اطلاعات زمان.
- datetime.time: نمایانگر یک زمان (ساعت، دقیقه، ثانیه) بدون اطلاعات تاریخ.
- datetime.datetime: ترکیبی از تاریخ و زمان.
- datetime.timedelta: نمایانگر تفاوت بین دو تاریخ یا زمان.
- datetime.tzinfo: کلاس پایه انتزاعی برای اطلاعات منطقه زمانی.
- datetime.timezone: پیادهسازی واقعی tzinfo برای اختلافهای ثابت زمانی از UTC.
ثابتها:
- datetime.MINYEAR: کوچکترین سال مجاز (۱).
- datetime.MAXYEAR: بزرگترین سال مجاز (9999).
- datetime.UTC: معادل با singleton زمان UTC (datetime.timezone.utc)، که از نسخه 3.11 به بعد اضافه شده است.
مثال استفاده از کلاس timezone:
from datetime import datetime, timezone, timedelta # Create a timezone with a fixed offset fixed_offset = timezone(timedelta(hours=5)) # UTC+5 now = datetime.now(fixed_offset) print(now) # Output: Current date and time with UTC+5 offset
روابط زیرکلاسها
- datetime.date و datetime.datetime زیرکلاسهای datetime.time هستند.
- datetime.time و datetime.datetime از datetime.timedelta ارثبری میکنند.
- datetime.tzinfo کلاس پایه برای datetime.timezone است.
درک این تفاوتها و استفاده از نوع مناسب بر اساس نیازهای برنامه شما میتواند به اطمینان از اینکه برنامههایتان بهطور دقیق و مؤثر با اطلاعات تاریخ و زمان کار میکنند، کمک کند.
ویژگیهای مشترک در اشیاء تاریخ، زمان، datetime، و منطقه زمانی در پایتون
اشیاء از نوع date, datetime, time, و timezone در پایتون ویژگیهای مشترکی دارند که باعث میشود کار با آنها در برنامهنویسی سادهتر و مؤثرتر باشد. در اینجا به این ویژگیها پرداخته میشود:
1. عدم تغییرپذیری (Immutability)
اشیاء از این انواع در پایتون غیرقابل تغییر هستند. این بدین معناست که پس از ایجاد یک شیء، نمیتوان مقادیر آن را تغییر داد. این ویژگی به معنای این است که هر بار که نیاز به تغییر مقدار یک شیء دارید، باید یک شیء جدید ایجاد کنید.
مزایای عدم تغییرپذیری:
- امنیت در برنامهنویسی: عدم تغییرپذیری باعث میشود که اشیاء غیرقابل تغییر به راحتی از نظر امنیتی و ایمنی دادهها بررسی شوند.
- پیشبینیپذیری: برنامهنویسان میتوانند مطمئن باشند که یک شیء تاریخ یا زمان پس از ایجاد تغییر نمیکند.
مثال:
from datetime import datetime
dt = datetime(2024, 1, 6, 12, 0, 0)
# Modifying the date and time requires creating a new object
new_dt = dt.replace(hour=13)
print(dt) # Output: 2024-01-06 12:00:00
print(new_dt) # Output: 2024-01-06 13:00:00
2. قابل استفاده به عنوان کلید در دیکشنریها (Hashable)
اشیاء از این نوعها قابل هشکردن هستند، به این معنی که میتوانند به عنوان کلید در دیکشنریها (dictionary) و مجموعهها (sets) استفاده شوند. این ویژگی برای جستجو، ذخیرهسازی و مدیریت دادهها مفید است.
مثال:
from datetime import datetime dt = datetime(2024, 1, 6, 12, 0, 0) my_dict = {dt: "Some value"} print(my_dict[dt]) # Output: Some value
3. پشتیبانی از Pickling (پیکِل کردن)
اشیاء از این نوعها از قابلیت پیکِل کردن پشتیبانی میکنند. پیکِل کردن فرآیند تبدیل اشیاء به یک فرمت بایت برای ذخیرهسازی یا انتقال است که میتواند دوباره به شیء اصلی تبدیل شود (unpickling). این ویژگی به برنامهنویسان این امکان را میدهد که اشیاء تاریخ و زمان را به راحتی ذخیره کرده و در برنامههای توزیعشده یا بینپلتفرمی استفاده کنند.
مثال:
import pickle from datetime import datetime dt = datetime(2024, 1, 6, 12, 0, 0) # Pickling the object with open('date_time.pkl', 'wb') as f: pickle.dump(dt, f) # Loading the object from the file with open('date_time.pkl', 'rb') as f: loaded_dt = pickle.load(f) print(loaded_dt) # Output: 2024-01-06 12:00:00
DateTime در پایتون