از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مقایسه Datetimes در پایتون با و بدون Timezones
سرفصلهای مطلب
معرفی
هنگام کار با تاریخها، اغلب، میخواهید بدانید که آیا تاریخ معین قبل یا بعد از تاریخ دیگری آمده است. با مقایسه تاریخ ها می توانیم این پاسخ ها را دریافت کنیم.
در این مقاله روش استفاده از پایتون را یاد خواهیم گرفت datetime
ماژول برای ایجاد و مقایسه تاریخ های ساده (بدون اطلاعات منطقه زمانی) و آگاهانه (با اطلاعات منطقه زمانی).
برای مقایسه تاریخ ها، از عملگرهای مقایسه در پایتون استفاده می کنیم: <, >, ==, <=, >=, !=
.
توجه داشته باشید: این datetime
ماژول دو روش برای ایجاد شی date دارد – datetime.datetime
و datetime.date
. فقط می توان مقایسه کرد روی اشیاء ایجاد شده از همان کلاس:
datetime.datetime.now() >= datetime.date.today()
این منجر به یک TypeError
:
TypeError: can't compare datetime.datetime to datetime.date
مقایسه زمانهای منطقه زمانی-نایو
بیایید با مقایسه شروع کنیم تاریخ های ساده لوحانه، که هیچ اطلاعات منطقه زمانی ندارند. اول، ما می خواهیم import را datetime
مدول:
from datetime import datetime, date
سپس، بیایید چند تاریخ ایجاد کنیم که بتوانیم با هم مقایسه کنیم:
date1 = date(1995, 3, 20)
date2 = date(2020, 1, 1)
dob_a = datetime(1995, 3, 20)
dob_b = datetime(2020, 1, 1)
مقایسه این اشیاء به آسانی مقایسه مثلاً اعداد صحیح است. آ تاریخ است کمتر از دیگری، اگر زمان آن بر دیگری مقدم باشد.
در مورد ما، date1
در نظر گرفته شده است کمتر (<
) نسبت به. تا date2
چون در زمان دورتر است:
print("date1 comes before date2?", date1 < date2)
print("date1 comes after date2?", date1 > date2)
print("date1 is equal to date2?", date1 == date2)
این منجر به:
date1 comes before date2? True
date1 comes after date2? False
date1 is equal to date2? False
اکنون، شما معمولاً این منطق را در برخی از دستورات کنترل جریان ترکیب میکنید:
if dob_a > dob_b:
print("person a is older than person b")
else:
print("person b is older than person a")
این منجر به:
person b is older than person a
مقایسه تاریخهای آگاه از منطقه زمانی
مناطق زمانی می توانند کمی اوضاع را پیچیده کنند، هرچند، خوشبختانه، ما می توانیم دقیقاً همان منطق را در مقایسه اعمال کنیم. تنها تفاوت این است که ما با آن کار می کنیم تاریخ های آگاه – تاریخ هایی با اطلاعات اضافی درباره منطقه زمانی که در آن قرار دارند:
from datetime import datetime
import pytz
tz_ny= pytz.timezone('America/New_York')
tz_lon = pytz.timezone("Europe/London")
datetime = datetime(2010, 4, 20, 23, 30, 0)
date_with_timezone_1 = tz_ny.localize(datetime)
date_with_timezone_2 = tz_lon.localize(datetime)
print(date_with_timezone_1)
print(date_with_timezone_2)
print(date_with_timezone_1 == date_with_timezone_2)
اجرای این کد نتیجه می دهد:
False
در حالی که این بیانیه:
print(date_with_timezone_1 > date_with_timezone_2)
منجر به:
True
حالا این نتیجه ممکن است برای شما کمی عجیب باشد. ما این دو زمان تاریخ را با هم مقایسه می کنیم:
2010-04-20 23:30:00-04:00 # date_with_timezone_1
2010-04-20 23:30:00+01:00 # date_with_timezone_2
به طور شهودی، به نظر می رسد date_with_timezone_2
در واقع بزرگتر از date_with_timezone_1
. با این حال، بیایید نگاهی به چگونگی localize()
تابع کار می کند
در اینجا، ما از آن استفاده کرده ایم pytz
کتابخانه تا تاریخ های ساده لوح ما را آگاه کند. ما یک شی منطقه زمانی برای نیویورک ساخته ایم (tz_ny
و یک شی منطقه زمانی برای لندن (tz_lon
).
سپس، برای تزریق اطلاعات منطقه زمانی به ما datetime
شی، ما اجرا کرده ایم localize()
عملکرد و نتیجه را در آن بسته بندی کرد date_with_timezone_1
و date_with_timezone_2
.
ما در ساعت 11:30 شب قرار داده ایم localize()
، که به نوبه خود ساعت تاریخ را برای ساعت 11:30 شب در نیویورک و 11:30 بعد از ظهر در لندن ایجاد کرد. برای رسیدن از ساعت 23:30 در نیویورک تا ساعت 23:30 در لندن، باید 4 ساعت اضافه کنید. زمان بیشتری گذشت برای رساندن نیویورک به ساعت 11:30 شب، نسبت به رسیدن لندن به ساعت 11:30 شب. بنابراین، تاریخ مربوط به نیویورک در ساعت 23:30 بزرگتر از ساعت تاریخ مربوط به لندن در ساعت 23:30 است.
لطفاً هنگام کار با مناطق زمانی به این روش، این رفتار را در نظر داشته باشید.
با این حال، شایان ذکر است که مقایسه تاریخ های آگاه با تاریخ های ساده منجر به خطا می شود:
date_with_timezone = tz_ny.localize(datetime)
print(datetime == date_without_timezone)
این منجر به خطای زیر می شود:
TypeError: can't compare offset-naive and offset-aware datetimes
بنابراین برای مقایسه اشیاء datetime، هر دو شی باید هر دو ساده و یا آگاه باشند.
نتیجه
در این مقاله، روشهای مقایسه تاریخهای آگاه از منطقه زمانی و منطقه زمانی ساده در پایتون را مورد بحث قرار دادهایم، همچنین به مشکلات احتمالی که ممکن است هنگام مقایسه تاریخها و راهحلهای احتمالی با آنها برخورد کنیم، پرداختهایم.
در صورت داشتن هرگونه سوال یا مشارکت، لطفاً آنها را در بخش نظرات زیر بنویسید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-13 06:16:04