وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مقایسه Datetimes در پایتون با و بدون Timezones

0 12
زمان لازم برای مطالعه: 3 دقیقه


معرفی

هنگام کار با تاریخ‌ها، اغلب، می‌خواهید بدانید که آیا تاریخ معین قبل یا بعد از تاریخ دیگری آمده است. با مقایسه تاریخ ها می توانیم این پاسخ ها را دریافت کنیم.

در این مقاله روش استفاده از پایتون را یاد خواهیم گرفت 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() تابع کار می کند

پیشنهاد می‌کنیم بخوانید:  راهنمای Heaps در پایتون

در اینجا، ما از آن استفاده کرده ایم 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید