|
41 | 41 |
|
42 | 42 | * **کلاس** ``date``: مناسب برای ایجاد شی تاریخ در پایتون میباشد که اشیا آن هیچ آگاهی نسبت به ساعت و منطقه زمانی (Time zone) [`ویکیپدیا <https://en.wikipedia.org/wiki/Time_zone>`__] نخواهند داشت و تنها مربوط به روزی خاص بر اساس گاهشماری میلادی (Gregorian calendar) [`ویکیپدیا <https://en.wikipedia.org/wiki/Gregorian_calendar>`__] میباشند. |
43 | 43 |
|
44 | | -* **کلاس** ``time``: مناسب برای ایجاد شی ساعت در پایتون میباشد و اشیا این کلاس هیچ آگاهی نسبت به تاریخ یا روز خاصی ندارند. |
| 44 | +* **کلاس** ``time``: مناسب برای ایجاد شی ساعت در پایتون میباشد و اشیا این کلاس هیچ آگاهی نسبت به تاریخ یا روز خاصی ندارند و تنها حاوی یک زمان مشخص از شبانهروز خواهند بود. |
45 | 45 |
|
46 | | -* **کلاس** ``datetime``: ترکیبی از دو کلاس ``date`` و ``time`` که اشیای آن نسبت به یک زمان (تاریخ و ساعت) مشخص آگاهی دارند. |
47 | | - |
48 | | -در ادامه به بررسی این سه کلاس و دیگر اجزای مهم از ماژول datetime خواهیم پرداخت. |
49 | | - |
50 | | -.. note:: |
51 | | - |
52 | | - در زبان برنامهنویسی پایتون اشیای مرتبط با زمان براساس توانایی آگاهی آنها از منطقه زمانی (Time zone) به دو دسته **«آگاه» (aware)** و **«ساده» (naive)** تقسیمبندی میشوند. بر همین اساس اشیای کلاس ``date`` از نوع naive و اشیای دو کلاس ``time`` و ``datetime`` میتوانند برحسب شرایط aware یا naive باشند. |
| 46 | +* **کلاس** ``datetime``: ترکیبی از دو کلاس ``date`` و ``time`` که اشیای آن میتوانند نسبت به یک زمان (تاریخ و ساعت) مشخص آگاهی کامل داشته باشند. |
53 | 47 |
|
| 48 | +در ادامه به بررسی این سه کلاس خواهیم پرداخت، اما پیش از این کار لازم است با دو کلاس دیگر از ماژول datetime آشنا شویم، ``timedelta`` و ``tzinfo``. |
54 | 49 |
|
55 | 50 |
|
56 | 51 | کلاس ``datetime.timedelta`` |
57 | 52 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
58 | 53 |
|
59 | | -پیش از بررسی کلاسهای یاد شده لازم است با کلاسی دیگر از ماژول datetime آشنا شویم. در زبان برنامهنویسی پایتون از اشیای کلاس ``timedelta`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#timedelta-objects>`__] برای بیان «مدت زمان» (duration) مشخص یا اختلاف بین دو تاریخ یا ساعت استفاده میشود. الگوی نمونهسازی از این کلاس به شکل زیر است:: |
| 54 | +در زبان برنامهنویسی پایتون از اشیای کلاس ``timedelta`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#timedelta-objects>`__] برای بیان «مدت زمان» (duration) مشخص یا اختلاف بین دو تاریخ یا زمان استفاده میشود. الگوی نمونهسازی از این کلاس به شکل زیر است:: |
60 | 55 |
|
61 | | - td = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) |
| 56 | + td = timedelta(days=0, |
| 57 | + seconds=0, |
| 58 | + microseconds=0, |
| 59 | + milliseconds=0, |
| 60 | + minutes=0, |
| 61 | + hours=0, |
| 62 | + weeks=0) |
62 | 63 |
|
63 | | -با نمونهسازی از این کلاس و ارسال آرگومانهای دلخواه، براساس تمام واحدهای پرتکرار از زمان یا حتی ترکیبی از آنها میتوانیم یک مدتزمان در سیستم زمانی پایتون ایجاد کنیم؛ هفته (weeks)، روز (days)، ساعت (hours)، دقیقه (minutes)، ثانیه (seconds)، میلیثانیه (milliseconds یا همان 0.001 ثانیه) و میکروثانیه (microseconds یا همان 0.000001 ثانیه). تمامی این مقادیر اختیاری و با مقدار پیشفرض ``0`` هستند که میتوانند از نوع ``int`` یا ``float``، مثبت یا منفی باشند |
| 64 | +با نمونهسازی از این کلاس و ارسال آرگومانهای دلخواه، براساس تمام واحدهای پرتکرار از زمان یا حتی ترکیبی از آنها میتوانیم یک مدتزمان در سیستم زمانی پایتون ایجاد کنیم؛ هفته (weeks)، روز (days)، ساعت (hours)، دقیقه (minutes)، ثانیه (seconds)، میلیثانیه (milliseconds یا همان 0.001 ثانیه) و میکروثانیه (microseconds یا همان 0.000001 ثانیه). تمامی این مقادیر اختیاری و با مقدار پیشفرض ``0`` هستند که میتوانند از نوع ``int`` یا ``float``، مثبت یا منفی باشند: |
64 | 65 |
|
65 | 66 | :: |
66 | 67 |
|
|
105 | 106 |
|
106 | 107 |
|
107 | 108 |
|
108 | | -توجه داشته باشید که از تمام انواع آرگومانی که ارسال میکنید این تنها ``seconds`` ،``days`` و ``microseconds`` هستند که دارای attribute متناظر بوده و قابل دسترس میباشند. در واقع تمامی مقادیر ارسالی در زمان نمونهسازی با یکدیگر ترکیب شده و در نهایت به این سه attribute تبدیل میشوند. به مقداردهی در زمان نمونهسازی و نیز به خروجی سطر پایانی از نمونه کدهای بالا توجه نمایید. |
| 109 | +توجه داشته باشید که از تمام انواع آرگومانی که ارسال میکنید این تنها ``seconds`` ،``days`` و ``microseconds`` هستند که دارای attribute متناظر بوده و قابل دسترس میباشند. در واقع تمامی مقادیر ارسالی در زمان نمونهسازی با یکدیگر ترکیب شده و در نهایت به این سه attribute تبدیل میشوند. به مقداردهی در زمان نمونهسازی و نیز به خروجی مقادیر از نمونه کدهای بالا توجه نمایید. |
109 | 110 |
|
110 | 111 | همچنین از نسخه 3.2 پایتون میتوانید با استفاده از متد ``total_seconds`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timedelta.total_seconds>`__] کل مدت زمان ذخیره شده در شی timedelta را در واحد ثانیه دریافت نمایید:: |
111 | 112 |
|
|
178 | 179 | کلاس ``datetime.tzinfo`` |
179 | 180 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
180 | 181 |
|
181 | | -هر وقت که صحبت از ساعت و زمان باشد، «منطقه زمانی» (Time zone) نیز جزئی از گفتگو خواهد بود. در زبان برنامهنویسی پایتون کلاس ``tzinfo`` از ماژول کلاس ``datetime`` امکان ایجاد منطقه زمانی را فراهم آورده است [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.tzinfo>`__]. ``tzinfo`` در واقع یک کلاس Abstract (درس نوزدهم) میباشد که نمیتوان از آن نمونهسازی و شی ایجاد کرد ولی میتوان به کمک آن کلاس منطقه زمانی دلخواه خود را ایجاد نماییم. برای مشاهده اجزا و نکات مربوط به پیادهسازی منطقه زمانی دلخواه میتوانید به مستندات زبان برنامهنویسی پایتون مراجعه نمایید. |
| 182 | +هر وقت که صحبت از ساعت و زمان باشد، «منطقه زمانی» (Time zone) نیز جزئی از گفتگو خواهد بود. در زبان برنامهنویسی پایتون کلاس ``tzinfo`` از ماژول کلاس ``datetime`` امکان ایجاد منطقه زمانی را فراهم آورده است [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.tzinfo>`__]. ``tzinfo`` در واقع یک کلاس Abstract (درس نوزدهم) میباشد که نمیتوان از آن نمونهسازی و شی ایجاد کرد ولی میتوان به کمک آن، کلاس منطقه زمانی دلخواه خود را ایجاد نماییم. برای مشاهده اجزا و نکات مربوط به پیادهسازی منطقه زمانی دلخواه میتوانید به مستندات زبان برنامهنویسی پایتون مراجعه نمایید. |
182 | 183 |
|
183 | 184 | اشتباه نکنید، در اکثر مواقع نیازی به پیادهسازی یک کلاس منطقه زمانی در پایتون نمیباشد. چرا که از قبل کلاس ``timezone`` از ماژول ``datetime`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#timezone-objects>`__] توسط این زبان فراهم آورده شده است. این کلاس یک subclass از ``datetime.tzinfo`` بوده و مبنای محاسبه منطقه زمانی در آن UTC [`ویکیپدیا <https://en.wikipedia.org/wiki/Coordinated_Universal_Time>`__] میباشد. این کلاس به تنهایی تمامی نیازهای معمول ما نسبت به ثبت منطقه زمانی در پایتون را برطرف میسازد. در سراسر ایران منطقه زمانی یکسان میباشد و به صورت استاندارد از مبنای UTC محاسبه میگردد؛ به این صورت که در شش ماه نخست سال برابر ``UTC+4:30`` و در شش ماه دوم از سال این مقدار برابر ``UTC+3:30`` خواهد بود [`ویکیپدیا Iran Standard Time (IRST) <https://en.wikipedia.org/wiki/Iran_Standard_Time>`__]. |
184 | 185 |
|
| 186 | +.. note:: |
| 187 | + |
| 188 | + در زبان برنامهنویسی پایتون اشیای مرتبط با زمان براساس توانایی آگاهی آنها از منطقه زمانی (Time zone) به دو دسته **«آگاه» (aware)** و **«ساده» (naive)** تقسیمبندی میشوند. بر همین اساس اشیای کلاس ``date`` از نوع naive و اشیای دو کلاس ``time`` و ``datetime`` میتوانند برحسب شرایط aware یا naive باشند. |
| 189 | + |
| 190 | + |
185 | 191 |
|
186 | 192 | کلاس ``datetime.timezone`` |
187 | 193 | ------------------------------ |
|
208 | 214 |
|
209 | 215 | >>> tz = timezone(timedelta(hours=-5), 'Eastern Time Zone') |
210 | 216 |
|
| 217 | +از طریق شی ``datetime.timezone`` چهار متد زیر در دسترس خواهد بود، در واقع اینها متدهایی هستند که توسط ``datetime.timezone`` از کلاس ``datetime.tzinfo`` ارثبرده و Override شدهاند: |
| 218 | + |
| 219 | +* **متد** ``utcoffset(dt)`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timezone.utcoffset>`__]: ورودی نادیده گرفته میشود و خروجی یک شی ``datetime.timedelta`` برابر اختلاف فاصله زمانی از مبنا UTC میباشد. |
| 220 | + |
| 221 | +* **متد** ``tzname(dt)`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timezone.tzname>`__]: نام منطقه زمانی ارسال شده در زمان نمونهسازی را برمیگرداند. چنانچه در زمان نمونهسازی مقداری ارسال نشده و نام برابر ``None`` باشد، یک نام به صورت خودکار تولید خواهد شد. ورودی میتواند ``None`` یا یک شی aware از نوع ``datetime.datetime`` باشد. |
| 222 | + |
| 223 | +* **متد** ``dst(dt)`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timezone.dst>`__]: خروجی این متد برای اشیا ``datetime.timezone`` همواره برابر ``None`` خواهد بود. |
| 224 | + |
| 225 | +* **متد** ``fromutc(dt)`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timezone.fromutc>`__]: ورودی میبایست یک شی aware از نوع ``datetime.datetime`` باشد و خروجی نیز برابر ``dt + offset`` خواهد بود. در واقع این متد یک شی ``datetime.datetime`` دریافت و منطقه زمانی آن را بر اساس اطلاعات خود تغییر و برمیگرداند. |
| 226 | + |
| 227 | +این کلاس حاوی یک Class attribute نیز میباشد. ``utc`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timezone.utc>`__] که برابر یک شی ``datetime.timezone`` جدید براساس منطقه زمانی UTC میباشد. یعنی: ``timezone(timedelta(0))`` |
211 | 228 |
|
212 | 229 |
|
| 230 | +:: |
| 231 | + |
| 232 | + >>> from datetime import timedelta, timezone |
| 233 | + >>> tz = timezone(timedelta(hours=4, minutes=30), 'Asia/Tehran') |
| 234 | + |
| 235 | + >>> tz.utcoffset(None) |
| 236 | + datetime.timedelta(seconds=16200) |
| 237 | + |
| 238 | + >>> tz.tzname(None) |
| 239 | + 'Asia/Tehran' |
| 240 | + |
| 241 | +:: |
| 242 | + |
| 243 | + |
| 244 | + >>> tz = timezone(timedelta(hours=4, minutes=30)) |
| 245 | + >>> tz.tzname(None) |
| 246 | + 'UTC+04:30' |
| 247 | + |
| 248 | + |
| 249 | +:: |
| 250 | + |
| 251 | + >>> type(timezone.utc) |
| 252 | + <class 'datetime.timezone'> |
213 | 253 |
|
214 | 254 |
|
215 | 255 | کلاس ``datetime.date`` |
|
531 | 571 |
|
532 | 572 | * ``microsecond``: از نوع ``int`` میباشد و مقداری برابر با میکروثانیه مورد نظر خواهد داشت که میبایست عددی از بین اعداد ``0`` تا ``1000000`` باشد : range(1000000) - هر میکروثانیه برابر با 0.000001 ثانیه میباشد. |
533 | 573 |
|
534 | | -* ``tzinfo``: معرف منطقه زمانی (Time zone) است که مقدار پیشفرض آن ``None`` میباشد و میتواند یک شی از زیرکلاسهای (subclass) کلاس ``tzinfo`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.tzinfo>`__] را بپذیرد. در ادامه بیشتر در مورد این نوع اشیا صحبت خواهیم کرد. |
| 574 | +* ``tzinfo``: معرف منطقه زمانی (Time zone) است که مقدار پیشفرض آن ``None`` میباشد و میتواند یک شی از زیرکلاسهای (subclass) کلاس ``tzinfo`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.tzinfo>`__] را بپذیرد. |
535 | 575 |
|
536 | 576 | * ``fold``: از نسخه 3.6 پایتون به بعد اضافه شده است و تنها با استفاده از شیوه **نام=مقدار** قابل مقداردهی میباشد. این پارامتر در واقع یک نشانگر برای ابهامزدایی در بیان ساعت میباشد. برای مثال از کاربرد این پارامتر وضعیت «ساعت تابستانی» [`ویکیپدیا <https://en.wikipedia.org/wiki/Daylight_saving_time>`__] را تصور کنید. ساعت رسمی ایران هر سال در ساعت ۲۴ روز اول فروردین ماه یک ساعت به جلو کشیده میشود و در ساعت ۲۴ روز سیام شهریور ماه به حالت قبلی برگردانده میشود، اکنون در روز سیام شهریور ماه ساعت ۲۳ تا ۲۴ دوبار تکرار میشود، در این مواقع میتوان از این پارامتر برای مشخص کردن وضعیت ساعت استفاده کرد. به این صورت که مقدار ``0`` بیانگر وضعیت قبل از تغییر و ``1`` بیانگر وضعیت پس از تغییر میتواند باشد. |
537 | 577 |
|
|
0 commit comments