مقدمه
هر برنامه نویسی میدونه کار کردن با date ها چقدر می تونه سردردآور باشه. به خصوص زمانی که در زبان هایی مثل PHP بخایم مانور بدیم. زبان هایی مثل jS کتاب خونه های معرکه ای مثل Moment رو برای کار کردن با زمان ها دارن. زبان پایتان با به شدت ساده کردن قضیه کلاس جدید به نام datetime رو معرفی کرده که خیلی جذابه. کار کردن باهاش ساده است و به خصوص زمانی که میخایم با DB کار کنیم (مثلا قرار دادن تاریخ و زمان دقیق قراردادن یک رکورد) به کارمون میاد.
برای درک مفهوم شئ و کلاس باید به مفهوم شئ گرایی مسلط بشی. به زبان ساده یک شئ میشه مصداق یک کلاس. انگاری کلاس نقشه ساختمان باشه و شئ خود ساختمان. یا مثلا کلاس قالب کیک باشه و شئ خود کیک.
خوب قبل از هر چیزی مثل همه module های دیگه باید ماژول datetime رو import کنیم. دقت کن که ماژول datetime دقیقا برابر با کلاس datetime نیست. ماژول رو میشه این طوری تفسیر کرد: بسته ای که همه کلاس ها، متغیر ها و ملزومات کار کردن با یک موضوع رو داره. مثلا ماژول هایی مثل math که جعبه ابزار عملیات ریاضی و یا مثلا re که جعبه ابزار کار کردن با regular expression ها هستن.
import datetime as dt print(dt.datetime.now())
تو کد بالا ماژول datetime رو به عنوان dt وارد کردیم و حالا توی این ماژول مجددا کلاسی هست به اسم datetime که از متد now اش استفاده می کنیم برای پرینت گرفتن object ای که زمان حاضر رو نشون میده.
منظور از ویژگی همون attribute ها هست. (اسامی دیگری مثل field و property هم بهشون داده میشه) هر شئ datetime چندین ویژگی کاربردی داره که می تونیم ازش استفاده کنیم. برای مشاهده کامل این ویژگی ها می تونی کد زیر رو اجرا کنی:
import datetime as dt print(dir(dt.datetime))
ولی به صورت کلی مهمترین ویژگی های کلاس datetime این هاست: year, month, day, hour, minute, second (دقت کن که به صورت مفرد هست. مثلا seconds غلطه)
import datetime as dt date1 = dt.datetime.now() print(date1.day) print(date1.hour)
تو عالم برنامه نویسی فرمت کردن (با فرمت کردن یک درایو یا فلش اشتباه نگیر) یعنی شکل دادن و به شکل در آوردن یک چیزی. مثلا یک شئ datetime که دارای چندین attribute (مثلا روز، ماه، سال ...) هست رو تبدیل به یک رشته قشنگ و شیک کنیم و print بگیرم. چون مشخصا object برای انسان اون قدر ها قابل هضم نیست. فرمت کردن اشیاء کلاس datetime با متد strftime صورت می گیره (این طوری یاد بگیر: strftime = string format time):
import datetime as dt date1 = dt.datetime.now() print(date1.strftime("%Y-%m-%d")) # 2022-05-10
به اون Y% و اینا میگن Format codes که زیادن. مثلا Y برای عدد ۴ رقمی سال و m برای عدد دو رقمی ماه استفاده میشه. تو این لینک می تونی همه شون رو ببینی (مشخصا نیازی به حفظ کردنشون نیست. اکثرا مواقع با همین فرمتی که تو مثال هست سر و کار داریم).
متوجه شدی که datetime رو میشه به صورت date فرمت کرد! (مجددا تاکید میکنم هم کلاسی به اسم datetime داریم هم ماژولی به همین نام. به عبارتی کلاس datetime یکی از کلاس های موجود در ماژول datetime هست.)
بر خلاف format کردن که به معنی ایجاد string از object هست در parse کردن از string میخایم object در بیاریم. این جا از متد strptime استفاده می شه (این طوری یاد بگیر: string parse time)
مفهوم parse و format نه تنها تو مبحث date ها بلکه تو مباحث دیگه ای مثل json هم دیده میشه. مثلا تو زبان js برای تولید object از رشته json باید از متد JSON.parse استفاده کنیم.
import datetime as dt my_string_date = "2012-01-01" my_date_object = dt.datetime.strptime(my_string_date, "%Y-%m-%d") print(my_date_object.day)
همون طوری که مشاهده میکنی یک رشته که خودمون نوشته بودیم رو دادیم به متد strptime و علاوه بر این رشته دومی هم به این متد میدیم که فرمت رشته اولی هست. یعنی بهش میگیم آقا جان این از تاریخ به صورت رشته ایی و اینم از فرمتی که این تاریخ رشته ای داره. حالا بیا و این رشته رو که بر اساس این فرمت درست شده زحمت بکش برای ما تبدیل به object کن.
برای مشاهده تفاوت میان دو datetime از هم پایتان شاهکاری داره که واقعا لذت بخشه! می تونین خیلی راحت با استفاده از عملگر تفریق (همون - خودمون) دو شئ datetime رو از هم کسر کنین. حاصل این تفریق میشه یک شئ از کلاس timedelta که یک سری متد و ویژگی روش هست. به مثال دقت کن:
import datetime as dt date1 = dt.datetime.now() date2 = dt.datetime.strptime("2025-01-01","%Y-%m-%d") diff = date2 - date1 print(diff.seconds)
کلاس timedelta هم یک سری متد و یک سری attribute داره که ازشون استفاده میکنیم تا تفاوت بین دو datetime رو درک کنیم. بر خلاف کلاس datetime که ویژگی هاش مفرد بودن این جا ویژگی های کلاس timedelta جمع هستن. مثلا: days و seconds
حالا که به همه این مباحث مسلط شدی وقتشه شیرینی صبرت رو بچشی. می تونی به راحتی و بازم با عملگر های ساده ای مثل - و + یک شی از کلاس datetime رو با یک شئ از کلاس timedelta جمع یا تفریق کنی! حاصل این تفریق یا جمع یک شئ از کلاس datetime خواهد بود. شیرینی این راحتی در پایتان رو برنامه نویس هایی متوجه میشن که با زبان هایی مثل PHP کار کرده باشن.
import datetime as dt date1 = dt.datetime.now() date2 = dt.datetime.strptime("2025-01-01","%Y-%m-%d") date3 = dt.datetime.strptime("2035-01-01","%Y-%m-%d") diff = date3 - date2 date4 = date1 + diff print(date4.year)
ماژول datetime کلاس های دیگری مثل date و time هم داره (بر خلاف datetime که هم تاریخ هم زمان رو داره کلاس های date و time فقط یکیش رو دارن و محدود ترن) که اون ها هم کم و بیش شبیه به همین datetime خودمون هستن. مثلا کلاس date متد today رو داره. یاد داشتن datetime ها به این دلایل اهمیت داره:
امیدوارم از این مقاله لذت برده باشی. نظرت برام ارزشمنده و ممنون میشم اگه کامنت کنی.