فصل سیزدهم آموزش پایتون مقدماتی - تاریخ و زمان (بخش اول) (انتشار: 1402/08/04)

زبان پایتون با روش‌‌های مختلفی می‌‌تواند تاریخ و زمان را مدیریت‌‌کند. تبدیل انواع قالب‌‌های زمان و تاریخ، یکی از رایج‌‌ترین کارهایی‌‌است که با انواع زبان‌‌های برنامه‌‌نویسی انجام می‌‌پذیرد. پایتون نیز از این قانون مستثنی‌‌نبوده و برای این‌‌کار، از ماژول‌‌های مخصوص زمان و تاریخ کمک می‌‌گیرد.

این چیه؟

13-1- تیک (Tick)

به طور اختصاصی، مبدا زمانی، ساعت 12:00 صبح، اول ژانویه سال 1970 در نظر گرفته شده‌‌است. در پایتون، فواصل زمانی، اعداد اعشاری بر حسب ثانیه یعنی تیک هستند.

در پایتون یک ماژول محبوب برای زمان وجود دارد که شامل توابعی برای کار با زمان و تبدیل انواع نمایش آن‌‌ها به یکدیگر است. برای مثال، تابع ( ) time.time زمان فعلی سیستم را برحسب ثانیه، مبدا ذکرشده و برمی‌‌گرداند. به عنوان نمونه، شکل (13-1) را در نظر بگیرید.

پایتون-شکل1-13

با اجرای این مثال، شکل (13-2) را خواهیم‌‌داشت.

پایتون-شکل2-13

محاسبات ریاضی زمان برحسب ثانیه، خیلی آسان است. با این حال، تاریخ‌‌های قبل از مبدا را نمی‌‌توان به این شکل نشان‌‌داد. به نظر می‌‌رسد در آینده (حداقل تا تاریخ 2038) نیز نمی‌‌توان با این روش به قبل از این تاریخ در یونیکس و ویندوز دسترسی‌‌یافت.

13-2- تاپل تایم (TimeTuple)

خروجی بسیاری از توابع زمان در پایتون، یک تاپل شامل 9 عدد است که معادل ویژگی‌‌های ساختار ( ) struct_time است. در شکل (13-3) به توضیح هر یک از آن‌‌ها خواهیم‌‌پرداخت.

پایتون-شکل3-13

لازم به ذکر است که مثال‌‌های این مطلب در بخش‌‌های بعدی ذکر خواهندشد.

13-3- دریافت زمان فعلی

برای تبدیل زمان یک لحظه بر حسب ثانیه که مقداری اعشاری است به یک تاپل 9تایی زمان، کافی‌‌است که این مقدار را وارد یک تابع زمانی کنیم. همان گونه که می‌‌بینید، در مثال شکل (13-4)، زمان فعلی را به عنوان ورودیِ زمان محلی، وارد آن کردیم.

پایتون-شکل4-13

خروجی این مبدل به‌‌شکل (13-5) است که یک تاپل 9تایی است و برای هرویژگی مقدار خاصی‌‌را خواهیم‌‌داشت. به‌‌دلیل طولانی‌‌بودن خروجی، آن‌‌را در دو سطر نمایش‌‌دادیم.

پایتون-شکل5-13

13-4- دریافت زمان قالب‌‌بندی شده

نمایش زمان در قالب تیک، خیلی خوانا و قابل فهم نیست. از این رو می‌‌توان با استفاده از تابع ( ) asctime که در شکل (13-6) می‌‌بینید، آن را بهبود ‌‌داد.

پایتون-شکل6-13

با اجرای این تابع، زمان را در قالب شکل (13-7) خواهیم‌‌داشت که بسیار خواناتر و قابل فهم‌‌تر از قبل است.

پایتون-شکل7-13

13-5- دریافت تقویم ماهانه

ماژول تقویم می‌‌تواند طیف گسترده‌‌ای از روش‌‌های نمایش تقویم سالانه و ماهانه را فراهم‌‌کند. برای نمونه، در شکل (13-8)، می‌‌خواهیم تقویم ماه فوریه سال 2019 را چاپ‌‌کنیم.

پایتون-شکل8-13

با اجرای این مثال، خروجی ما همانند شکل (13-9) خواهدبود.

پایتون-شکل9-13

حال که با کلیات مفهوم زمان آشنا شدید، در ادامه به بررسی هر چه بیشتر توابع و ماژول‌‌های زمان، تاریخ و تقویم می‌‌پردازیم.

13-6- ماژول زمان

این ماژول محبوب پایتون می‌‌تواند توابعی را برای کار با زمان و تبدیل نمایش‌‌های مختلف آن‌‌ها به یکدیگر فراهم‌‌کند. از این رو می‌‌خواهیم تمامی روش‌‌های موجود را بررسی‌‌کنیم.

13-6-1- تابع LocalTime

از آن جایی که برای توضیح مباحث پیشین، نیاز به بررسی این تابع داشتیم، از ذکر مطالب تکراری در این بخش خودداری‌‌کرده و شما را به مطالعه بخش 13-3 با عنوان دریافت زمان فعلی، ارجاع می‌‌دهیم.

13-6-2- تابع GmTime

این متد، زمان برحسب ثانیه را به یک زمان ساخت‌‌یافته در واحد UTC تبدیل می‌‌کند که در آن مقدار DST همیشه برابر صفر است. اگر مقداری به این تابع داده‌‌نشده ویا مقداری برابر صفر وارد‌‌کنیم، زمان‌‌فعلی سیستم، جایگزین آن می‌‌شود. شکل (13-10) نمونه‌‌ای از استفاده این تابع را نشان می‌‌دهد.

پایتون-شکل10-13

خروجی اجرای این مثال به شکل (13-11) خواهدبود.

پایتون-شکل11-13

13-6-3- تابع AscTime

همان طوری که در بخش 13-4 به آن اشاره‌‌شد، این تابع می‌‌تواند چندتایی زمان را که به صورت localtime و gmtime هستند، به یک رشته‌‌ی 24 کاراکتری تبدیل‌‌کرده و در قالب شکل (13-12) نمایش‌‌دهد.

پایتون-شکل12-13

خروجی مثال شکل (13-13)، زمان فعلی سیستم، در قالبی خواناست.

پایتون-شکل13-13

13-6-4- تابع CTime

این تابع نیز همانند ( ) asctime زمان برحسب ثانیه را به یک رشته تبدیل می‌‌کند. با این تفاوت که در تابع مذکور، نیازی به استفاده از localtime نبوده و درصورت عدم تعیین مقداری به‌‌عنوان ورودی، زمان فعلی، ورودی پیش‌‌فرض تابع خواهدبود. مثال شکل (13-14)، نمایانگر نحوه‌‌ی استفاده از این متد است.

پایتون-شکل14-13

خروجی اجرای این مثال، به شکل (13-15) می‌‌شود.

پایتون-شکل15-13

13-6-5- تابع AltZone

برای دریافت انحراف (تغییر) منطقه زمانی محلی (DST)، برحسب ثانیه، از این تابع استفاده می‌‌شود. اگر مقدار مثبت برگردانده‌‌شود، انحراف از غرب UTC (ساعت‌‌جهانی گرینویچ) و اگر منفی باشد، انحراف از شرق آن برگردانده می‌‌شود. همچنین مقدار صفر متعلق به کشورهایی مانند انگلیس است که در ساعت صفر جغرافیایی قرار دارند. البته زمانی که از این تابع استفاده می‌‌شود، ساعت فصلی، خاموش در نظر گرفته‌‌شده و مقدار آن را به نتیجه، اضافه ویا از آن، کسر می‌‌کند. برای درک بهتر به مثال شکل (13-16) توجه‌‌کنید.

پایتون-شکل16-13

با اجرای این مثال در خروجی، مقدار 16200- را خواهیم‌‌داشت. با تقسیم عدد مذکور به 60، آن را برحسب دقیقه و با تقسیم مجدد عدد حاصل بر 60، مقدار 4.5- را خواهیم‌‌داشت. فاصله زمانی کشور ما با گرینویچ، 3.5 ساعت است که به دلیل یک ساعت فاصله فصلی در این فصل از سال، مقدار 4.5 را داریم. عدد منفی نیز نمایان‌‌گر این است که ما در شرق UTC قرار‌‌داریم.

13-6-6- تابع Time

همان طوری که در بحث‌‌های قبلی، به آن اشاره‌‌کردیم، این تابع، زمان فعلی را به صورت یک عدد اعشاری برحسب ثانیه برمی‌‌گرداند. با این وجود، همه‌‌ی سیستم‌‌ها نمی‌‌توانند زمان را با دقت بهتر از یک ثانیه ارائه‌‌دهند. این امر، موجب تولید اعداد صحیح به جای اعشاری می‌‌شود. لازم به ذکر است که اگر زمان سیستم را تغییر دهیم، با اجرای مجدد این تابع، خروجی ما نیز متفاوت از مقدار قبلی خواهدشد.

13-6-7- تابع Sleep

با استفاده از این تابع می‌‌توانیم در اجرای برنامه، برای تعداد ثانیه مشخص، وقفه ایجاد‌‌کنیم. برای تعیین زمان دقیق‌‌تر می‌‌توان یک عدد اعشاری را به کار برد. لازم به ذکر است که به دلیل این که هر سیگنال دریافتی می‌‌تواند در این روند اختلال ایجادکند، ممکن‌‌است زمان تعلیق واقعی، از عدد تعیین‌‌شده، کمتر باشد. شکل (13-17) نمونه‌‌ای از استفاده‌‌ی این تابع را نشان می‌‌دهد.

پایتون-شکل17-13

نتیجه اجرای این قطعه کد را در شکل (13-18) می‌‌بینید.

پایتون-شکل18-13

13-6-8- تابع Clock

این تابع در سیستم عامل‌‌های یونیکس، زمان فعلی را به عنوان یک عدد اعشاری و برحسب ثانیه بیان می‌‌کند. در سیستم‌‌های ویندوزی نیز، این تابع، زمان را از اولین فراخوانی برمی‌‌گرداند. البته اغلب برای توابع تعریف‌‌شده توسط کاربر، استفاده می‌‌شود ولی از آن جایی که در حال حاضر، در مورد این توابع خاص، بحثی را مطرح نکرده‌‌ایم. به ذکر یک مثال ساده در شکل (13-19)، بسنده می‌‌کنیم.

پایتون-شکل19-13

در ابتدا، زمان فعلی، چاپ‌‌شده و در ادامه با نگه‌‌داشتن زمان در متغیر t0، اقدام به کسر زمان ابتدای اجرا از این مقدار می‌‌نماییم. با اجرای این مثال، خروجی ما به شکل (13-20) خواهدشد.

پایتون-شکل20-13

13-6-9- تابع MkTime

عملکرد این تابع، عکس تابع ( ) localtime است. ورودی آن، یک تاپل 9تایی زمان و خروجی آن، زمان بر حسب ثانیه خواهدبود. البته اگر این ورودی به طور صحیح وارد نشود، خطای‌‌سرریز ویا خطای‌‌مقدار را خواهیم‌‌داشت. شکل (13-20) مثالی را در این مورد بیان می‌‌کند.

پایتون-شکل21-13

در این قطعه کد، ابتدا تاپل زمان را به ثانیه تبدیل‌‌کرده و چاپ می‌‌کنیم. سپس دوباره زمان به دست آمده را به قالب استاندارد دیگری تبدیل می‌‌نماییم. خروجی اجرای آن، به شکل (13-22) خواهدبود.

پایتون-شکل22-13

 

13-6-10- توابع StrfTime و StrpTime

تابع ( ) strftime یک تاپل ویا زمان ساخت‌‌یافته را از توابعی مانند ( ) gmtime و ( ) localtime دریافت‌‌کرده و به صورت یک رشته (که توسط آرگون‌‌های خاصی قالب‌‌بندی شده‌‌اند) برمی‌‌گرداند. همانند اکثر توابع زمانی، اگر هیچ مقدار زمانی را به عنوان ورودی آن درنظر نگیریم، از زمان فعلی سیستم، استفاده خواهدکرد. اگر هر یک از زمان‌‌ها، خارج از محدوده‌‌ی مجاز باشند، با خطای مقدار، مواجه می‌‌شویم. در شکل (13-23) مثالی از نحوه‌‌ی تعریف و استفاده این تابع را نشان می‌‌دهیم. همان طوری که مشاهده می‌‌نمایید، ورودی اول تابع، عملگر‌‌های قالب‌‌بندی برای تعیین مقادیر هر زمان و ورودی دوم، قالب خروجی را تعیین می‌‌کند.

پایتون-شکل23-13

خروجی این قطعه کد، به شکل (13-24) خواهدبود. البته در ادامه، عملگر‌‌های قالب‌‌بندی آن‌‌ها را توضیح می‌‌دهیم.

پایتون-شکل24-13

در مورد تابع ( ) strptime بایستی گفت که به وسیله آن می‌‌توانیم رشته‌‌ی زمانی را به یک قالب ویا تاپل زمان، تجزیه کنیم. این تابع نیز همانند ( ) strftime از عملگر‌‌های قالب‌‌بندی پیروی می‌‌کند. البته به صورت پیش فرض، قالب‌‌بندی این تابع همانند ( ) ctime و شبیه به "%a %b %d %H:%M:%S %Y" است. اگر رشته ورودی، قابل تجزیه نبوده ویا مقدار آن خارج از محدوده مجاز باشد، خطای مقدار را خواهیم‌‌داشت. شکل (13-25) نمونه‌‌ای از این تابع را نشان می‌‌دهد. همان گونه که می‌‌بینید، آرگومان اول تابع، یک زمان به صورت رشته و آرگومان دوم آن، عملگرهای قالب‌‌بندی برای نمایش خروجی است.

پایتون-شکل25-13

خروجی این مثال به شکل (13-26) است.

پایتون-شکل26-13

اکنون نوبت به توضیح عملگرهای قالب‌‌بندی زمان می‌‌رسد که در شکل (13-27) لیستی از آن‌‌ها را می‌‌بینید. لازم به ذکر است که این دو تابع، از عملگر‌‌های یکسانی استفاده‌‌کرده و به نوعی مکمل یکدیگر درنظر گرفته می‌‌شوند. همچنین بایستی اشاره‌‌کرد که، تنها عملگرهای هم نوع، می‌‌توانند در محل یکسان و به جای یکدیگر استفاده‌‌شوند. این لیست به صورت الفبایی مرتب شده‌‌است.

پایتون-شکل27-13

13-6-11- ویژگی‌‌های time.timezone و time.tzname

این‌‌ها دو ویژگی مهمی هستند که در مورد توابع زمانی پایتون، در دسترس هستند. ویژگی timzone، آفست منطقه‌‌ی زمانی کنونی از UTC (بدون DST) را برحسب ثانیه نشان می‌‌دهد که برای قاره آمریکا بزرگتر از صفر و برای اکثر اروپا، آسیا و آفریقا برابر صفر ویا بزرگتر از آن است. همچنین ویژگی tzname یک رشته‌‌ی دوتاییِ "منطقه-وابسته" است که نمایان‌‌گر نام منطقه‌‌ی زمانی با DST و بدون آن است.

 

برای اینکه مطلب زیاد طولانی نباشه، این فصل رو در قالب دو بخش ارائه دادیم. با ما همراه باشین.


نظرات خوانندگان نوشته


نظری در این مورد دارید؟ خوشحال می‌شیم اون رو برامون ارسال کنید.