Skip to content

Commit e171402

Browse files
author
Saeid
committed
l25: datetime.tzinfo, completed
1 parent 8ca0620 commit e171402

1 file changed

Lines changed: 54 additions & 14 deletions

File tree

lessons/l25.rst

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,27 @@
4141

4242
* **کلاس** ``date``: مناسب برای ایجاد شی تاریخ در پایتون می‌باشد که اشیا آن هیچ آگاهی نسبت به ساعت و منطقه زمانی (Time zone) [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Time_zone>`__] نخواهند داشت و تنها مربوط به روزی خاص بر اساس گاه‌شماری میلادی (Gregorian calendar) [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Gregorian_calendar>`__] می‌باشند.
4343

44-
* **کلاس** ``time``: مناسب برای ایجاد شی ساعت در پایتون می‌باشد و اشیا این کلاس هیچ آگاهی نسبت به تاریخ یا روز خاصی ندارند.
44+
* **کلاس** ``time``: مناسب برای ایجاد شی ساعت در پایتون می‌باشد و اشیا این کلاس هیچ آگاهی نسبت به تاریخ یا روز خاصی ندارند و تنها حاوی یک زمان مشخص از شبانه‌روز خواهند بود.
4545

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`` که اشیای آن می‌توانند نسبت به یک زمان (تاریخ و ساعت) مشخص آگاهی کامل داشته باشند.
5347

48+
در ادامه به بررسی این سه کلاس خواهیم پرداخت، اما پیش از این کار لازم است با دو کلاس دیگر از ماژول datetime آشنا شویم، ``timedelta`` و ``tzinfo``.
5449

5550

5651
کلاس ``datetime.timedelta``
5752
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5853

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) مشخص یا اختلاف بین دو تاریخ یا زمان استفاده می‌شود. الگوی نمونه‌سازی از این کلاس به شکل زیر است::
6055

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)
6263

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``، مثبت یا منفی باشند:
6465

6566
::
6667

@@ -105,7 +106,7 @@
105106

106107

107108

108-
توجه داشته باشید که از تمام انواع آرگومانی که ارسال می‌کنید این تنها ``seconds`` ،``days`` و ``microseconds`` هستند که دارای attribute متناظر بوده و قابل دسترس می‌باشند. در واقع تمامی مقادیر ارسالی در زمان نمونه‌سازی با یکدیگر ترکیب شده و در نهایت به این سه attribute تبدیل می‌شوند. به مقداردهی در زمان نمونه‌سازی و نیز به خروجی سطر پایانی از نمونه کدهای بالا توجه نمایید.
109+
توجه داشته باشید که از تمام انواع آرگومانی که ارسال می‌کنید این تنها ``seconds`` ،``days`` و ``microseconds`` هستند که دارای attribute متناظر بوده و قابل دسترس می‌باشند. در واقع تمامی مقادیر ارسالی در زمان نمونه‌سازی با یکدیگر ترکیب شده و در نهایت به این سه attribute تبدیل می‌شوند. به مقداردهی در زمان نمونه‌سازی و نیز به خروجی مقادیر از نمونه کدهای بالا توجه نمایید.
109110

110111
همچنین از نسخه 3.2 پایتون می‌توانید با استفاده از متد ``total_seconds`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.timedelta.total_seconds>`__] کل مدت زمان ذخیره شده در شی timedelta را در واحد ثانیه دریافت نمایید::
111112

@@ -178,10 +179,15 @@
178179
کلاس ``datetime.tzinfo``
179180
~~~~~~~~~~~~~~~~~~~~~~~~~~~
180181

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 (درس نوزدهم) می‌باشد که نمی‌توان از آن نمونه‌سازی و شی ایجاد کرد ولی می‌توان به کمک آن، کلاس منطقه زمانی دلخواه خود را ایجاد نماییم. برای مشاهده اجزا و نکات مربوط به پیاده‌سازی منطقه زمانی دلخواه می‌توانید به مستندات زبان برنامه‌نویسی پایتون مراجعه نمایید.
182183

183184
اشتباه نکنید، در اکثر مواقع نیازی به پیاده‌سازی یک کلاس منطقه زمانی در پایتون نمی‌باشد. چرا که از قبل کلاس ``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>`__].
184185

186+
.. note::
187+
188+
در زبان برنامه‌نویسی پایتون اشیای مرتبط با زمان براساس توانایی آگاهی آن‌ها از منطقه زمانی (Time zone) به دو دسته **«آگاه» (aware)** و **«ساده» (naive)** تقسیم‌بندی می‌شوند. بر همین اساس اشیای کلاس ``date`` از نوع naive و اشیای دو کلاس ``time`` و ``datetime`` می‌توانند برحسب شرایط aware یا naive باشند.
189+
190+
185191

186192
کلاس ``datetime.timezone``
187193
------------------------------
@@ -208,8 +214,42 @@
208214

209215
>>> tz = timezone(timedelta(hours=-5), 'Eastern Time Zone')
210216

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))``
211228

212229

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'>
213253

214254

215255
کلاس ``datetime.date``
@@ -531,7 +571,7 @@
531571

532572
* ``microsecond``: از نوع ``int`` می‌باشد و مقداری برابر با میکروثانیه مورد نظر خواهد داشت که می‌بایست عددی از بین اعداد ``0`` تا ``1000000`` باشد : range(1000000) - هر میکروثانیه برابر با 0.000001 ثانیه می‌باشد.
533573

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>`__] را بپذیرد.
535575

536576
* ``fold``: از نسخه 3.6 پایتون به بعد اضافه شده است و تنها با استفاده از شیوه **نام=مقدار** قابل مقداردهی می‌باشد. این پارامتر در واقع یک نشانگر برای ابهام‌زدایی در بیان ساعت می‌باشد. برای مثال از کاربرد این پارامتر وضعیت «ساعت تابستانی» [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Daylight_saving_time>`__] را تصور کنید. ساعت رسمی ایران هر سال در ساعت ۲۴ روز اول فروردین ماه یک ساعت به جلو کشیده می‌شود و در ساعت ۲۴ روز سی‌ام شهریور ماه به حالت قبلی برگردانده می‌شود، اکنون در روز سی‌ام شهریور ماه ساعت ۲۳ تا ۲۴ دوبار تکرار می‌شود، در این مواقع می‌توان از این پارامتر برای مشخص کردن وضعیت ساعت استفاده کرد. به این صورت که مقدار ``0`` بیانگر وضعیت قبل از تغییر و ``1`` بیانگر وضعیت پس از تغییر می‌تواند باشد.
537577

0 commit comments

Comments
 (0)