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

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