سلام دوستان
با ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم.
زبان پایتون با روشهای مختلفی میتواند تاریخ و زمان را مدیریتکند. تبدیل انواع قالبهای زمان و تاریخ، یکی از رایجترین کارهاییاست که با انواع زبانهای برنامهنویسی انجام میپذیرد. پایتون نیز از این قانون مستثنینبوده و برای اینکار، از ماژولهای مخصوص زمان و تاریخ کمک میگیرد.
به طور اختصاصی، مبدا زمانی، ساعت 12:00 صبح، اول ژانویه سال 1970 در نظر گرفته شدهاست. در پایتون، فواصل زمانی، اعداد اعشاری بر حسب ثانیه یعنی تیک هستند.
در پایتون یک ماژول محبوب برای زمان وجود دارد که شامل توابعی برای کار با زمان و تبدیل انواع نمایش آنها به یکدیگر است. برای مثال، تابع ( ) time.time زمان فعلی سیستم را برحسب ثانیه، مبدا ذکرشده و برمیگرداند. به عنوان نمونه، شکل (13-1) را در نظر بگیرید.
با اجرایاین مثال، شکل (13-2) را خواهیمداشت.
محاسبات ریاضی زمان برحسب ثانیه، خیلی آسان است. با این حال، تاریخهای قبل از مبدا را نمیتوان به این شکل نشانداد. به نظر میرسد در آینده (حداقل تا تاریخ 2038) نیز نمیتوان با این روش به قبل از این تاریخ در یونیکس و ویندوز دسترسییافت.
خروجی بسیاری از توابع زمان در پایتون، یک تاپل شامل 9 عدد است که معادل ویژگیهای ساختار
( ) struct_time است. در شکل (13-3) به توضیح هر یک از آنها خواهیمپرداخت.
لازم به ذکر است که مثالهای این مطلب در بخشهای بعدی ذکر خواهندشد.
[1]Daylight savings
برای تبدیل زمان یک لحظه بر حسب ثانیه که مقداری اعشاری است به یک تاپل 9تایی زمان، کافیاست که این مقدار را وارد یک تابع زمانی کنیم. همان گونه که میبینید، در مثال شکل (13-4)، زمان فعلی را به عنوان ورودیِ زمان محلی[1]، وارد آن کردیم.
[1]Local Time
خروجی این مبدل بهشکل (13-5) است که یک تاپل 9تایی است و برای هرویژگی مقدار خاصیرا خواهیمداشت. بهدلیل طولانیبودن خروجی، آنرا در دو سطر نمایشدادیم.
نمایش زمان در قالب تیک، خیلی خوانا و قابل فهم نیست. از این رو میتوان با استفاده از تابع ( ) asctime که در شکل (13-6) میبینید، آن را بهبود داد.
با اجرای این تابع، زمان را در قالب شکل (13-7) خواهیمداشت که بسیار خواناتر و قابل فهمتر از قبل است.
ماژول تقویم میتواند طیف گستردهای از روشهای نمایش تقویم سالانه و ماهانه را فراهمکند. برای نمونه، در شکل (13-8)، میخواهیم تقویم ماه فوریه سال 2019 را چاپکنیم.
با اجرای این مثال، خروجی ما همانند شکل (13-9) خواهدبود.
حال که با کلیات مفهوم زمان آشنا شدید، در ادامه به بررسی هر چه بیشتر توابع و ماژولهای زمان، تاریخ و تقویم میپردازیم.
این ماژول محبوب پایتون میتواند توابعی را برای کار با زمان و تبدیل نمایشهای مختلف آنها به یکدیگر فراهمکند. از این رو میخواهیم تمامی روشهای موجود را بررسیکنیم.
13-6-1- تابع LocalTime
از آن جایی که برای توضیح مباحث پیشین، نیاز به بررسی این تابع داشتیم، از ذکر مطالب تکراری در این بخش خودداریکرده و شما را به مطالعه بخش 13-3 با عنوان دریافت زمان فعلی، ارجاع میدهیم.
13-6-2- تابع GmTime
این متد، زمان برحسب ثانیه را به یک زمان ساختیافته[1]در واحد UTC تبدیل میکند که در آن مقدار DST همیشه برابر صفر است. اگر مقداری به این تابع دادهنشده ویا مقداری برابر صفر واردکنیم، زمانفعلی سیستم، جایگزین آن میشود. شکل (13-10) نمونهای از استفاده این تابع را نشان میدهد.
خروجی اجرای این مثال به شکل (13-11) خواهدبود.
[1]Structed Time
13-6-3- تابع AscTime
همان طوری که در بخش 13-4 به آن اشارهشد، این تابع میتواند چندتایی زمان را که به صورت localtime و gmtime هستند، به یک رشتهی 24 کاراکتری تبدیلکرده و در قالب شکل (13-12) نمایشدهد.
خروجی مثال شکل (13-13)، زمان فعلی سیستم، در قالبی خواناست.
13-6-4- تابع CTime
این تابع نیز همانند ( ) asctime زمان برحسب ثانیه را به یک رشته تبدیل میکند. با این تفاوت که در تابع مذکور، نیازی به استفاده از localtime نبوده و درصورت عدم تعیین مقداری بهعنوان ورودی، زمان فعلی، ورودی پیشفرض تابع خواهدبود. مثال شکل (13-14)، نمایانگر نحوهی استفاده از این متد است.
خروجی اجرای این مثال، به شکل (13-15) میشود.
13-6-5- تابع AltZone
برای دریافت انحراف (تغییر) منطقه زمانی محلی (DST)، برحسب ثانیه، از این تابع استفاده میشود. اگر مقدار مثبت برگرداندهشود، انحراف از غرب UTC[1] (ساعتجهانی گرینویچ[2]) و اگر منفی باشد، انحراف از شرق آن برگردانده میشود. همچنین مقدار صفر متعلق به کشورهایی مانند انگلیس است که در ساعت صفر جغرافیایی قرار دارند. البته زمانی که از این تابع استفاده میشود، ساعت فصلی، خاموش در نظر گرفتهشده و مقدار آن را به نتیجه، اضافه ویا از آن، کسر میکند. برای درک بهتر به مثال شکل (13-16) توجهکنید.
با اجرای این مثال در خروجی، مقدار 16200- را خواهیمداشت. با تقسیم عدد مذکور به 60، آن را برحسب دقیقه و با تقسیم مجدد عدد حاصل بر 60، مقدار 4.5- را خواهیمداشت. فاصله زمانی کشور ما با گرینویچ، 3.5 ساعت است که به دلیل یک ساعت فاصله فصلی در این فصل از سال، مقدار 4.5 را داریم. عدد منفی نیز نمایانگر این است که ما در شرق UTC قرارداریم.
[1]Coordinated Universal Time [2]Greenwich
13-6-6- تابع Time
همان طوری که در بحثهای قبلی، به آن اشارهکردیم، این تابع، زمان فعلی را به صورت یک عدد اعشاری برحسب ثانیه برمیگرداند. با این وجود، همهی سیستمها نمیتوانند زمان را با دقت بهتر از یک ثانیه ارائهدهند. این امر، موجب تولید اعداد صحیح به جای اعشاری میشود. لازم به ذکر است که اگر زمان سیستم را تغییر دهیم، با اجرای مجدد این تابع، خروجی ما نیز متفاوت از مقدار قبلی خواهدشد.
13-6-7- تابع Sleep
با استفاده از این تابع میتوانیم در اجرای برنامه، برای تعداد ثانیه مشخص، وقفه ایجادکنیم. برای تعیین زمان دقیقتر میتوان یک عدد اعشاری را به کار برد. لازم به ذکر است که به دلیل این که هر سیگنال دریافتی میتواند در این روند اختلال ایجادکند، ممکناست زمان تعلیق واقعی، از عدد تعیینشده، کمتر باشد. شکل (13-17) نمونهای از استفادهی این تابع را نشان میدهد.
نتیجه اجرای این قطعه کد را در شکل (13-18) میبینید.
13-6-8- تابع Clock
این تابع در سیستم عاملهای یونیکس، زمان فعلی را به عنوان یک عدد اعشاری و برحسب ثانیه بیان میکند. در سیستمهای ویندوزی نیز، این تابع، زمان را از اولین فراخوانی برمیگرداند. البته اغلب برای توابع تعریفشده توسط کاربر، استفاده میشود ولی از آن جایی که در حال حاضر، در مورد این توابع خاص، بحثی را مطرح نکردهایم. به ذکر یک مثال ساده در شکل (13-19)، بسنده میکنیم.
در ابتدا، زمان فعلی، چاپشده و در ادامه با نگهداشتن زمان در متغیر t0، اقدام به کسر زمان ابتدای اجرا از این مقدار مینماییم. با اجرای این مثال، خروجی ما به شکل (13-20) خواهدشد.
13-6-9- تابع MkTime
عملکرد این تابع، عکس تابع ( ) localtime است. ورودی آن، یک تاپل 9تایی زمان و خروجی آن، زمان بر حسب ثانیه خواهدبود. البته اگر این ورودی به طور صحیح وارد نشود، خطایسرریز[1] ویا خطایمقدار[2] را خواهیمداشت. شکل (13-20) مثالی را در این مورد بیان میکند.
در این قطعه کد، ابتدا تاپل زمان را به ثانیه تبدیلکرده و چاپ میکنیم. سپس دوباره زمان به دست آمده را به قالب استاندارد دیگری تبدیل مینماییم. خروجی اجرای آن، به شکل (13-22) خواهدبود.
[1]OverflowError [2]ValueError
13-6-10- توابع StrfTime و StrpTime
تابع ( ) strftime یک تاپل ویا زمان ساختیافته را از توابعی مانند ( ) gmtime و ( ) localtime دریافتکرده و به صورت یک رشته (که توسط آرگونهای خاصی قالببندی شدهاند) برمیگرداند. همانند اکثر توابع زمانی، اگر هیچ مقدار زمانی را به عنوان ورودی آن درنظر نگیریم، از زمان فعلی سیستم، استفاده خواهدکرد. اگر هر یک از زمانها، خارج از محدودهی مجاز باشند، با خطای مقدار، مواجه میشویم. در شکل (13-23) مثالی از نحوهی تعریف و استفاده این تابع را نشان میدهیم. همان طوری که مشاهده مینمایید، ورودی اول تابع، عملگرهای قالببندی برای تعیین مقادیر هر زمان و ورودی دوم، قالب خروجی را تعیین میکند.
خروجی این قطعه کد، به شکل (13-24) خواهدبود. البته در ادامه، عملگرهای قالببندی آنها را توضیح میدهیم.
در مورد تابع ( ) strptime بایستی گفت که به وسیله آن میتوانیم رشتهی زمانی را به یک قالب ویا تاپل زمان، تجزیه[1]کنیم. این تابع نیز همانند ( ) strftime از عملگرهای قالببندی پیروی میکند. البته به صورت پیش فرض، قالببندی این تابع همانند ( ) ctime و شبیه به "%a %b %d %H:%M:%S %Y" است. اگر رشته ورودی، قابل تجزیه نبوده ویا مقدار آن خارج از محدوده مجاز باشد، خطای مقدار را خواهیمداشت. شکل (13-25) نمونهای از این تابع را نشان میدهد. همان گونه که میبینید، آرگومان اول تابع، یک زمان به صورت رشته و آرگومان دوم آن، عملگرهای قالببندی برای نمایش خروجی است.
خروجی این مثال به شکل (13-26) است.
اکنون نوبت به توضیح عملگرهای قالببندی زمان میرسد که در شکل (13-27) لیستی از آنها را میبینید. لازم به ذکر است که این دو تابع، از عملگرهای یکسانی استفادهکرده و به نوعی مکمل یکدیگر درنظر گرفته میشوند. همچنین بایستی اشارهکرد که، تنها عملگرهای هم نوع، میتوانند در محل یکسان و به جای یکدیگر استفادهشوند. این لیست به صورت الفبایی مرتب شدهاست.
[1]Parse
13-6-11- ویژگیهای time.timezone و time.tzname
اینها دو ویژگی مهمی هستند که در مورد توابع زمانی پایتون، در دسترس هستند. ویژگی timzone، آفست منطقهی زمانی کنونی از UTC (بدون DST) را برحسب ثانیه نشان میدهد که برای قاره آمریکا بزرگتر از صفر و برای اکثر اروپا، آسیا و آفریقا برابر صفر ویا بزرگتر از آن است. همچنین ویژگی tzname یک رشتهی دوتاییِ "منطقه-وابسته[1]" است که نمایانگر نام منطقهی زمانی با DST و بدون آن است.
[1]Locale-Dependent
برای اینکه مطلب زیاد طولانی نباشه، این فصل رو در قالب دو بخش ارائه دادیم. با ما همراه باشین.