برای کار با زمان سه ماژول در کتابخانه استاندارد زبان برنامهنویسی پایتون آماده شده است؛ time ،datetime و calendar. این درس به شرح کامل ماژول datetime پایتون اختصاص یافته است. ماژول datetime پایتون انواع یا کلاسهای زیادی را برای ایجاد اشیا مرتبط با زمان و دستکاری (manipulating) آنها فراهم آورده است، همچون time ،date ،timezone ،timedelta و datetime که همگی در این درس بررسی خواهند شد.
این ماژول [اسناد پایتون] از کتابخانه استاندارد زبان برنامهنویسی پایتون چند نوع یا کلاس برای کار با زمان (ساعت و تاریخ) را در اختیار برنامهنویس قرار میدهد:
کلاسdate: مناسب برای ایجاد شی تاریخ در پایتون میباشد که اشیا آن هیچ آگاهی نسبت به ساعت و منطقه زمانی (Time zone) [ویکیپدیا] نخواهند داشت و تنها مربوط به روزی خاص بر اساس گاهشماری میلادی (Gregorian calendar) [ویکیپدیا] میباشند.
کلاسtime: مناسب برای ایجاد شی ساعت در پایتون میباشد و اشیا این کلاس هیچ آگاهی نسبت به تاریخ یا روز خاصی ندارند و تنها حاوی یک ساعت مشخص از شبانهروز خواهند بود.
کلاسdatetime: ترکیبی از دو کلاس date و time که اشیای آن میتوانند نسبت به یک زمان (تاریخ و ساعت) مشخص آگاهی کامل داشته باشند.
در ادامه به بررسی این سه کلاس خواهیم پرداخت، اما پیش از این کار لازم است با دو کلاس دیگر از ماژول datetime آشنا شویم، timedelta و tzinfo.
در زبان برنامهنویسی پایتون از اشیای کلاس timedelta [اسناد پایتون] برای بیان «مدت زمان» (duration) مشخص یا اختلاف بین دو تاریخ یا زمان استفاده میشود. الگوی نمونهسازی از این کلاس به شکل زیر است:
با نمونهسازی از این کلاس و ارسال آرگومانهای دلخواه، براساس تمام واحدهای پرتکرار از زمان یا حتی ترکیبی از آنها میتوانیم یک مدتزمان در سیستم زمانی پایتون ایجاد کنیم؛ هفته (weeks)، روز (days)، ساعت (hours)، دقیقه (minutes)، ثانیه (seconds)، میلیثانیه (milliseconds یا همان 0.001 ثانیه) و میکروثانیه (microseconds یا همان 0.000001 ثانیه). تمامی این مقادیر اختیاری و با مقدار پیشفرض 0 هستند که میتوانند از نوع int یا float، مثبت یا منفی باشند:
توجه داشته باشید که از تمام انواع آرگومانی که ارسال میکنید این تنها seconds ،days و microseconds هستند که دارای attribute متناظر بوده و قابل دسترس میباشند. در واقع تمامی مقادیر ارسالی در زمان نمونهسازی با یکدیگر ترکیب شده و در نهایت به این سه attribute تبدیل میشوند. به مقداردهی در زمان نمونهسازی و نیز به خروجی مقادیر از نمونه کدهای بالا توجه نمایید.
همچنین از نسخه 3.2 پایتون میتوانید با استفاده از متد total_seconds [اسناد پایتون] کل مدت زمان ذخیره شده در شی timedelta را در واحد ثانیه دریافت نمایید:
هر وقت که صحبت از ساعت و زمان باشد، «منطقه زمانی» (Time zone) نیز جزئی از گفتگو خواهد بود. در زبان برنامهنویسی پایتون کلاس tzinfo از ماژول datetime امکان ایجاد منطقه زمانی را فراهم آورده است [اسناد پایتون]. tzinfo در واقع یک کلاس Abstract (درس نوزدهم) میباشد که نمیتوان از آن نمونهسازی و شی ایجاد کرد ولی میتوان به کمک آن، کلاس منطقه زمانی دلخواه خود را ایجاد نماییم. برای مشاهده اجزا و نکات مربوط به پیادهسازی منطقه زمانی دلخواه میتوانید به مستندات زبان برنامهنویسی پایتون مراجعه نمایید.
اشتباه نکنید، در اکثر مواقع نیازی به پیادهسازی یک کلاس منطقه زمانی در پایتون نمیباشد. چرا که از قبل کلاس timezone از ماژول datetime [اسناد پایتون] توسط این زبان فراهم آورده شده است. این کلاس یک subclass از datetime.tzinfo بوده و مبنای محاسبه منطقه زمانی در آن UTC [ویکیپدیا] میباشد. UTC یک قرارداد جهانی است و این کلاس به تنهایی تمامی نیازهای معمول ما نسبت به ثبت منطقه زمانی در پایتون را برطرف میسازد. برای مثال، در سراسر ایران منطقه زمانی یکسان میباشد و به صورت استاندارد از مبنای UTC محاسبه میگردد؛ به این صورت که در شش ماه نخست سال برابر UTC+4:30 - با شمارش ساعت تابستانی [ویکیپدیا] - و در شش ماه دوم از سال این مقدار برابر UTC+3:30 خواهد بود [ویکیپدیا Iran Standard Time (IRST)].
توجه
در زبان برنامهنویسی پایتون اشیای مرتبط با زمان براساس توانایی آگاهی آنها از منطقه زمانی (Time zone) به دو دسته «آگاه» (aware) و «ساده» (naive) تقسیمبندی میشوند. بر همین اساس اشیای کلاس date از نوع naive و اشیای دو کلاس time و datetime میتوانند برحسب شرایط aware یا naive باشند.
که در آن پارامتر offset یک شی از نوع datetime.timedelta میباشد که میبایست حاوی فاصله زمانی منطقه مورد نظر ما از مبدا UTC باشد (مثبت (جلوتر) یا منفی (عقبتر)) و name نیز یک نام دلخواه و اختیاری برای شناسایی منطقه زمانی ایجاد شده میباشد:
شی tz ایجاد شده در نمونه کد بالا، بیانگر منطقه زمانی UTC+4:30 (Asia/Tehran، با شمردن ساعت تابستانی) میباشد. به عنوان مثالی دیگر، ایجاد شی برای منطقه زمانی UTC-05:00 (EST، بدون شمردن ساعت تابستانی) [ویکیپدیا] به صورت زیر میباشد:
>>> tz=timezone(timedelta(hours=-5),'Eastern Time Zone')
توجه
به منظور شفافسازی بیشتر و درک اهمیت منطقه زمانی، اگر فرض کنیم ساعت در یک لحظه به وقت UTC برابر 12:00 است آنگاه همان لحظه ساعت به وقت UTC-05:00 برابر 07:00 و به وقت UTC+04:30 برابر 16:30 خواهد بود.
از طریق شی datetime.timezone چهار متد زیر در دسترس خواهد بود، در واقع اینها متدهایی هستند که توسط datetime.timezone از کلاس datetime.tzinfo ارثبرده و Override شدهاند:
متدutcoffset(dt) [اسناد پایتون]: ورودی نادیده گرفته میشود و خروجی یک شی datetime.timedelta برابر اختلاف فاصله زمانی از مبنا UTC میباشد.
متدtzname(dt) [اسناد پایتون]: نام منطقه زمانی ارسال شده در زمان نمونهسازی را برمیگرداند. چنانچه در زمان نمونهسازی مقداری ارسال نشده و نام برابر None باشد، یک نام به صورت خودکار تولید خواهد شد. ورودی میتواند None یا یک شی aware از نوع datetime.datetime باشد.
متدdst(dt) [اسناد پایتون]: خروجی این متد برای اشیا datetime.timezone همواره برابر None خواهد بود.
متدfromutc(dt) [اسناد پایتون]: ورودی میبایست یک شی aware از نوع datetime.datetime باشد و خروجی نیز برابر dt+offset خواهد بود. در واقع این متد یک شی datetime.datetime دریافت و منطقه زمانی آن را بر اساس اطلاعات خود تغییر و برمیگرداند.
این کلاس حاوی یک Class attribute نیز میباشد. utc [اسناد پایتون] که برابر یک شی datetime.timezone جدید براساس منطقه زمانی UTC میباشد. یعنی: timezone(timedelta(0))
این کلاس [اسناد پایتون] نمایش ایجاد یک شی تاریخ بر اساس گاهشماری میلادی (Gregorian calendar) در زبان برنامهنویسی پایتون میباشد. در واقع کاربرد این شی، نگهداری از اطلاعات مربوط به یک تاریخ مشخص خواهد بود (همچون: سال، ماه و روز). در ادامه این بخش به بررسی چگونگی ایجاد این شی و اجزای آن خواهیم پرداخت.
برای نمونهسازی از کلاس datetime.date میبایست سه Instance attribute آن را مقداردهی نماییم. این سه attribute عبارتند از:
year: از نوع int میباشد و مقداری برابر با سال مورد نظر خواهد داشت. این مقدار میبایست کمتر یا برابر datetime.MAXYEAR [اسناد پایتون] و همچنین بیشتر یا برابر datetime.MINYEAR [اسناد پایتون] باشد:
MINYEAR<=year<=MAXYEAR
month: از نوع int میباشد و مقداری برابر با ماه مورد نظر خواهد داشت که میبایست عددی از بین اعداد 1 تا 12 باشد.
day: از نوع int میباشد و مقداری برابر با روزی مشخص در ماه ذکر شده خواهد داشت.
باید توجه داشت که مقدار این سه attribute پس از نمونهسازی قابل تغییر نخواهد بود و به اصطلاح read-only هستند:
>>> d.year=2022Traceback (most recent call last):
File "<stdin>", line 1, in <module>AttributeError: attribute 'year' of 'datetime.date' objects is not writable
۲- با استفاده از کلاس متدfromisoformat(date_string) [اسناد پایتون] از کلاس datetime.date (البته از نسخه 3.7 پایتون به بعد)، در تعریف این متد یک پارامتر از نوع str قرار داده شده است و این متد یک تاریخ را بر اساس قالب استاندارد ISO 8601 [ویکیپدیا] دریافت و یک شی معادل از کلاس datetime.date را برمیگرداند. این قالب برابر YYYY-MM-DD میباشد که از سمت چپ معرف چهار رقم سال، یک خط تیره، دو رقم ماه، یک خط تیره و دو رقم روز ماه میباشد؛ همانند: 07-04-2020:
۳- با استفاده از کلاس متد(ordinal)fromordinal [اسناد پایتون] از کلاس datetime.date، در تعریف این متد یک پارامتر از نوع int قرار داده شده است که در واقع این متد معادل یک proleptic Gregorian ordinal [ویکیپدیا] یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.date را برمیگرداند. این مقدار برابر شمارش تعداد روزها از تاریخ یکم ژانویه سال یک میلادی تا تاریخ مورد نظر میباشد:
۴- با استفاده از کلاس متد(timestamp)fromtimestamp [اسناد پایتون] از کلاس datetime.date، در تعریف این متد یک پارامتر از نوع int قرار داده شده است که در واقع این متد معادل POSIX timestamp [ویکیپدیا] یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.date را برمیگرداند. این مقدار برابر شمارش تعداد ثانیهها به منطقه زمانی UTC از ساعت ۰۰:۰۰:۰۰ یکم ژانویه سال ۱۹۷۰ میلادی تا تاریخ مورد نظر میباشد:
توجه داشته باشید استفاده از این متد تنها محدود به سالهای مابین ۱۹۷۰ تا ۲۰۳۸ میباشد. چرا که این متد از تابع localtime یا gmtime در زبان برنامهنویسی C استفاده میکند که از سال ۲۰۳۸ به بعد مقدار timestamp از نوع signed 32-bit integer در این زبان، Overflow خواهد داشت! [ویکیپدیا: Year 2038 problem]
۵- با استفاده از کلاس متدfromisocalendar [اسناد پایتون] از کلاس datetime.date (البته از نسخه 3.8 پایتون به بعد)، در تعریف این متد سه پارامتر از نوع int قرار داده شده است که از سمت چپ به ترتیب معرف سال، شماره هفته در سال و شماره روز از هفته مورد نظر میباشند. در واقع این متد معادل ISO calendar [ویکیپدیا] یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.date را برمیگرداند. در این استاندارد، یک سال تقریبا شامل ۵۲ هفته میباشد که روزهای هر هفته نیز از روز دوشنبه (Monday) با شماره یک محاسبه میگردد (دوشنبه:۱، سهشنبه:۲، ... یکشنبه:۷):
fromisocalendar(year,week,day)
>>> importdatetime>>> d=datetime.date.fromisocalendar(2021,14,3)# Wednesday, April 7, 2021
>>> fromdatetimeimportdate>>> d=date.fromisocalendar(2021,14,3)# Wednesday, April 7, 2021
دو شی datetime.date پایتون قابلیت مقایسه با یکدیگر را دارند. همچنین میتوان با استفاده از یک شی datetime.timedelta مقدار یک شی date را به جلو یا عقب هدایت کرد:
متد(format)strftime [اسناد پایتون]: این متد بسیار پرکاربرد است و عملکرد آن به این صورت میباشد که یک قالب (format) را دریافت و معادل str از شی مورد نظر را بر اساس ساختار آن قالب برمیگردادند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت میباشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
این کلاس [اسناد پایتون] نمایش ایجاد یک شی ساعت در لحظهای مشخص از شبانهروز در زبان برنامهنویسی پایتون میباشد. در واقع کاربرد این شی، نگهداری از اطلاعات مربوط به یک ساعت مشخص خواهد بود (همچون: ساعت، دقیقه، ثانیه و...). در ادامه این بخش به بررسی چگونگی ایجاد این نوع شی و اجزای آن خواهیم پرداخت.
همانطور که از تعریف این کلاس مشخص است، برای نمونهسازی از کلاس datetime.time میتوان شش Instance attribute آن را مقداردهی نماییم. این شش attribute که همگی اختیاری و دارای مقدار پیشفرض هستند عبارتند از:
hour: از نوع int میباشد و مقداری برابر با ساعت مورد نظر خواهد داشت. این مقدار میبایست عددی از بین اعداد 0 تا 24 باشد : range(24)
minute: از نوع int میباشد و مقداری برابر با دقیقه مورد نظر خواهد داشت که میبایست عددی از بین اعداد 0 تا 60 باشد : range(60)
second: از نوع int میباشد و مقداری برابر با ثانیه مورد نظر خواهد داشت که میبایست عددی از بین اعداد 0 تا 60 باشد : range(60)
microsecond: از نوع int میباشد و مقداری برابر با میکروثانیه مورد نظر خواهد داشت که میبایست عددی از بین اعداد 0 تا 1000000 باشد : range(1000000) - هر میکروثانیه برابر با 0.000001 ثانیه میباشد.
tzinfo: معرف منطقه زمانی (Time zone) است که مقدار پیشفرض آن None میباشد و میتواند یک شی از زیرکلاسهای (subclass) کلاس tzinfo [اسناد پایتون] را بپذیرد.
fold: از نسخه 3.6 پایتون به بعد اضافه شده است و تنها با استفاده از شیوه نام=مقدار قابل مقداردهی میباشد. این پارامتر در واقع یک نشانگر برای ابهامزدایی در بیان ساعت میباشد. برای مثال از کاربرد این پارامتر وضعیت «ساعت تابستانی» [ویکیپدیا] را تصور کنید. ساعت رسمی ایران هر سال در ساعت ۲۴ روز اول فروردین ماه یک ساعت به جلو کشیده میشود و در ساعت ۲۴ روز سیام شهریور ماه به حالت قبلی برگردانده میشود، اکنون در روز سیام شهریور ماه ساعت ۲۳ تا ۲۴ دوبار تکرار میشود، در این مواقع میتوان از این پارامتر برای مشخص کردن وضعیت ساعت استفاده کرد. به این صورت که مقدار 0 بیانگر وضعیت قبل از تغییر و 1 بیانگر وضعیت پس از تغییر میتواند باشد.
باید توجه داشت که مقدار این شش attribute پس از نمونهسازی قابل تغییر نخواهد بود و به اصطلاح read-only هستند:
>>> t.hour=14Traceback (most recent call last):
File "<stdin>", line 1, in <module>AttributeError: attribute 'hour' of 'datetime.time' objects is not writable
۲- با استفاده از کلاس متد(time_string)fromisoformat [اسناد پایتون] از کلاس datetime.time (البته از نسخه 3.7 پایتون به بعد)، در تعریف این متد یک پارامتر از نوع str قرار داده شده است که در واقع این متد یک ساعت را براساس قالب کلی استاندارد ISO 8601 [ویکیپدیا] دریافت و یک شی معادل از کلاس datetime.time را برمیگرداند. این قالب معمولا برابر hh:mm:ss میباشد که از سمت چپ معرف دو رقم ساعت، دونقطه (colon)، دو رقم دقیقه، دونقطه (colon) و دو رقم ثانیه میباشد؛ همانند: 04:23:01 - قالبهای قابل پذیرش به صورت زیر خواهند بود:
در کد بالا درست است که هر دو شی t_et و t_ir حاوی ساعت دوازده میباشند ولی باید به این نکته توجه داشت، در حالی t_et ساعت دوازده را نمایش میدهد که نسبت به منطقه زمانی مبنا (UTC) پنج ساعت عقبتر است؛ در واقع نه ساعت و سی دقیقه بعد، t_ir به زمانی خواهد رسید که t_et اکنون آن را نمایش میدهد!
همچنین توجه داشته باشید که نمیتوان از عملگرهایی همچون - یا + برای اشیای datetime.time استفاده کرد.
>>> fromdatetimeimporttimedelta,timezone,time>>> tz=timezone(timedelta(hours=-5),'Eastern Time Zone')>>> t=time(hour=22,minute=22,second=22,tzinfo=tz)>>> tdatetime.time(22, 22, 22, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=68400), 'Eastern Time Zone'))>>> tz_teh=timezone(timedelta(hours=4,minutes=30),'Asia/Tehran')>>> t.replace(tzinfo=tz_teh)datetime.time(22, 22, 22, tzinfo=datetime.timezone(datetime.timedelta(seconds=16200), 'Asia/Tehran'))
باید توجه داشت که با تغییر منطقه زمانی یک شی datetime.time، اطلاعات مربوط به ساعت، در آن تغییری نخواهند داشت. چرا که وظیفه این متد تنها جایگزینی مقادیر میباشد و با جایگزینی منطقه زمانی، تغییری در زمان ثبت شده ایجاد نمیگردد.
متدisoformat [اسناد پایتون]: معادل مقدار ساعت شی را در قالب استاندارد ISO 8601 برمیگرداند:
isoformat(timespec='auto')
این متد یک پارامتر اختیاری دارد که میتواند یکی از مقادیر millisecondsminuteshoursautomicroseconds را دریافت کند. مقدار این پارامتر قالب خروجی را مشخص میکند:
متد(format)strftime [اسناد پایتون]: این متد بسیار پرکاربرد است و عملکرد آن به این صورت میباشد که یک قالب (format) را دریافت و معادل str از شی مورد نظر را بر اساس ساختار آن قالب برمیگردادند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت میباشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
اشیای این کلاس پرکاربردترین و رایجترین نوع از ماژول datetime هستند چرا که به طور هم زمان نسبت به ساعت (Time) و تاریخ (Date) آگاهی دارند [اسناد پایتون]. اساس محاسبه تاریخ در این کلاس نیز همانند datetime.date بر اساس گاهشماری میلادی (Gregorian calendar) و اساس محاسبه ساعت نیز همانند کلاس datetime.time به ازای هر شبانهروز دقیقا برابر 24*3600 ثانیه میباشد.
۲- با استفاده از کلاس متدtoday [اسناد پایتون]، این متد زمان لحظه جاری سیستم را بدون امکان ثبت منطقه زمانی (tzinfo=None) در قالب یک شی از کلاس datetime.datetime برمیگرداند:
۳- با استفاده از کلاس متد(tz=None)now [اسناد پایتون]، عملکرد این متد نیز همانند today میباشد با این تفاوت که میتوان یک شی منطقه زمانی نیز به صورت آرگومان به آن ارسال و ثبت نمود:
توجه داشته باشید ارسال شی منطقه زمانی (tz) در نمونه کد بالا باعث تغییر در زمان نشد. علت این امر نیز مربوط به منطقه زمانی سیستمی است که برنامه بر روی آن اجرا میشود، در این سیستم منطقه زمانی بر روی 04:30+UTC (وقت ساعت تابستانی، تهران) تنظیم بوده که کاملا برابر با مقدار tz ارسال شده میباشد.
۴- با استفاده از کلاس متدutcnow [اسناد پایتون]، خروجی این متد همانند خروجی datetime.now(timezone.utc) میباشد. یعنی زمان لحظه جاری سیستم را بر اساس منطقه زمانی UTC برمیگرداند ولی با این تفاوت که مقدار پارامتر tzinfo آن برابر None خواهد بود:
۵- با استفاده از کلاس متدfromtimestamp [اسناد پایتون]، در تعریف این متد یک پارامتر اختیاری (tz) از نوع tzinfo و یک پارامتر اجباری (timestamp) از نوع int قرار داده شده است. این متد معادل POSIX timestamp [ویکیپدیا] یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.datetime را برمیگرداند. این مقدار برابر شمارش تعداد ثانیهها به منطقه زمانی UTC از ساعت ۰۰:۰۰:۰۰ یکم ژانویه سال ۱۹۷۰ میلادی تا تاریخ مورد نظر میباشد.
توجه داشته باشید استفاده از این متد تنها محدود به سالهای مابین ۱۹۷۰ تا ۲۰۳۸ میباشد. چرا که این متد از تابع localtime یا gmtime در زبان برنامهنویسی C استفاده میکند که از سال ۲۰۳۸ به بعد مقدار timestamp از نوع signed 32-bit integer در این زبان، Overflow خواهد داشت! [ویکیپدیا: Year 2038 problem]
۶- با استفاده از کلاس متد(timestamp)utcfromtimestamp [اسناد پایتون]، خروجی این متد نیز همانند خروجی کلاس متد زیر بوده و معادل POSIX timestamp یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.datetime را بر مبنای منطقه زمانی UTC برمیگرداند. ولی با این تفاوت که مقدار پارامتر tzinfo آن برابر None خواهد بود:
توجه داشته باشید استفاده از این متد تنها محدود به سالهای مابین ۱۹۷۰ تا ۲۰۳۸ میباشد. چرا که این متد از تابع localtime یا gmtime در زبان برنامهنویسی C استفاده میکند که از سال ۲۰۳۸ به بعد مقدار timestamp از نوع signed 32-bit integer در این زبان، Overflow خواهد داشت! [ویکیپدیا: Year 2038 problem]
۷- با استفاده از کلاس متد(ordinal)fromordinal [اسناد پایتون]، در تعریف این متد یک پارامتر از نوع int قرار داده شده است که در واقع این متد معادل یک proleptic Gregorian ordinal [ویکیپدیا] یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.datetime را برمیگرداند. این مقدار برابر شمارش تعداد روزها از تاریخ یکم ژانویه سال یک میلادی تا تاریخ مورد نظر میباشد. باید توجه داشت مقادیر مربوط به ساعت همانند minute ،hour یا tzinfo شی ایجاد شده برابر None خواهد بود:
۸- با استفاده از کلاس متدfromisocalendar [اسناد پایتون] (البته از نسخه 3.8 پایتون به بعد)، در تعریف این متد سه پارامتر از نوع int قرار داده شده است که از سمت چپ به ترتیب معرف سال، شماره هفته در سال و شماره روز از هفته مورد نظر میباشند. در واقع این متد معادل ISO calendar [ویکیپدیا] یک تاریخ مشخص را دریافت و یک شی معادل از کلاس datetime.datetime را برمیگرداند. در این استاندارد، یک سال تقریبا شامل ۵۲ هفته میباشد که روزهای هر هفته نیز از روز دوشنبه (Monday) با شماره یک محاسبه میگردد (دوشنبه:۱، سهشنبه:۲، ... یکشنبه:۷). باید توجه داشت مقادیر مربوط به ساعت همانند minute ،hour یا tzinfo شی ایجاد شده برابر None خواهد بود:
۹- با استفاده از کلاس متدcombine(date,time,tzinfo) [اسناد پایتون]، در تعریف این متد سه پارامتر قرار داده شده است که از سمت چپ به ترتیب از نوع datetime.time ،datetime.date و datetime.tzinfo میباشند. در واقع این متد یک شی datetime.date و datetime.time جداگانه را دریافت و با یکدیگر ترکیب و یک شی datetime.datetime تولید میکند. پارامتر tzinfo اختیاری بوده و از نسخه 3.6 پایتون به این متد اضافه گردیده است که در صورت ارسال آرگومان متناظر به آن، این مقدار به عنوان منطقه زمانی شی خروجی در نظر گرفته خواهد شد؛ در غیر این صورت از منطقه زمانی شی datetime.time استفاده خواهد شد:
۱۰- با استفاده از کلاس متدfromisoformat(date_string) [اسناد پایتون] (البته از نسخه 3.7 پایتون به بعد)، در تعریف این متد یک پارامتر از نوع str قرار داده شده است و این متد یک زمان مشخص را بر اساس قالب استاندارد ISO 8601 [ویکیپدیا] دریافت و یک شی معادل از کلاس datetime.datetime را برمیگرداند:
الگوی بالا حالتهای قابل پذیرش از قالب استاندارد ISO 8601 را برای این متد نمایش میدهد که در این الگو به جای * هر کاراکتری میتواند قرار بگیرد و بخشهای داخل براکت ([]) اختیاری هستند. به چند نمونه کد زیر نیز توجه نمایید:
۱۱- با استفاده از کلاس متدstrptime [اسناد پایتون]، تعریف این متد به صورت زیر میباشد:
datetime.strptime(date_string,format)
این متد بسیار پرکاربرد بوده و عملکرد آن به این صورت میباشد که یک زمان مشخص را از نوع str به همراه قالب آن زمان دریافت و یک شی از کلاس datetime.datetime برمیگرداند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت میباشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
دو شی datetime.datetime پایتون قابلیت مقایسه با یکدیگر را دارند اگر هر دو naive یا هر دو aware باشند. همچنین میتوان با استفاده از یک شی datetime.timedelta مقدار یک شی datetime را به جلو یا عقب هدایت کرد:
در کد بالا درست است که هر دو شی t_et و t_ir حاوی یک تاریخ و یک ساعت (12:00:0015-04-2021) میباشند ولی باید به این نکته توجه داشت، در حالی t_et ساعت دوازده را نمایش میدهد که نسبت به منطقه زمانی مبنا (UTC) پنج ساعت عقبتر است؛ در واقع نه ساعت و سی دقیقه بعد، t_ir به زمانی خواهد رسید که t_et اکنون آن را نمایش میدهد!
متدastimezone(tz=None) [اسناد پایتون]: با استفاده از این متد میتوان منطقه زمانی شی مورد نظر را تغییر و به صورت یک شی جدید datetime.datetime دریافت کرد:
توجه داشته باشید استفاده از این متد تنها محدود به سالهای مابین ۱۹۷۰ تا ۲۰۳۸ میباشد. چرا که این متد از تابع localtime یا gmtime در زبان برنامهنویسی C استفاده میکند که از سال ۲۰۳۸ به بعد مقدار timestamp از نوع signed 32-bit integer در این زبان، Overflow خواهد داشت! [ویکیپدیا: Year 2038 problem]
متدtoordinal [اسناد پایتون]: معادل proleptic Gregorian ordinal از شی مورد نظر را برمیگرداند:
توجه داشته باشید که وظیفه این متد تنها جایگزینی مقادیر میباشد و با جایگزینی منطقه زمانی، تغییری در زمان ثبت شده ایجاد نمیگردد.
متد(format)strftime [اسناد پایتون]: این متد بسیار پرکاربرد است و عملکرد آن به این صورت میباشد که یک قالب (format) را دریافت و معادل str از شی مورد نظر را بر اساس ساختار آن قالب برمیگردادند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت میباشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
پیشتر کمی با این دو متد پرکاربرد آشنا شدهایم، ولی به صورت خلاصه میتوان این دو متد را اینگونه تعریف نمود:
متدstrftime(format): یک Instance method بوده و از جانب هر سه نوع شی date ،time و datetime پشتیبانی و قابل استفاده میباشد. این متد میتواند زمان شی مورد نظر را به یک قالب (format) مشخص از شی رشته str تبدیل نماید. str format time
متدstrptime(date_string,format): یک Class method بوده و تنها از جانب کلاس datetime پشتیبانی و قابل استفاده میباشد. این متد میتواند زمان درج شده در یک قالب (format) مشخص از شی رشته str را تجزیه (Parse) و به یک شی datetime.datetime تبدیل نماید. str parse time
در تعریف این متدها، منظور از format یک رشته متنی است که بر اساس کدهای خاصی تشکیل شده است و همینطور date_string نیز یک رشته متنی حاوی زمان در قالب ارايه شده توسط format میباشد. به نمونه کد زیر توجه نمایید:
برای مشاهده فهرست کدهای قابل استفاده و مفهوم آنها در format میتوانید به [اسناد پایتون] مراجعه نمایید ولی برخی از موارد پر استفاده به شرح زیر میباشند:
Y%: نمایش سال به همراه قرن (چهار رقمی)
y%: نمایش سال بدون قرن (دو رقمی)
m%: نمایش شماره ماه به صورت دورقمی: 01 ... 12
b%: نمایش نام ماه به صورت اختصار: Jan ... Dec
B%: نمایش نام ماه به صورت کامل: January ... December
d%: نمایش شماره روز از ماه به صورت دو رقمی: 01 ... 31
a%: نمایش نام روز هفته به صورت اختصار: Sat ... Fri
A%: نمایش نام روز هفته به صورت کامل: Saturday ... Friday
H%: نمایش ساعت (در سیستم شمارش تا 24) به صورت دو رقمی: 00 ... 23
I%: نمایش ساعت (در سیستم شمارش تا 12) به صورت دو رقمی: 00 ... 12
You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.