datetime --- انواع پایه تاریخ و زمان

کد منبع: Lib/datetime.py


ماژول datetime کلاس‌هایی برای دستکاری تاریخ‌ها و زمان‌ها فراهم می‌کند.

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

نکته

پرش به کدهای قالب.

همچنین ملاحظه نمائید

ماژول calendar

توابع عمومی مرتبط با گاه‌شماری.

ماژول time

دسترسی به زمان و تبدیل‌ها.

ماژول zoneinfo

مناطق زمانی عینی که نشان‌دهنده‌ی پایگاه داده‌ی مناطق زمانی IANA هستند.

بسته dateutil

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

بسته DateType

کتابخانه شخص ثالثی که انواع ایستای متمایزی را معرفی می‌کند تا برای مثال، به بررسی‌کننده‌های نوع ایستا اجازه دهد بین datetimeهای naive و aware تمایز قائل شوند.

اشیای آگاه و ساده

اشیاء تاریخ و زمان ممکن است بسته به اینکه شامل اطلاعات منطقه‌ی زمانی باشند یا نه، به‌عنوان «آگاه» یا «ساده» (naive) دسته‌بندی شوند.

با دانش کافی درباره‌ی تنظیم‌های زمانی الگوریتمی و سیاسی قابل‌اعمال، مانند اطلاعات منطقه‌ی زمانی و ساعت تابستانی، یک شیء آگاه می‌تواند موقعیت خود را نسبت به سایر اشیاء آگاه تعیین کند. یک شیء آگاه، یک لحظه‌ی مشخص از زمان را نشان می‌دهد که جای تفسیر ندارد. [1]

یک شیء ساده حاوی اطلاعات کافی برای تعیین موقعیت خود به‌صورت غیرمبهم نسبت به سایر اشیای تاریخ/زمان نیست. این‌که یک شیء ساده نشان‌دهنده‌ی زمان هماهنگ جهانی (UTC)، زمان محلی یا زمان در یک منطقه‌ی زمانی دیگر باشد، کاملاً به برنامه بستگی دارد؛ درست همان‌طور که این‌که یک عدد خاص نشان‌دهنده‌ی متر، مایل یا جرم باشد، به برنامه بستگی دارد. درک و کار کردن با اشیای ساده آسان است، به بهای چشم‌پوشی از برخی جنبه‌های واقعیت.

برای برنامه‌هایی که به اشیای آگاه نیاز دارند، اشیای datetime و time دارای یک ویژگی اختیاری اطلاعات منطقه‌ی زمانی، tzinfo، هستند که می‌تواند به نمونه‌ای از زیرکلاسی از کلاس انتزاعی tzinfo تنظیم شود. این اشیای tzinfo اطلاعات مربوط به اختلاف نسبت به زمان UTC، نام منطقه‌ی زمانی و فعال بودن ساعت تابستانی را ذخیره می‌کنند.

تنها یک کلاس عینی tzinfo، یعنی کلاس timezone، توسط ماژول datetime ارائه شده است. کلاس timezone می‌تواند مناطق زمانی ساده با فاصله‌های ثابت از UTC را نشان دهد، مانند خود UTC یا مناطق زمانی EST و EDT آمریکای شمالی. پشتیبانی از مناطق زمانی با سطوح عمیق‌تری از جزئیات بر عهده‌ی برنامه است. قوانین تنظیم زمان در سراسر جهان بیشتر سیاسی هستند تا منطقی، به‌طور مکرر تغییر می‌کنند، و هیچ استاندارد مناسبی برای همه‌ی برنامه‌ها به‌جز UTC وجود ندارد.

ثابت‌ها

ماژول datetime ثابت‌های زیر را اکسپورت می‌کند:

datetime.MINYEAR

کوچک‌ترین شماره سال مجاز در یک شیء date یا datetime. MINYEAR برابر ۱ است.

datetime.MAXYEAR

بزرگ‌ترین شماره سال مجاز در یک شیء date یا datetime. MAXYEAR برابر ۹۹۹۹ است.

datetime.UTC

نام مستعاری برای تک‌نمونه‌ی منطقه‌ی زمانی UTC datetime.timezone.utc.

اضافه شده در نسخه‌ی 3.11.

انواع موجود

class datetime.date

یک تاریخ ساده‌ی ایده‌آل‌سازی‌شده، با فرض این‌که گاه‌شماری میلادی جاری همیشه برقرار بوده و همیشه برقرار خواهد بود. ویژگی‌ها: year، month و day.

class datetime.time

یک زمان ایده‌آل‌سازی‌شده، مستقل از هر روز معین، با این فرض که هر روز دقیقاً ۲۴*۶۰*۶۰ ثانیه دارد. (در اینجا هیچ مفهومی از «ثانیه‌های کبیسه» وجود ندارد.) ویژگی‌ها: hour، minute، second، microsecond و tzinfo.

class datetime.datetime

ترکیبی از یک تاریخ و یک زمان. ویژگی‌ها: year، month، day، hour، minute، second، microsecond و tzinfo.

class datetime.timedelta

مدت‌زمانی که تفاوت بین دو نمونه از datetime یا date را تا دقت میکروثانیه بیان می‌کند.

class datetime.tzinfo

یک کلاس پایه انتزاعی برای اشیای اطلاعات منطقه زمانی. این اشیاء توسط کلاس‌های datetime و time استفاده می‌شوند تا مفهومی قابل سفارشی‌سازی از تنظیم زمان فراهم شود (برای مثال، برای در نظر گرفتن منطقه زمانی و/یا ساعت تابستانی).

class datetime.timezone

کلاسی که کلاس پایه انتزاعی tzinfo را به‌صورت یک آفست ثابت از UTC پیاده‌سازی می‌کند.

اضافه شده در نسخه‌ی 3.2.

اشیای این نوع‌ها تغییرناپذیر هستند.

روابط زیرکلاس‌ها:

timedelta، tzinfo، time و date از object ارث می‌برند؛ timezone از tzinfo ارث می‌برد؛ و datetime از date ارث می‌برد.

ویژگی‌های مشترک

انواع date، datetime، time و timezone این ویژگی‌های مشترک را دارند:

  • اشیای این نوع‌ها تغییرناپذیر هستند.

  • اشیای این نوع‌ها هش‌پذیر هستند، یعنی می‌توان از آن‌ها به‌عنوان کلیدهای دیکشنری استفاده کرد.

  • اشیاء این نوع‌ها از پیکل‌کردن کارآمد از طریق ماژول pickle پشتیبانی می‌کنند.

تعیین آگاه یا ساده بودن یک شیء

اشیای نوع date همیشه ساده هستند.

یک شیء از نوع time یا datetime ممکن است آگاه یا ساده باشد.

یک شیء datetime به نام d آگاه است اگر هر دو شرط زیر برقرار باشند:

  1. d.tzinfo برابر با None نیست

  2. d.tzinfo.utcoffset(d) مقدار None را برنمی‌گرداند

در غیر این صورت، d ساده است.

یک شیء t از کلاس time آگاه است اگر هر دو مورد زیر برقرار باشند:

  1. t.tzinfo برابر None نیست

  2. t.tzinfo.utcoffset(None) مقدار None را برنمی‌گرداند.

در غیر این صورت، t ساده است.

تمایز میان آگاه و ساده برای اشیای timedelta صدق نمی‌کند.

اشیاء timedelta

یک شیء timedelta نشان‌دهنده‌ی یک بازه‌ی زمانی، یعنی اختلاف بین دو نمونه از datetime یا date است.

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

تمام آرگومان‌ها اختیاری هستند و مقدار پیش‌فرض آن‌ها ۰ است. آرگومان‌ها می‌توانند عدد صحیح یا عدد اعشاری باشند و می‌توانند مثبت یا منفی باشند.

فقط days، seconds و microseconds به‌صورت داخلی ذخیره می‌شوند. آرگومان‌ها به آن واحدها تبدیل می‌شوند:

  • یک میلی‌ثانیه به ۱۰۰۰ میکروثانیه تبدیل می‌شود.

  • یک دقیقه به ۶۰ ثانیه تبدیل می‌شود.

  • یک ساعت به ۳۶۰۰ ثانیه تبدیل می‌شود.

  • یک هفته به ۷ روز تبدیل می‌شود.

و روزها، ثانیه‌ها و میکروثانیه‌ها سپس نرمال می‌شوند تا نمایش یکتا باشد، با

  • 0 <= microseconds < 1000000

  • 0 <= seconds < 3600*24 (تعداد ثانیه‌ها در یک روز)

  • -999999999 <= days <= 999999999

مثال زیر نشان می‌دهد که چگونه هر آرگومانی به‌جز days، seconds و microseconds «ادغام» و در آن سه ویژگی حاصل نرمال‌سازی می‌شود:

>>> import datetime as dt
>>> delta = dt.timedelta(
...     days=50,
...     seconds=27,
...     microseconds=10,
...     milliseconds=29000,
...     minutes=5,
...     hours=8,
...     weeks=2
... )
>>> # Only days, seconds, and microseconds remain
>>> delta
datetime.timedelta(days=64, seconds=29156, microseconds=10)

نکته

import datetime as dt به‌جای import datetime یا from datetime import datetime، برای جلوگیری از اشتباه گرفتن ماژول با کلاس. به چگونه ماژول datetime پایتون را ایمپورت می‌کنم مراجعه کنید.

اگر دست‌کم یکی از آرگومان‌ها عدد اعشاری باشد و بخش‌های کسری میکروثانیه وجود داشته باشد، بخش‌های کسری میکروثانیه باقی‌مانده از همه آرگومان‌ها با هم ترکیب می‌شوند و مجموع آن‌ها با استفاده از قاعده‌ی رفع تساوی گرد کردن نیمه به زوج (round-half-to-even) به نزدیک‌ترین میکروثانیه گرد می‌شود. اگر هیچ آرگومانی عدد اعشاری نباشد، فرآیندهای تبدیل و عادی‌سازی دقیق هستند (هیچ اطلاعاتی از دست نمی‌رود).

اگر مقدار نرمال‌شده‌ی days خارج از محدوده‌ی مشخص‌شده باشد، OverflowError پرتاب می‌شود.

توجه داشته باشید که نرمال‌سازی مقادیر منفی ممکن است در ابتدا شگفت‌آور باشد. برای مثال:

>>> import datetime as dt
>>> d = dt.timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)

از آنجا که نمایش رشته‌ای اشیاء timedelta می‌تواند گیج‌کننده باشد، برای تولید قالبی خواناتر از راهکار زیر استفاده کنید:

>>> def pretty_timedelta(td):
...     if td.days >= 0:
...         return str(td)
...     return f'-({-td!s})'
...
>>> d = timedelta(hours=-1)
>>> str(d)  # not human-friendly
'-1 day, 23:00:00'
>>> pretty_timedelta(d)
'-(1:00:00)'

ویژگی‌های کلاس:

timedelta.min

منفی‌ترین شیء timedelta، timedelta(-999999999).

timedelta.max

مثبت‌ترین شیء timedelta، timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).

timedelta.resolution

کوچک‌ترین اختلاف ممکن بین شیءهای غیرمساوی timedelta، timedelta(microseconds=1).

توجه داشته باشید که به دلیل نرمال‌سازی، timedelta.max بزرگ‌تر از -timedelta.min است. -timedelta.max به‌صورت یک شیء timedelta قابل بازنمایی نیست.

ویژگی‌های نمونه (فقط‌خواندنی):

timedelta.days

بین -۹۹۹٬۹۹۹٬۹۹۹ و ۹۹۹٬۹۹۹٬۹۹۹، شامل هر دو مقدار.

timedelta.seconds

بین ۰ تا ۸۶٬۳۹۹ (شامل هر دو).

ملاحظه

این اشکالی نسبتاً رایج است که کد به‌طور غیرعمدی از این ویژگی استفاده کند، در حالی که در واقع قصد بر این بوده است که به‌جای آن مقدار total_seconds() دریافت شود:

>>> import datetime as dt
>>> duration = dt.timedelta(seconds=11235813)
>>> duration.days, duration.seconds
(130, 3813)
>>> duration.total_seconds()
11235813.0
timedelta.microseconds

از ۰ تا ۹۹۹٬۹۹۹ (شامل هر دو).

عملیات پشتیبانی‌شده:

عملیات

نتیجه

t1 = t2 + t3

مجموع t2 و t3. پس از آن، t1 - t2 == t3 و t1 - t3 == t2 درست هستند. (1)

t1 = t2 - t3

تفاضل t2 و t3. پس از آن t1 == t2 - t3 و t2 == t1 + t3 برقرار هستند. (1)(6)

t1 = t2 * i or t1 = i * t2

دلتا ضرب‌شده در یک عدد صحیح. پس از آن t1 // i == t2 برقرار است، به شرطی که i != 0.

به‌طور کلی، t1  * i == t1 * (i-1) + t1 برقرار است. (1)

t1 = t2 * f or t1 = f * t2

دلتا در یک float ضرب می‌شود. نتیجه به نزدیک‌ترین مضرب timedelta.resolution با استفاده از روش گرد کردن نیمه به زوج (round-half-to-even) گرد می‌شود.

f = t2 / t3

تقسیم (۳) مدت‌زمان کل t2 بر واحد بازه t3. یک شیء float برمی‌گرداند.

t1 = t2 / f or t1 = t2 / i

دلتا تقسیم‌شده بر یک float یا int. نتیجه به نزدیک‌ترین مضرب timedelta.resolution با استفاده از گرد کردن نیمه به زوج (round-half-to-even) گرد می‌شود.

t1 = t2 // i یا t1 = t2 // t3

مقدار کف محاسبه می‌شود و باقی‌مانده (در صورت وجود) دور انداخته می‌شود. در حالت دوم، یک عدد صحیح برگردانده می‌شود. (۳)

t1 = t2 % t3

باقی‌مانده به‌صورت یک شیء timedelta محاسبه می‌شود. (3)

q, r = divmod(t1, t2)

خارج‌قسمت و باقی‌مانده را محاسبه می‌کند: q = t1 // t2 (3) و r = t1 % t2. q یک عدد صحیح است و r یک شیء timedelta است.

+t1

یک شیء timedelta با همان مقدار برمی‌گرداند. (2)

-t1

معادل timedelta(-t1.days, -t1.seconds, -t1.microseconds) و t1 * -1 است. (1)(4)

abs(t)

هنگامی که t.days >= 0 باشد، معادل +t و هنگامی که t.days < 0 باشد، معادل -t است. (2)

str(t)

رشته‌ای را در قالب [D day[s], ][H]H:MM:SS[.UUUUUU] برمی‌گرداند، که در آن D در صورت منفی بودن t منفی است. (5)

repr(t)

نمایش رشته‌ای شیء timedelta را به‌صورت یک فراخوانی سازنده با مقادیر ویژگی‌های کانونیکال برمی‌گرداند.

یادداشت‌ها:

  1. این دقیق است، اما ممکن است سرریز شود.

  2. این دقیق است و نمی‌تواند سرریز کند.

  3. تقسیم بر صفر باعث پرتاب ZeroDivisionError می‌شود.

  4. -timedelta.max به‌صورت یک شیء timedelta قابل نمایش نیست.

  5. نمایش‌های رشته‌ای اشیای timedelta به‌صورت مشابهی با نمایش داخلی آن‌ها نرمال می‌شوند. این موضوع برای timedeltaهای منفی به نتایج نسبتاً غیرمعمولی منجر می‌شود. برای مثال:

    >>> timedelta(hours=-5)
    datetime.timedelta(days=-1, seconds=68400)
    >>> print(_)
    -1 day, 19:00:00
    
  6. عبارت t2 - t3 همیشه با عبارت t2 + (-t3) برابر خواهد بود، مگر وقتی t3 برابر timedelta.max باشد؛ در آن حالت، عبارت اول نتیجه‌ای تولید می‌کند، در حالی که عبارت دوم سرریز می‌شود.

علاوه بر عملیات فهرست‌شده در بالا، اشیای timedelta از برخی عملیات جمع و تفریق با اشیای date و datetime پشتیبانی می‌کنند (در ادامه ببینید).

تغییر یافته در نسخه‌ی 3.2: تقسیم کف و تقسیم حقیقی یک شیء timedelta بر یک شیء timedelta دیگر اکنون پشتیبانی می‌شوند؛ همچنین عملیات باقی‌مانده و تابع divmod() نیز پشتیبانی می‌شوند. تقسیم حقیقی و ضرب یک شیء timedelta در یک شیء float اکنون پشتیبانی می‌شوند.

اشیای timedelta از مقایسه‌های برابری و ترتیب پشتیبانی می‌کنند.

در زمینه‌های بولی، یک شیء timedelta تنها و تنها در صورتی درست در نظر گرفته می‌شود که با timedelta(0) برابر نباشد.

متدهای نمونه:

timedelta.total_seconds()

تعداد کل ثانیه‌های موجود در مدت را برمی‌گرداند. معادل td / timedelta(seconds=1) است. برای واحدهای بازه‌ای غیر از ثانیه، از شکل تقسیم به‌طور مستقیم استفاده کنید (برای مثال، td / timedelta(microseconds=1)).

توجه داشته باشید که برای بازه‌های زمانی بسیار بزرگ (بیش از ۲۷۰ سال در بیشتر پلتفرم‌ها)، این متد دقت میکروثانیه‌ای را از دست خواهد داد.

اضافه شده در نسخه‌ی 3.2.

نمونه‌های کاربرد: timedelta

مثالی اضافی از نرمال‌سازی:

>>> # Components of another_year add up to exactly 365 days
>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> another_year = dt.timedelta(weeks=40, days=84, hours=23,
...                             minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0

نمونه‌هایی از محاسبات timedelta:

>>> import datetime as dt
>>> year = dt.timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)

اشیای date

یک شیء date نشان‌دهنده یک تاریخ (سال، ماه و روز) در یک گاه‌شماری ایده‌آل است، یعنی گاه‌شماری میلادی کنونی که به‌طور نامحدود در هر دو جهت امتداد یافته است.

۱ ژانویه سال ۱، روز شماره‌ی ۱ نامیده می‌شود، ۲ ژانویه سال ۱، روز شماره‌ی ۲ نامیده می‌شود و به همین ترتیب. [2]

class datetime.date(year, month, day)

همه‌ی آرگومان‌ها الزامی هستند. آرگومان‌ها باید عدد صحیح باشند و در بازه‌های زیر قرار داشته باشند:

  • MINYEAR <= year <= MAXYEAR

  • 1 <= month <= 12

  • 1 <= day <= number of days in the given month and year

اگر آرگومانی خارج از آن بازه‌ها داده شود، ValueError پرتاب می‌شود.

سازنده‌های دیگر، همه متدهای کلاس:

classmethod date.today()

تاریخ محلی فعلی را برمی‌گرداند.

این معادل date.fromtimestamp(time.time()) است.

classmethod date.fromtimestamp(timestamp)

تاریخ محلی متناظر با برچسب زمانی POSIX را برمی‌گرداند، مانند مقداری که توسط time.time() برگردانده می‌شود.

این ممکن است در صورتی که برچسب زمانی خارج از بازه مقادیر پشتیبانی‌شده توسط تابع C localtime() در سکو باشد، OverflowError را پرتاب کند، و در صورت شکست localtime() نیز OSError را پرتاب کند. این معمولاً به سال‌های ۱۹۷۰ تا ۲۰۳۸ محدود است. توجه داشته باشید که در سیستم‌های غیر POSIX که ثانیه‌های کبیسه را در مفهوم برچسب زمانی خود لحاظ می‌کنند، ثانیه‌های کبیسه توسط fromtimestamp() نادیده گرفته می‌شوند.

تغییر یافته در نسخه‌ی 3.3: اگر برچسب زمانی خارج از محدوده مقادیر پشتیبانی‌شده توسط تابع localtime() در C پلتفرم باشد، OverflowError به جای ValueError پرتاب می‌شود. در صورت شکست localtime()، OSError به جای ValueError پرتاب می‌شود.

classmethod date.fromordinal(ordinal)

تاریخ متناظر با ordinal در گاه‌شماری میلادی تعمیم‌یافته (proleptic Gregorian) را برمی‌گرداند؛ به‌طوری‌که ۱ ژانویه سال ۱ دارای شماره ترتیبی ۱ است.

استثنای ValueError پرتاب می‌شود مگر اینکه 1 <= ordinal <= date.max.toordinal(). برای هر تاریخ d، date.fromordinal(d.toordinal()) == d.

classmethod date.fromisoformat(date_string)

یک date متناظر با date_string داده‌شده در هر قالب معتبر ISO 8601 برمی‌گرداند، با استثناهای زیر:

  1. تاریخ‌های با دقت کاهش‌یافته در حال حاضر پشتیبانی نمی‌شوند (YYYY-MM، YYYY).

  2. بازنمایی‌های گسترده‌ی تاریخ در حال حاضر پشتیبانی نمی‌شوند (±YYYYYY-MM-DD).

  3. تاریخ‌های ترتیبی در حال حاضر پشتیبانی نمی‌شوند (YYYY-OOO).

مثال‌ها:

>>> import datetime as dt
>>> dt.date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
>>> dt.date.fromisoformat('20191204')
datetime.date(2019, 12, 4)
>>> dt.date.fromisoformat('2021-W01-1')
datetime.date(2021, 1, 4)

اضافه شده در نسخه‌ی 3.7.

تغییر یافته در نسخه‌ی 3.11: پیش‌تر، این متد فقط از قالب YYYY-MM-DD پشتیبانی می‌کرد.

classmethod date.fromisocalendar(year, week, day)

یک date متناظر با تاریخ گاه‌شماری ISO مشخص‌شده با year، week و day برمی‌گرداند. این معکوس تابع date.isocalendar() است.

اضافه شده در نسخه‌ی 3.8.

classmethod date.strptime(date_string, format)

یک date متناظر با date_string را برمی‌گرداند، که بر اساس format تجزیه‌شده است. این معادل است با:

date(*(time.strptime(date_string, format)[0:3]))

ValueError در صورتی پرتاب می‌شود که date_string و format توسط time.strptime() قابل تجزیه نباشند یا این تابع مقداری برگرداند که یک تاپل زمانیی (time tuple) نیست. همچنین ببینید رفتار strftime() و strptime() و date.fromisoformat().

توجه

اگر format روزی از ماه را بدون سال تعیین کند، یک DeprecationWarning نشان داده می‌شود. این کار برای اجتناب از یک اشکال چهارساله‌ی مربوط به سال کبیسه در کدی است که فقط به دنبال تجزیه‌ی ماه و روز است، زیرا سال پیش‌فرضی که در نبود سال در قالب استفاده می‌شود، سال کبیسه نیست. چنین مقادیر format ممکن است از پایتون 3.15 به بعد خطایی پرتاب کنند. راه‌حل این است که همیشه یک سال را در format خود بگنجانید. اگر مقادیر date_string را که سال ندارند تجزیه می‌کنید، پیش از تجزیه به‌صراحت یک سال کبیسه اضافه کنید:

>>> import datetime as dt
>>> date_string = "02/29"
>>> when = dt.date.strptime(f"{date_string};1984", "%m/%d;%Y")  # Avoids leap year bug.
>>> when.strftime("%B %d")
'February 29'

اضافه شده در نسخه‌ی 3.14.

ویژگی‌های کلاس:

date.min

زودترین تاریخ قابل نمایش، date(MINYEAR, 1, 1).

date.max

آخرین تاریخ قابل‌نمایش، date(MAXYEAR, 12, 31).

date.resolution

کمترین اختلاف ممکن بین اشیای date نابرابر، timedelta(days=1).

ویژگی‌های نمونه (فقط‌خواندنی):

date.year

بین MINYEAR و MAXYEAR (شامل هر دو مقدار).

date.month

بین ۱ تا ۱۲، شامل هر دو.

date.day

بین ۱ تا تعداد روزهای ماه داده‌شده در سال داده‌شده.

عملیات پشتیبانی‌شده:

عملیات

نتیجه

date2 = date1 + timedelta

date2 به اندازه‌ی timedelta.days روز پس از date1 خواهد بود. (1)

date2 = date1 - timedelta

date2 را به‌گونه‌ای محاسبه می‌کند که date2 + timedelta == date1. (2)

timedelta = date1 - date2

(3)

date1 == date2
date1 != date2

مقایسه برابری. (۴)

date1 < date2
date1 > date2
date1 <= date2
date1 >= date2

مقایسه‌ی ترتیب. (۵)

یادداشت‌ها:

  1. date2 اگر timedelta.days > 0 باشد، به جلو در زمان منتقل می‌شود، یا اگر timedelta.days < 0 باشد، به عقب در زمان منتقل می‌شود. پس از آن date2 - date1 == timedelta.days خواهد بود. timedelta.seconds و timedelta.microseconds نادیده گرفته می‌شوند. اگر date2.year کوچک‌تر از MINYEAR یا بزرگ‌تر از MAXYEAR باشد، OverflowError پرتاب می‌شود.

  2. timedelta.seconds و timedelta.microseconds نادیده گرفته می‌شوند.

  3. این دقیق است و امکان سرریز ندارد. timedelta.seconds و timedelta.microseconds برابر ۰ هستند و پس از آن date2 + timedelta == date1 برقرار است.

  4. اشیای date زمانی با هم برابرند که تاریخ یکسانی را نشان دهند.

    اشیای date که نمونه‌های datetime نیز نیستند، هرگز با اشیای datetime برابر نیستند، حتی اگر نشان‌دهنده‌ی تاریخ یکسانی باشند.

  5. date1 کمتر از date2 در نظر گرفته می‌شود هرگاه date1 از نظر زمانی پیش از date2 باشد. به عبارت دیگر، date1 < date2 اگر و فقط اگر date1.toordinal() < date2.toordinal().

    مقایسه ترتیبی بین یک شیء date که نمونه‌ای از datetime نیز نیست و یک شیء datetime باعث پرتاب TypeError می‌شود.

تغییر یافته در نسخه‌ی 3.13: مقایسه بین شیء datetime و نمونه‌ای از زیرکلاس date که زیرکلاسی از datetime نیست، دیگر دومی را با نادیده گرفتن بخش زمان و منطقه‌ی زمانی به date تبدیل نمی‌کند. می‌توان رفتار پیش‌فرض را با بازنویسی متدهای ویژه‌ی مقایسه در زیرکلاس‌ها تغییر داد.

در زمینه‌های بولی، تمام اشیاء date به‌عنوان درست در نظر گرفته می‌شوند.

متدهای نمونه:

date.replace(year=self.year, month=self.month, day=self.day)

یک شیء date جدید با همان مقادیر برمی‌گرداند، اما پارامترهای مشخص‌شده به‌روزرسانی می‌شوند.

مثال:

>>> import datetime as dt
>>> d = dt.date(2002, 12, 31)
>>> d.replace(day=26)
datetime.date(2002, 12, 26)

تابع عام copy.replace() همچنین از اشیای date پشتیبانی می‌کند.

date.timetuple()

یک time.struct_time برمی‌گرداند، مانند آنچه time.localtime() برمی‌گرداند.

ساعت‌ها، دقیقه‌ها و ثانیه‌ها ۰ هستند و پرچم DST برابر منفی ۱ است.

d.timetuple() معادل است با:

time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))

که در آن yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 شماره‌ی روز در سال جاری است و از ۱ برای ۱ ژانویه آغاز می‌شود.

date.toordinal()

شماره‌ی ترتیبی تاریخ در گاه‌شماری میلادی تعمیم‌یافته را برمی‌گرداند، که در آن ۱ ژانویه سال ۱ دارای شماره‌ی ترتیبی ۱ است. برای هر شیء date مانند d، date.fromordinal(d.toordinal()) == d است.

date.weekday()

روز هفته را به‌صورت یک عدد صحیح برمی‌گرداند، که در آن دوشنبه ۰ و یکشنبه ۶ است. برای مثال، date(2002, 12, 4).weekday() == 2، یک چهارشنبه. همچنین isoweekday() را ببینید.

date.isoweekday()

روز هفته را به‌صورت یک عدد صحیح برمی‌گرداند، به‌گونه‌ای که دوشنبه ۱ و یکشنبه ۷ است. برای مثال، date(2002, 12, 4).isoweekday() == 3، یک چهارشنبه. همچنین ببینید weekday()، isocalendar().

date.isocalendar()

یک شیء named tuple با سه کامپوننت برمی‌گرداند: year، week و weekday.

گاه‌شماری ISO گونه‌ای پرکاربرد از گاه‌شماری میلادی است. [3]

سال ISO شامل ۵۲ یا ۵۳ هفته‌ی کامل است و هر هفته از دوشنبه شروع می‌شود و در یکشنبه پایان می‌یابد. اولین هفته‌ی سال ISO، اولین هفته‌ی گاه‌شماریی (میلادی) از سال است که شامل یک پنجشنبه باشد. این هفته، هفته شماره ۱ نامیده می‌شود و سال ISO آن پنجشنبه برابر با سال میلادی آن است.

برای مثال، سال ۲۰۰۴ در پنج‌شنبه آغاز می‌شود، بنابراین نخستین هفته‌ی سال ISO ۲۰۰۴ در دوشنبه، ۲۹ دسامبر ۲۰۰۳ آغاز می‌شود و در یکشنبه، ۴ ژانویه‌ی ۲۰۰۴ پایان می‌یابد:

>>> import datetime as dt
>>> dt.date(2003, 12, 29).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=1)
>>> dt.date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)

تغییر یافته در نسخه‌ی 3.9: نتیجه از یک تاپل به یک تاپل نام‌دار تغییر کرد.

date.isoformat()

رشته‌ای را برمی‌گرداند که نشان‌دهنده‌ی تاریخ در قالب ISO 8601 است، YYYY-MM-DD:

>>> import datetime as dt
>>> dt.date(2002, 12, 4).isoformat()
'2002-12-04'
date.__str__()

برای یک تاریخ d، str(d) معادل d.isoformat() است.

date.ctime()

رشته‌ای را برمی‌گرداند که نشان‌دهنده‌ی تاریخ است:

>>> import datetime as dt
>>> dt.date(2002, 12, 4).ctime()
'Wed Dec  4 00:00:00 2002'

d.ctime() معادل است با:

time.ctime(time.mktime(d.timetuple()))

در سکوهایی که تابع بومی C ctime() (که time.ctime() آن را فراخوانی می‌کند، اما date.ctime() آن را فراخوانی نمی‌کند) با استاندارد C مطابقت دارد.

date.strftime(format)

رشته‌ای برمی‌گرداند که نشان‌دهنده‌ی تاریخ است و با یک رشته قالب صریح کنترل می‌شود. کدهای قالب مربوط به ساعت، دقیقه یا ثانیه مقدار ۰ خواهند داشت. همچنین ببینید رفتار strftime() و strptime() و date.isoformat().

date.__format__(format)

همانند date.strftime(). این امر به شما امکان می‌دهد که یک رشته‌ی قالب را برای یک شیء date در رشته‌های قالب‌بندی‌شده و هنگام استفاده از str.format() تعیین کنید. همچنین رفتار strftime() و strptime() و date.isoformat() را ببینید.

نمونه‌هایی از کاربرد: date

مثالی از شمارش روزها تا یک رویداد:

>>> import time
>>> import datetime as dt
>>> today = dt.date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == dt.date.fromtimestamp(time.time())
True
>>> my_birthday = dt.date(today.year, 6, 24)
>>> if my_birthday < today:
...     my_birthday = my_birthday.replace(year=today.year + 1)
...
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202

مثال‌های بیشتر از کار با date:

>>> import datetime as dt
>>> d = dt.date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)

>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'

>>> # Methods for extracting 'components' under different calendars
>>> t = d.timetuple()
>>> for i in t:
...     print(i)
2002                # year
3                   # month
11                  # day
0
0
0
0                   # weekday (0 = Monday)
70                  # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
...     print(i)
2002                # ISO year
11                  # ISO week number
1                   # ISO day number ( 1 = Monday )

>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)

اشیاء datetime

یک شیء datetime، یک شیء واحد است که شامل تمام اطلاعات یک شیء date و یک شیء time می‌شود.

مانند یک شیء date، datetime فرض می‌کند که گاه‌شماری میلادی کنونی در هر دو جهت گسترش‌یافته است؛ مانند یک شیء time، datetime فرض می‌کند که در هر روز دقیقاً ۳۶۰۰*۲۴ ثانیه وجود دارد.

سازنده:

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

آرگومان‌های year، month و day الزامی هستند. tzinfo می‌تواند None یا نمونه‌ای از یک زیرکلاس tzinfo باشد. آرگومان‌های باقی‌مانده باید اعداد صحیحی در بازه‌های زیر باشند:

  • MINYEAR <= year <= MAXYEAR,

  • 1 <= month <= 12,

  • 1 <= day <= number of days in the given month and year,

  • 0 <= hour < 24,

  • 0 <= minute < 60,

  • 0 <= second < 60,

  • 0 <= microsecond < 1000000,

  • fold in [0, 1].

اگر آرگومانی خارج از آن بازه‌ها داده شود، ValueError پرتاب می‌شود.

تغییر یافته در نسخه‌ی 3.6: پارامتر fold اضافه شد.

سازنده‌های دیگر، همه متدهای کلاس:

classmethod datetime.today()

تاریخ و زمان محلی فعلی را با tzinfo برابر None بازمی‌گرداند.

معادل با:

datetime.fromtimestamp(time.time())

همچنین ببینید now()، fromtimestamp().

این متد از نظر عملکردی معادل now() است، اما بدون پارامتر tz.

classmethod datetime.now(tz=None)

تاریخ و زمان محلی فعلی را برمی‌گرداند.

اگر آرگومان اختیاری tz برابر None باشد یا مشخص ن‌شده باشد، این مانند today() است، اما در صورت امکان، دقت بیشتری نسبت به آنچه می‌توان از طریق یک مهر زمانی از time.time() به دست آورد، فراهم می‌کند (برای مثال، این ممکن است در سکوهایی که تابع C gettimeofday() را ارائه می‌کنند، امکان‌پذیر باشد).

اگر tz None نباشد، باید نمونه‌ای از یک زیرکلاس tzinfo باشد و تاریخ و زمان جاری به منطقه‌ی زمانی tz تبدیل می‌شوند.

این تابع به today() و utcnow() ترجیح داده می‌شود.

توجه

فراخوانی‌های بعدی به datetime.now() ممکن است بسته به دقت ساعت زیربنایی، همان لحظه را برگردانند.

classmethod datetime.utcnow()

تاریخ و زمان UTC جاری را با tzinfo برابر None برمی‌گرداند.

این مانند now() است، اما تاریخ و زمان جاری UTC را به‌عنوان یک شیء datetime ساده برمی‌گرداند. یک datetime جاری UTC آگاه را می‌توان با فراخوانی datetime.now(timezone.utc) به‌دست آورد. همچنین now() را ببینید.

هشدار

از آنجا که اشیای datetime ساده توسط بسیاری از متدهای datetime به‌عنوان زمان‌های محلی در نظر گرفته می‌شوند، ترجیح داده می‌شود برای نمایش زمان‌ها در UTC از datetimes آگاه استفاده کنید. بنابراین، روش توصیه‌شده برای ایجاد شیءای که زمان فعلی در UTC را نشان می‌دهد، فراخوانی datetime.now(timezone.utc) است.

منسوخ شده از نسخه‌ی 3.12: به‌جای آن از datetime.now() با UTC استفاده کنید.

classmethod datetime.fromtimestamp(timestamp, tz=None)

تاریخ و زمان محلی متناظر با مهر زمانی POSIX را برمی‌گرداند، مانند آنچه که توسط time.time() برگردانده می‌شود. اگر آرگومان اختیاری tz برابر None باشد یا مشخص‌نشده باشد، مهر زمانی به تاریخ و زمان محلی پلتفرم تبدیل می‌شود و شیء datetime برگردانده‌شده ساده است.

اگر tz برابر None نباشد، باید نمونه‌ای از یک زیرکلاس tzinfo باشد، و مهر زمانی به منطقه‌ی زمانی tz تبدیل می‌شود.

fromtimestamp() ممکن است اگر مهر زمانی خارج از محدوده‌ی مقادیر پشتیبانی‌شده توسط توابع localtime() یا gmtime() در C سکو باشد، OverflowError پرتاب کند، و در صورت شکست localtime() یا gmtime() نیز OSError پرتاب کند. معمولاً این محدوده به سال‌های ۱۹۷۰ تا ۲۰۳۸ محدود می‌شود. توجه داشته باشید که در سامانه‌های غیر POSIX که ثانیه‌های کبیسه را در مفهوم خود از مهر زمانی لحاظ می‌کنند، ثانیه‌های کبیسه در fromtimestamp() در نظر گرفته نمی‌شوند، و در نتیجه ممکن است دو مهر زمانی با اختلاف یک ثانیه، اشیاء datetime یکسانی برگردانند. این متد به utcfromtimestamp() ترجیح داده می‌شود.

تغییر یافته در نسخه‌ی 3.3: اگر برچسب زمانی خارج از محدوده مقادیر پشتیبانی‌شده توسط توابع C سکو، localtime() یا gmtime()، باشد، OverflowError به‌جای ValueError پرتاب می‌شود. در صورت شکست localtime() یا gmtime()، OSError به‌جای ValueError پرتاب می‌شود.

تغییر یافته در نسخه‌ی 3.6: fromtimestamp() ممکن است نمونه‌هایی را برگرداند که fold آن‌ها روی ۱ تنظیم شده است.

classmethod datetime.utcfromtimestamp(timestamp)

datetime UTC متناظر با مهر زمانی POSIX را با tzinfo برابر None برمی‌گرداند. (شیء حاصل ساده است.)

این ممکن است در صورتی که مهر زمانی خارج از محدوده مقادیر پشتیبانی‌شده توسط تابع C gmtime() در پلتفرم باشد، OverflowError را پرتاب کند، و در صورت شکست gmtime()، OSError را نیز پرتاب کند. معمولاً این به سال‌های ۱۹۷۰ تا ۲۰۳۸ محدود است.

برای دریافت یک شیء datetime آگاه، متد fromtimestamp() را فراخوانی کنید:

datetime.fromtimestamp(timestamp, timezone.utc)

در پلتفرم‌های سازگار با POSIX، معادل عبارت زیر است:

datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)

با این تفاوت که فرمول دوم همیشه از بازه‌ی کامل سال‌ها پشتیبانی می‌کند: بین MINYEAR و MAXYEAR به‌صورت شامل هر دو.

هشدار

از آن‌جا که بسیاری از متدهای datetime با شیءهای datetime ساده به‌عنوان زمان‌های محلی رفتار می‌کنند، ترجیح داده می‌شود برای نمایش زمان‌ها در UTC از datetimeهای آگاه استفاده شود. بنابراین، روش توصیه‌شده برای ایجاد یک شیء برای نمایش یک برچسب زمانی مشخص در UTC، فراخوانی datetime.fromtimestamp(timestamp, tz=timezone.utc) است.

تغییر یافته در نسخه‌ی 3.3: اگر برچسب زمانی خارج از محدوده مقادیر پشتیبانی‌شده توسط تابع gmtime() در زبان C پلتفرم باشد، OverflowError به‌جای ValueError پرتاب می‌شود. در صورت شکست gmtime()، OSError به‌جای ValueError پرتاب می‌شود.

تغییر یافته در نسخه‌ی 3.15: هر عدد حقیقی را به‌عنوان timestamp می‌پذیرد، نه فقط عدد صحیح یا float.

منسوخ شده از نسخه‌ی 3.12: به‌جای آن از datetime.fromtimestamp() با UTC استفاده کنید.

classmethod datetime.fromordinal(ordinal)

datetime متناظر با شماره ترتیبی گاه‌شماری میلادی پیش‌رو (proleptic Gregorian ordinal) را برمی‌گرداند، که در آن ۱ ژانویه سال ۱ شماره ترتیبی ۱ را دارد. استثنای ValueError پرتاب می‌شود، مگر اینکه 1 <= ordinal <= datetime.max.toordinal() باشد. ساعت، دقیقه، ثانیه و میکروثانیه‌ی نتیجه همگی ۰ هستند و tzinfo برابر None است.

classmethod datetime.combine(date, time, tzinfo=time.tzinfo)

یک شیء جدید datetime برمی‌گرداند که کامپوننت‌های تاریخ آن برابر با کامپوننت‌های تاریخ شیء date داده‌شده است، و کامپوننت‌های زمان آن برابر با کامپوننت‌های زمان شیء time داده‌شده است. اگر آرگومان tzinfo ارائه شود، از مقدار آن برای تنظیم ویژگی tzinfo نتیجه استفاده می‌شود، در غیر این صورت از ویژگی tzinfo آرگومان time استفاده می‌شود. اگر آرگومان date یک شیء datetime باشد، کامپوننت‌های زمان و ویژگی tzinfo آن نادیده گرفته می‌شوند.

برای هر شیء d از کلاس datetime، d == datetime.combine(d.date(), d.time(), d.tzinfo).

تغییر یافته در نسخه‌ی 3.6: آرگومان tzinfo افزوده شد.

classmethod datetime.fromisoformat(date_string)

یک datetime متناظر با date_string را در هر قالب معتبر ISO 8601 برمی‌گرداند، با استثناهای زیر:

  1. آفست‌های منطقه زمانی ممکن است ثانیه‌های کسری داشته باشند.

  2. می‌توان جداکننده‌ی T را با هر نویسه‌ی یونیکد واحدی جایگزین کرد.

  3. ساعت‌ها و دقیقه‌های کسری پشتیبانی نمی‌شوند.

  4. تاریخ‌های با دقت کاهش‌یافته در حال حاضر پشتیبانی نمی‌شوند (YYYY-MM، YYYY).

  5. بازنمایی‌های گسترده‌ی تاریخ در حال حاضر پشتیبانی نمی‌شوند (±YYYYYY-MM-DD).

  6. تاریخ‌های ترتیبی در حال حاضر پشتیبانی نمی‌شوند (YYYY-OOO).

مثال‌ها:

>>> import datetime as dt
>>> dt.datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
>>> dt.datetime.fromisoformat('20111104')
datetime.datetime(2011, 11, 4, 0, 0)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)
>>> dt.datetime.fromisoformat('20111104T000523')
datetime.datetime(2011, 11, 4, 0, 5, 23)
>>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283')
datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)
>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)
>>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')
datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)
>>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00')
datetime.datetime(2011, 11, 4, 0, 5, 23,
    tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

اضافه شده در نسخه‌ی 3.7.

تغییر یافته در نسخه‌ی 3.11: پیش از این، این متد فقط از قالب‌هایی پشتیبانی می‌کرد که می‌توانستند خروجی date.isoformat() یا datetime.isoformat() باشند.

classmethod datetime.fromisocalendar(year, week, day)

یک datetime متناظر با تاریخ گاه‌شماری ISO مشخص‌شده با year، week و day برمی‌گرداند. اجزای غیرتاریخی datetime با مقادیر پیش‌فرض معمول خود مقداردهی می‌شوند. این، معکوس تابع datetime.isocalendar() است.

اضافه شده در نسخه‌ی 3.8.

classmethod datetime.strptime(date_string, format)

یک datetime متناظر با date_string برمی‌گرداند که طبق format تجزیه شده است.

اگر format شامل میکروثانیه یا اطلاعات منطقه زمانی نباشد، این معادل است با:

datetime(*(time.strptime(date_string, format)[0:6]))

ValueError پرتاب می‌شود اگر date_string و format توسط time.strptime() قابل تجزیه نباشند یا اگر مقداری برگرداند که یک تاپل زمانیی نباشد. همچنین رفتار strftime() و strptime() و datetime.fromisoformat() را ببینید.

تغییر یافته در نسخه‌ی 3.13: اگر format روزی از ماه را بدون سال تعیین کند، اکنون یک DeprecationWarning نشان داده می‌شود. این کار برای اجتناب از یک باگ سال کبیسه‌ای چهارساله در کدی است که می‌خواهد فقط ماه و روز را تجزیه کند، زیرا سال پیش‌فرضی که در نبود سال در قالب استفاده می‌شود، سال کبیسه نیست. چنین مقادیری برای format ممکن است از پایتون 3.15 به بعد خطایی پرتاب کنند. راه‌حل این است که همیشه یک سال در format خود بگنجانید. اگر مقادیر date_string بدون سال را تجزیه می‌کنید، پیش از تجزیه به‌صراحت یک سال کبیسه اضافه کنید:

>>> import datetime as dt
>>> date_string = "02/29"
>>> when = dt.datetime.strptime(f"{date_string};1984", "%m/%d;%Y")  # Avoids leap year bug.
>>> when.strftime("%B %d")
'February 29'

ویژگی‌های کلاس:

datetime.min

زودترین datetime قابل‌نمایش، datetime(MINYEAR, 1, 1, tzinfo=None).

datetime.max

آخرین datetime قابل‌نمایش، datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).

datetime.resolution

کوچک‌ترین تفاوت ممکن بین اشیای datetime که برابر نیستند، timedelta(microseconds=1).

ویژگی‌های نمونه (فقط‌خواندنی):

datetime.year

بین MINYEAR و MAXYEAR (شامل هر دو مقدار).

datetime.month

بین ۱ تا ۱۲، شامل هر دو.

datetime.day

بین ۱ تا تعداد روزهای ماه داده‌شده در سال داده‌شده.

datetime.hour

در range(24).

datetime.minute

در range(60).

datetime.second

در range(60).

datetime.microsecond

در range(1000000).

datetime.tzinfo

شیء داده‌شده به‌عنوان آرگومان tzinfo به سازنده‌ی datetime، یا None اگر هیچ شیء داده نشده باشد.

datetime.fold

در [0, 1]. برای رفع ابهام از زمان‌های دیواری (wall time) در یک بازه‌ی تکرارشده استفاده می‌شود. (یک بازه‌ی تکرارشده زمانی رخ می‌دهد که ساعت‌ها در پایان ساعت تابستانی به عقب برگردانده شوند یا آفست UTC (UTC offset) برای منطقه‌ی زمانی فعلی به دلایل سیاسی کاهش یابد.) مقادیر ۰ و ۱، به‌ترتیب، نشان‌دهنده‌ی لحظه‌ی زودتر و دیرتر از میان دو لحظه‌ای هستند که نمایش زمان دیواری یکسانی دارند.

اضافه شده در نسخه‌ی 3.6.

عملیات پشتیبانی‌شده:

عملیات

نتیجه

datetime2 = datetime1 + timedelta

(1)

datetime2 = datetime1 - timedelta

(2)

timedelta = datetime1 - datetime2

(3)

datetime1 == datetime2
datetime1 != datetime2

مقایسه برابری. (۴)

datetime1 < datetime2
datetime1 > datetime2
datetime1 <= datetime2
datetime1 >= datetime2

مقایسه‌ی ترتیب. (۵)

  1. datetime2 به اندازه‌ی یک بازه‌ی زمانی timedelta از datetime1 فاصله دارد؛ اگر timedelta.days > 0 باشد در زمان به جلو حرکت می‌کند و اگر timedelta.days < 0 باشد در زمان به عقب حرکت می‌کند. نتیجه همان ویژگی tzinfo را دارد که datetime ورودی دارد، و پس از آن datetime2 - datetime1 == timedelta برقرار است. اگر datetime2.year کوچک‌تر از MINYEAR یا بزرگ‌تر از MAXYEAR باشد، OverflowError پرتاب می‌شود. توجه داشته باشید که حتی اگر ورودی یک شیء آگاه باشد، هیچ‌گونه تنظیمی برای منطقه‌ی زمانی انجام نمی‌شود.

  2. datetime2 را به‌گونه‌ای محاسبه می‌کند که datetime2 + timedelta == datetime1. همانند عمل جمع، نتیجه همان ویژگی tzinfo را دارد که datetime ورودی دارد، و حتی اگر ورودی آگاه از منطقه زمانی باشد، هیچ تنظیمی برای منطقه زمانی انجام نمی‌شود.

  3. تفریق یک datetime از یک datetime تنها در صورتی تعریف شده است که هر دو عملوند ساده باشند، یا هر دو آگاه باشند. اگر یکی آگاه و دیگری ساده باشد، TypeError پرتاب می‌شود.

    اگر هر دو ساده باشند، یا هر دو آگاه باشند و ویژگی tzinfo یکسانی داشته باشند، ویژگی‌های tzinfo نادیده گرفته می‌شوند و نتیجه یک شیء timedelta به نام t است، به‌طوری که datetime2 + t == datetime1. در این حالت هیچ تنظیمی برای منطقه زمانی انجام نمی‌شود.

    اگر هر دو آگاه باشند و ویژگی‌های tzinfo متفاوتی داشته باشند، a-b طوری عمل می‌کند که گویی a و b ابتدا به دیت‌تایم‌های ساده UTC تبدیل شده باشند. نتیجه (a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset()) است، با این تفاوت که پیاده‌سازی هرگز دچار سرریز نمی‌شود.

  4. اشیای datetime در صورتی برابر هستند که تاریخ و زمان یکسانی را نشان دهند، با در نظر گرفتن منطقه‌ی زمانی.

    اشیای datetime ساده و آگاه هرگز برابر نیستند.

    اگر هر دو طرف مقایسه آگاه باشند و ویژگی tzinfo یکسانی داشته باشند، ویژگی‌های tzinfo و fold نادیده گرفته می‌شوند و تاریخ‌زمان‌های پایه مقایسه می‌شوند. اگر هر دو طرف مقایسه آگاه باشند و ویژگی‌های tzinfo متفاوتی داشته باشند، مقایسه به‌گونه‌ای عمل می‌کند که گویی دو طرف مقایسه ابتدا به تاریخ‌زمان‌های UTC تبدیل شده‌اند، با این تفاوت که پیاده‌سازی هرگز دچار سرریز نمی‌شود. نمونه‌های datetime در یک بازه تکراری هرگز با نمونه‌های datetime در منطقه زمانی دیگر برابر نیستند.

  5. datetime1 کمتر از datetime2 در نظر گرفته می‌شود، هرگاه datetime1 با در نظر گرفتن منطقه زمانی، از نظر زمانی قبل از datetime2 قرار داشته باشد.

    مقایسه‌ی ترتیبی بین اشیای datetime ساده و آگاه، باعث پرتاب TypeError می‌شود.

    اگر هر دو طرف مقایسه آگاه باشند و ویژگی tzinfo یکسانی داشته باشند، ویژگی‌های tzinfo و fold نادیده گرفته می‌شوند و datetimeهای پایه مقایسه می‌شوند. اگر هر دو طرف مقایسه آگاه باشند و ویژگی‌های tzinfo متفاوتی داشته باشند، مقایسه به‌گونه‌ای رفتار می‌کند که گویی طرفین مقایسه ابتدا به datetimeهای UTC تبدیل شده‌اند، با این تفاوت که پیاده‌سازی هرگز دچار سرریز نمی‌شود.

تغییر یافته در نسخه‌ی 3.3: مقایسه‌های برابری بین نمونه‌های datetime آگاه و ساده، استثنای TypeError را پرتاب نمی‌کنند.

تغییر یافته در نسخه‌ی 3.13: مقایسه بین شیء datetime و نمونه‌ای از زیرکلاس date که زیرکلاسی از datetime نیست، دیگر دومی را با نادیده گرفتن بخش زمان و منطقه‌ی زمانی به date تبدیل نمی‌کند. می‌توان رفتار پیش‌فرض را با بازنویسی متدهای ویژه‌ی مقایسه در زیرکلاس‌ها تغییر داد.

متدهای نمونه:

datetime.date()

بازگرداندن شیء date با همان سال، ماه و روز.

datetime.time()

شیء time را با همان ساعت، دقیقه، ثانیه، میکروثانیه و fold برمی‌گرداند. tzinfo برابر None است. همچنین متد timetz() را ببینید.

تغییر یافته در نسخه‌ی 3.6: مقدار fold به شیء time برگردانده‌شده کپی می‌شود.

datetime.timetz()

یک شیء time با همان ویژگی‌های hour، minute، second، microsecond، fold و tzinfo را برمی‌گرداند. همچنین متد time() را ببینید.

تغییر یافته در نسخه‌ی 3.6: مقدار fold به شیء time برگردانده‌شده کپی می‌شود.

datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

یک شیء datetime جدید با همان ویژگی‌ها برمی‌گرداند، اما پارامترهای مشخص‌شده در آن به‌روزرسانی شده‌اند. توجه داشته باشید که می‌توان tzinfo=None را مشخص کرد تا بدون هیچ‌گونه تبدیل داده‌های تاریخ و زمان، یک datetime ساده از یک datetime آگاه ایجاد شود.

تابع عام copy.replace() همچنین از اشیای datetime پشتیبانی می‌کند.

تغییر یافته در نسخه‌ی 3.6: پارامتر fold اضافه شد.

datetime.astimezone(tz=None)

یک شیء datetime با ویژگی جدید tzinfo به مقدار tz برمی‌گرداند و داده‌های تاریخ و زمان را چنان تنظیم می‌کند که نتیجه همان زمان UTC مربوط به self باشد، اما به زمان محلی tz.

در صورت ارائه، tz باید نمونه‌ای از یک زیرکلاس tzinfo باشد، و متدهای utcoffset() و dst() آن نباید None برگردانند. اگر self ساده باشد، فرض می‌شود که زمان را در منطقه زمانی سیستم نشان می‌دهد.

اگر بدون آرگومان (یا با tz=None) فراخوانی شود، منطقه زمانی محلی سیستم به‌عنوان منطقه زمانی مقصد فرض می‌شود. ویژگی .tzinfo نمونه‌ی datetime تبدیل‌شده به نمونه‌ای از timezone تنظیم می‌شود که نام منطقه و آفست آن از سیستم‌عامل به‌دست آمده است.

اگر self.tzinfo همان tz باشد، self.astimezone(tz) برابر self است: هیچ تنظیمی بر داده‌های تاریخ یا زمان اعمال نمی‌شود. در غیر این صورت، نتیجه زمان محلی در منطقه زمانی tz است که همان زمان UTC مربوط به self را نشان می‌دهد: پس از astz = dt.astimezone(tz)، عبارت astz - astz.utcoffset() همان داده‌های تاریخ و زمان dt - dt.utcoffset() را خواهد داشت.

اگر صرفاً می‌خواهید یک شیء timezone به نام tz را بدون تنظیم داده‌های تاریخ و زمان به یک datetime به نام dt متصل کنید، از dt.replace(tzinfo=tz) استفاده کنید. اگر صرفاً می‌خواهید شیء timezone را از یک datetime آگاه به نام dt بدون تبدیل داده‌های تاریخ و زمان حذف کنید، از dt.replace(tzinfo=None) استفاده کنید.

توجه داشته باشید که متد پیش‌فرض tzinfo.fromutc() می‌تواند در یک زیرکلاس از tzinfo بازنویسی شود تا بر نتیجه‌ی برگردانده‌شده توسط astimezone() تأثیر بگذارد. با صرف‌نظر از حالت‌های خطا، astimezone() مانند زیر عمل می‌کند:

def astimezone(self, tz):
    if self.tzinfo is tz:
        return self
    # Convert self to UTC, and attach the new timezone object.
    utc = (self - self.utcoffset()).replace(tzinfo=tz)
    # Convert from UTC to tz's local time.
    return tz.fromutc(utc)

تغییر یافته در نسخه‌ی 3.3: اکنون می‌توان tz را حذف کرد.

تغییر یافته در نسخه‌ی 3.6: اکنون می‌توان متد astimezone() را بر روی نمونه‌های ساده که فرض می‌شود زمان محلی سیستم را نشان می‌دهند، فراخوانی کرد.

datetime.utcoffset()

اگر tzinfo برابر None باشد، None را برمی‌گرداند، در غیر این صورت self.tzinfo.utcoffset(self) را برمی‌گرداند، و اگر این فراخوانی None یا یک شیء timedelta با اندازه‌ای کمتر از یک روز را برنگرداند، استثنایی پرتاب می‌کند.

تغییر یافته در نسخه‌ی 3.7: آفست UTC به تعداد حسابی‌ای از دقیقه‌ها محدود نمی‌شود.

datetime.dst()

اگر tzinfo برابر None باشد، None را برمی‌گرداند، در غیر این صورت self.tzinfo.dst(self) را برمی‌گرداند، و اگر این فراخوانی None یا یک شیء timedelta با اندازه‌ای کمتر از یک روز را برنگرداند، استثنا پرتاب می‌کند.

تغییر یافته در نسخه‌ی 3.7: آفست ساعت تابستانی (DST offset) به تعداد حسابی‌ای از دقیقه‌ها محدود نیست.

datetime.tzname()

اگر tzinfo برابر None باشد، None را بازمی‌گرداند، در غیر این صورت self.tzinfo.tzname(self) را بازمی‌گرداند، و اگر مورد اخیر None یا یک شیء رشته را برنگرداند، استثنایی را پرتاب می‌کند،

datetime.timetuple()

یک time.struct_time برمی‌گرداند، مانند آنچه time.localtime() برمی‌گرداند.

d.timetuple() معادل است با:

time.struct_time((d.year, d.month, d.day,
                  d.hour, d.minute, d.second,
                  d.weekday(), yday, dst))

که در آن yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 شماره‌ی روز در سال جاری است که با ۱ برای اول ژانویه آغاز می‌شود. پرچم tm_isdst در نتیجه بر اساس متد dst() تنظیم می‌شود: اگر tzinfo برابر None باشد یا dst() مقدار None را برگرداند، tm_isdst روی -1 تنظیم می‌شود؛ در غیر این صورت، اگر dst() مقداری غیرصفر برگرداند، tm_isdst روی ۱ تنظیم می‌شود؛ در غیر این صورت، tm_isdst روی ۰ تنظیم می‌شود.

datetime.utctimetuple()

اگر نمونه‌ی d از datetime ساده باشد، این معادل d.timetuple() است، به جز اینکه tm_isdst بدون توجه به اینکه d.dst() چه مقداری برمی‌گرداند، به‌طور اجباری روی ۰ تنظیم می‌شود. DST هرگز برای زمان UTC فعال نیست.

اگر d آگاه باشد، d با کم کردن d.utcoffset() به زمان UTC بهنجار می‌شود و یک time.struct_time برای زمان بهنجار برگردانده می‌شود. tm_isdst به‌اجبار روی ۰ قرار می‌گیرد. توجه داشته باشید که اگر d.year برابر MINYEAR یا MAXYEAR باشد و تنظیم UTC از مرز یک سال عبور کند، ممکن است یک OverflowError پرتاب شود.

هشدار

از آن‌جا که اشیای datetime ساده توسط بسیاری از متدهای datetime به‌عنوان زمان‌های محلی در نظر گرفته می‌شوند، ترجیح داده می‌شود که برای نمایش زمان‌ها در UTC از datetimeهای آگاه استفاده کنید؛ در نتیجه، استفاده از datetime.utctimetuple() ممکن است نتایج گمراه‌کننده‌ای بدهد. اگر یک datetime ساده دارید که UTC را نشان می‌دهد، از datetime.replace(tzinfo=timezone.utc) استفاده کنید تا آگاه شود؛ پس از آن می‌توانید از datetime.timetuple() استفاده کنید.

datetime.toordinal()

شماره ترتیبی تاریخ در گاه‌شماری میلادی تعمیم‌یافته (proleptic Gregorian ordinal) را برمی‌گرداند. این مقدار همان self.date().toordinal() است.

datetime.timestamp()

مهر زمانی POSIX متناظر با نمونه‌ی datetime را برمی‌گرداند. مقدار بازگشتی یک float مشابه مقداری است که time.time() برمی‌گرداند.

Naive datetime instances are assumed to represent local time and this method relies on platform C functions to perform the conversion. Since datetime supports a wider range of values than the platform C functions on many platforms, this method may raise OverflowError or OSError for times far in the past or far in the future.

برای نمونه‌های datetime آگاه، مقدار بازگشتی به‌صورت زیر محاسبه می‌شود:

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

توجه

هیچ متدی برای به‌دست آوردن برچسب زمانی POSIX به‌صورت مستقیم از یک نمونه‌ی ساده‌ی datetime که نشان‌دهنده‌ی زمان UTC است وجود ندارد. اگر برنامه‌ی شما از این قرارداد استفاده می‌کند و منطقه‌ی زمانی سیستم شما روی UTC تنظیم نشده است، می‌توانید با ارائه‌ی tzinfo=timezone.utc برچسب زمانی POSIX را به‌دست آورید:

timestamp = dt.replace(tzinfo=timezone.utc).timestamp()

یا با محاسبه‌ی مستقیم مهر زمانی:

timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

اضافه شده در نسخه‌ی 3.3.

تغییر یافته در نسخه‌ی 3.6: متد timestamp() از ویژگی fold برای رفع ابهام زمان‌ها در طول یک بازه‌ی تکرارشده استفاده می‌کند.

تغییر یافته در نسخه‌ی 3.6: This method no longer relies on the platform C mktime() function to perform conversions.

datetime.weekday()

روز هفته را به‌عنوان عدد صحیح بازمی‌گرداند، به‌طوری که دوشنبه ۰ و یکشنبه ۶ است. معادل self.date().weekday() است. همچنین isoweekday() را ببینید.

datetime.isoweekday()

روز هفته را به‌صورت عدد صحیح برمی‌گرداند، که در آن دوشنبه ۱ و یکشنبه ۷ است. معادل self.date().isoweekday() است. همچنین weekday() و isocalendar() را ببینید.

datetime.isocalendar()

یک named tuple با سه کامپوننت برمی‌گرداند: year، week و weekday. معادل self.date().isocalendar() است.

datetime.isoformat(sep='T', timespec='auto')

رشته‌ای را برمی‌گرداند که تاریخ و زمان را در قالب ISO 8601 نشان می‌دهد:

  • YYYY-MM-DDTHH:MM:SS.ffffff، اگر microsecond برابر ۰ نباشد

  • YYYY-MM-DDTHH:MM:SS، اگر microsecond برابر ۰ باشد

اگر utcoffset() مقدار None را برنگرداند، رشته‌ای اضافه می‌شود که آفست از UTC را نشان می‌دهد:

  • YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]، اگر microsecond برابر ۰ نباشد

  • YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]، اگر microsecond برابر ۰ باشد

مثال‌ها:

>>> import datetime as dt
>>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()
'2019-05-18T15:17:08.132263'
>>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat()
'2019-05-18T15:17:00+00:00'

آرگومان اختیاری sep (پیش‌فرض 'T') یک جداکننده تک‌نویسه‌ای است که بین بخش‌های تاریخ و زمان نتیجه قرار می‌گیرد. برای مثال:

>>> import datetime as dt
>>> class TZ(dt.tzinfo):
...     """A time zone with an arbitrary, constant -06:39 offset."""
...     def utcoffset(self, when):
...         return dt.timedelta(hours=-6, minutes=-39)
...
>>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'
>>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()
'2009-11-27T00:00:00.000100-06:39'

آرگومان اختیاری timespec تعداد کامپوننت‌های اضافی زمان برای شامل شدن را مشخص می‌کند (پیش‌فرض 'auto' است). این می‌تواند یکی از موارد زیر باشد:

  • 'auto': اگر microsecond برابر ۰ باشد، مانند 'seconds' و در غیر این صورت مانند 'microseconds' است.

  • 'hours': hour را در قالب دو رقمی HH بگنجانید.

  • 'minutes': شامل hour و minute در قالب HH:MM.

  • 'seconds': شامل hour، minute و second در قالب HH:MM:SS.

  • 'milliseconds': زمان کامل را شامل می‌شود، اما بخش کسری ثانیه را به میلی‌ثانیه قطع می‌کند. قالب HH:MM:SS.sss.

  • 'microseconds': زمان کامل را در قالب HH:MM:SS.ffffff بگنجانید.

توجه

کامپوننت‌های زمانی حذف‌شده بریده می‌شوند، نه اینکه گرد شوند.

ValueError در صورت نامعتبر بودن آرگومان timespec پرتاب می‌شود:

>>> import datetime as dt
>>> dt.datetime.now().isoformat(timespec='minutes')
'2002-12-25T00:00'
>>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0)
>>> my_datetime.isoformat(timespec='microseconds')
'2015-01-01T12:30:59.000000'

تغییر یافته در نسخه‌ی 3.6: پارامتر timespec افزوده شد.

datetime.__str__()

برای یک نمونه d از datetime، str(d) معادل d.isoformat(' ') است.

datetime.ctime()

رشته‌ای برمی‌گرداند که تاریخ و زمان را نشان می‌دهد:

>>> import datetime as dt
>>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime()
'Wed Dec  4 20:30:40 2002'

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

d.ctime() معادل است با:

time.ctime(time.mktime(d.timetuple()))

در سکوهایی که تابع C بومی ctime() (که time.ctime() آن را فراخوانی می‌کند، اما datetime.ctime() آن را فراخوانی نمی‌کند) با استاندارد C مطابقت دارد.

datetime.strftime(format)

رشته‌ای را برمی‌گرداند که نشان‌دهنده تاریخ و زمان است و توسط یک رشته قالب صریح کنترل می‌شود. همچنین رفتار strftime() و strptime() و datetime.isoformat() را ببینید.

datetime.__format__(format)

مشابه datetime.strftime(). این امکان را فراهم می‌کند که یک رشته قالب را برای یک شیء datetime در رشته‌های قالب‌بندی‌شده و هنگام استفاده از str.format() مشخص کنید. همچنین ببینید رفتار strftime() و strptime() و datetime.isoformat().

نمونه‌های استفاده: datetime

نمونه‌هایی از کار با اشیای datetime:

>>> import datetime as dt

>>> # Using datetime.combine()
>>> d = dt.date(2005, 7, 14)
>>> t = dt.time(12, 30)
>>> dt.datetime.combine(d, t)
datetime.datetime(2005, 7, 14, 12, 30)

>>> # Using datetime.now()
>>> dt.datetime.now()
datetime.datetime(2007, 12, 6, 16, 29, 43, 79043)   # GMT +1
>>> dt.datetime.now(dt.timezone.utc)
datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)

>>> # Using datetime.strptime()
>>> my_datetime = dt.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
>>> my_datetime
datetime.datetime(2006, 11, 21, 16, 30)

>>> # Using datetime.timetuple() to get tuple of all attributes
>>> tt = my_datetime.timetuple()
>>> for it in tt:
...     print(it)
...
2006    # year
11      # month
21      # day
16      # hour
30      # minute
0       # second
1       # weekday (0 = Monday)
325     # number of days since 1st January
-1      # dst - method tzinfo.dst() returned None

>>> # Date in ISO format
>>> ic = my_datetime.isocalendar()
>>> for it in ic:
...     print(it)
...
2006    # ISO year
47      # ISO week
2       # ISO weekday

>>> # Formatting a datetime
>>> my_datetime.strftime("%A, %d. %B %Y %I:%M%p")
'Tuesday, 21. November 2006 04:30PM'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(my_datetime, "day", "month", "time")
'The day is 21, the month is November, the time is 04:30PM.'

مثال زیر یک زیرکلاس از tzinfo تعریف می‌کند که اطلاعات منطقه زمانی کابل، افغانستان را ثبت می‌کند؛ منطقه‌ای که تا سال ۱۹۴۵ از +4 UTC استفاده می‌کرد و پس از آن +4:30 UTC را به‌کار برد:

import datetime as dt

class KabulTz(dt.tzinfo):
    # Kabul used +4 until 1945, when they moved to +4:30
    UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)

    def utcoffset(self, when):
        if when.year < 1945:
            return dt.timedelta(hours=4)
        elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):
            # An ambiguous ("imaginary") half-hour range representing
            # a 'fold' in time due to the shift from +4 to +4:30.
            # If when falls in the imaginary range, use fold to decide how
            # to resolve. See PEP 495.
            return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))
        else:
            return dt.timedelta(hours=4, minutes=30)

    def fromutc(self, when):
        # Follow same validations as in datetime.tzinfo
        if not isinstance(when, dt.datetime):
            raise TypeError("fromutc() requires a datetime argument")
        if when.tzinfo is not self:
            raise ValueError("when.tzinfo is not self")

        # A custom implementation is required for fromutc as
        # the input to this function is a datetime with utc values
        # but with a tzinfo set to self.
        # See datetime.astimezone or fromtimestamp.
        if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:
            return when + dt.timedelta(hours=4, minutes=30)
        else:
            return when + dt.timedelta(hours=4)

    def dst(self, when):
        # Kabul does not observe daylight saving time.
        return dt.timedelta(0)

    def tzname(self, when):
        if when >= self.UTC_MOVE_DATE:
            return "+04:30"
        return "+04"

استفاده از KabulTz در بالا:

>>> tz1 = KabulTz()

>>> # Datetime before the change
>>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)
>>> print(dt1.utcoffset())
4:00:00

>>> # Datetime after the change
>>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)
>>> print(dt2.utcoffset())
4:30:00

>>> # Convert datetime to another time zone
>>> dt3 = dt2.astimezone(dt.timezone.utc)
>>> dt3
datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)
>>> dt2
datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())
>>> dt2 == dt3
True

اشیاء time

یک شیء time نشان‌دهنده‌ی یک زمان روز (محلی) است، مستقل از هر روز خاص، و از طریق یک شیء tzinfo قابل تنظیم است.

class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

تمام آرگومان‌ها اختیاری هستند. tzinfo می‌تواند None یا نمونه‌ای از یک زیرکلاس tzinfo باشد. آرگومان‌های باقی‌مانده باید اعداد صحیحی در بازه‌های زیر باشند:

  • 0 <= hour < 24,

  • 0 <= minute < 60,

  • 0 <= second < 60,

  • 0 <= microsecond < 1000000,

  • fold in [0, 1].

اگر آرگومانی خارج از آن بازه‌ها داده شود، ValueError پرتاب می‌شود. مقدار پیش‌فرض همه ۰ است، به جز tzinfo که مقدار پیش‌فرض آن None است.

ویژگی‌های کلاس:

time.min

زودترین time قابل‌نمایش، time(0, 0, 0, 0).

time.max

آخرین زمان قابل‌نمایش برای کلاس time، time(23, 59, 59, 999999).

time.resolution

کمترین تفاوت ممکن بین اشیای time نابرابر، timedelta(microseconds=1)، هرچند توجه داشته باشید که عملیات حسابی روی اشیای time پشتیبانی نمی‌شود.

ویژگی‌های نمونه (فقط‌خواندنی):

time.hour

در range(24).

time.minute

در range(60).

time.second

در range(60).

time.microsecond

در range(1000000).

time.tzinfo

شیء‌ای که به‌عنوان آرگومان tzinfo به سازنده‌ی time داده می‌شود، یا None اگر هیچ موردی داده نشده باشد.

time.fold

در [0, 1]. برای رفع ابهام از زمان‌های دیواری (wall time) در یک بازه‌ی تکرارشده استفاده می‌شود. (یک بازه‌ی تکرارشده زمانی رخ می‌دهد که ساعت‌ها در پایان ساعت تابستانی به عقب برگردانده شوند یا آفست UTC (UTC offset) برای منطقه‌ی زمانی فعلی به دلایل سیاسی کاهش یابد.) مقادیر ۰ و ۱، به‌ترتیب، نشان‌دهنده‌ی لحظه‌ی زودتر و دیرتر از میان دو لحظه‌ای هستند که نمایش زمان دیواری یکسانی دارند.

اضافه شده در نسخه‌ی 3.6.

اشیای time از مقایسه‌های برابری و ترتیبی پشتیبانی می‌کنند، به‌طوری‌که a کمتر از b در نظر گرفته می‌شود هنگامی که a از نظر زمانی پیش از b باشد.

شیءهای time ساده و آگاه هرگز برابر نیستند. مقایسه‌ی ترتیبی بین شیءهای time ساده و آگاه منجر به پرتاب TypeError می‌شود.

اگر هر دو طرف مقایسه آگاه باشند و ویژگی tzinfo یکسانی داشته باشند، از ویژگی‌های tzinfo و fold چشم‌پوشی می‌شود و زمان‌های پایه مقایسه می‌شوند. اگر هر دو طرف مقایسه آگاه باشند و ویژگی‌های tzinfo متفاوتی داشته باشند، ابتدا طرفین مقایسه با کم کردن آفست‌های UTC خود (که از self.utcoffset() به دست می‌آیند) تنظیم می‌شوند.

تغییر یافته در نسخه‌ی 3.3: مقایسه‌های برابری بین نمونه‌های آگاه و ساده از time، باعث پرتاب TypeError نمی‌شوند.

در زمینه‌های بولی، یک شیء time همیشه درست در نظر گرفته می‌شود.

تغییر یافته در نسخه‌ی 3.5: پیش از پایتون 3.5، یک شیء time اگر نشان‌دهنده‌ی نیمه‌شب به وقت UTC بود، نادرست در نظر گرفته می‌شد. این رفتار مبهم و خطاخیز تلقی می‌شد و در پایتون 3.5 حذف شده است. برای اطلاعات بیشتر bpo-13936 را ببینید.

سازنده‌های دیگر:

classmethod time.fromisoformat(time_string)

یک time متناظر با time_string در هر قالب معتبر ISO 8601 را برمی‌گرداند، با استثناهای زیر:

  1. آفست‌های منطقه زمانی ممکن است ثانیه‌های کسری داشته باشند.

  2. T آغازین، که معمولاً در مواردی که ممکن است بین تاریخ و زمان ابهام وجود داشته باشد لازم است، لازم نیست.

  3. ثانیه‌های کسری می‌توانند هر تعداد رقم داشته باشند (ارقام بیش از ۶ حذف خواهند شد).

  4. ساعت‌ها و دقیقه‌های کسری پشتیبانی نمی‌شوند.

مثال‌ها:

>>> import datetime as dt
>>> dt.time.fromisoformat('04:23:01')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('T04:23:01')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('T042301')
datetime.time(4, 23, 1)
>>> dt.time.fromisoformat('04:23:01.000384')
datetime.time(4, 23, 1, 384)
>>> dt.time.fromisoformat('04:23:01,000384')
datetime.time(4, 23, 1, 384)
>>> dt.time.fromisoformat('04:23:01+04:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))
>>> dt.time.fromisoformat('04:23:01Z')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)
>>> dt.time.fromisoformat('04:23:01+00:00')
datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)

اضافه شده در نسخه‌ی 3.7.

تغییر یافته در نسخه‌ی 3.11: پیش‌تر، این متد فقط از قالب‌هایی پشتیبانی می‌کرد که time.isoformat() می‌توانست آن‌ها را تولید کند.

classmethod time.strptime(date_string, format)

یک time متناظر با date_string، تجزیه‌شده بر اساس format، برمی‌گرداند.

اگر format شامل میکروثانیه یا اطلاعات منطقه زمانی نباشد، این معادل است با:

time(*(time.strptime(date_string, format)[3:6]))

ValueError زمانی پرتاب می‌شود که date_string و format توسط time.strptime() قابل تجزیه نباشند، یا اگر این تابع مقداری برگرداند که تاپل زمانی (time tuple) نباشد. همچنین رفتار strftime() و strptime() و time.fromisoformat() را ببینید.

اضافه شده در نسخه‌ی 3.14.

متدهای نمونه:

time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)

یک time جدید با همان مقدارها برمی‌گرداند، اما پارامترهای مشخص‌شده در آن به‌روزرسانی شده‌اند. توجه داشته باشید که می‌توان tzinfo=None را برای ایجاد یک time ساده از یک time آگاه، بدون تبدیل داده‌های زمان مشخص کرد.

تابع عام copy.replace() نیز از اشیای time پشتیبانی می‌کند.

تغییر یافته در نسخه‌ی 3.6: پارامتر fold اضافه شد.

time.isoformat(timespec='auto')

رشته‌ای را برمی‌گرداند که زمان را در قالب ISO 8601 نشان می‌دهد، یکی از:

  • HH:MM:SS.ffffff، اگر microsecond برابر ۰ نباشد

  • HH:MM:SS، اگر microsecond برابر ۰ باشد

  • HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]، اگر utcoffset() None را برنگرداند

  • HH:MM:SS+HH:MM[:SS[.ffffff]]، اگر microsecond برابر با ۰ باشد و utcoffset() مقدار None را برنگرداند

آرگومان اختیاری timespec تعداد کامپوننت‌های اضافی زمان برای شامل شدن را مشخص می‌کند (پیش‌فرض 'auto' است). این می‌تواند یکی از موارد زیر باشد:

  • 'auto': اگر microsecond برابر ۰ باشد، مانند 'seconds' و در غیر این صورت مانند 'microseconds' است.

  • 'hours': hour را در قالب دو رقمی HH بگنجانید.

  • 'minutes': شامل hour و minute در قالب HH:MM.

  • 'seconds': شامل hour، minute و second در قالب HH:MM:SS.

  • 'milliseconds': زمان کامل را شامل می‌شود، اما بخش کسری ثانیه را به میلی‌ثانیه قطع می‌کند. قالب HH:MM:SS.sss.

  • 'microseconds': زمان کامل را در قالب HH:MM:SS.ffffff بگنجانید.

توجه

کامپوننت‌های زمانی حذف‌شده بریده می‌شوند، نه اینکه گرد شوند.

ValueError در صورت نامعتبر بودن آرگومان timespec پرتاب می‌شود.

مثال:

>>> import datetime as dt
>>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')
'12:34'
>>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0)
>>> my_time.isoformat(timespec='microseconds')
'12:34:56.000000'
>>> my_time.isoformat(timespec='auto')
'12:34:56'

تغییر یافته در نسخه‌ی 3.6: پارامتر timespec افزوده شد.

time.__str__()

برای یک زمان t، str(t) معادل t.isoformat() است.

time.strftime(format)

رشته‌ای را برمی‌گرداند که بازنمایی‌کننده‌ی زمان است و با یک رشته‌ی قالب صریح کنترل می‌شود. همچنین رفتار strftime() و strptime() و time.isoformat() را ببینید.

time.__format__(format)

مشابه time.strftime(). این امکان را به شما می‌دهد که یک رشته قالب‌بندی را برای یک شیء time در رشته‌های قالب‌بندی‌شده و هنگام استفاده از str.format() مشخص کنید. همچنین ببینید رفتار strftime() و strptime() و time.isoformat().

time.utcoffset()

اگر tzinfo برابر None باشد، None را برمی‌گرداند، در غیر این صورت self.tzinfo.utcoffset(None) را برمی‌گرداند، و اگر مورد اخیر None یا یک شیء timedelta با اندازه‌ای کمتر از یک روز را برنگرداند، استثنایی پرتاب می‌کند.

تغییر یافته در نسخه‌ی 3.7: آفست UTC به تعداد حسابی‌ای از دقیقه‌ها محدود نمی‌شود.

time.dst()

اگر tzinfo برابر None باشد، None را برمی‌گرداند، در غیر این صورت self.tzinfo.dst(None) را برمی‌گرداند، و اگر دومی None یا یک شیء timedelta با اندازه‌ای کمتر از یک روز را برنگرداند، استثنایی را پرتاب می‌کند.

تغییر یافته در نسخه‌ی 3.7: آفست ساعت تابستانی (DST offset) به تعداد حسابی‌ای از دقیقه‌ها محدود نیست.

time.tzname()

اگر tzinfo برابر None باشد، None را برمی‌گرداند، در غیر این صورت self.tzinfo.tzname(None) را برمی‌گرداند، یا اگر دومی None یا یک شیء رشته را برنگرداند، استثنایی را پرتاب می‌کند.

نمونه‌های کاربرد: time

نمونه‌هایی از کار با یک شیء time:

>>> import datetime as dt
>>> class TZ1(dt.tzinfo):
...     def utcoffset(self, when):
...         return dt.timedelta(hours=1)
...     def dst(self, when):
...         return dt.timedelta(0)
...     def tzname(self, when):
...         return "+01:00"
...     def  __repr__(self):
...         return f"{self.__class__.__name__}()"
...
>>> t = dt.time(12, 10, 30, tzinfo=TZ1())
>>> t
datetime.time(12, 10, 30, tzinfo=TZ1())
>>> t.isoformat()
'12:10:30+01:00'
>>> t.dst()
datetime.timedelta(0)
>>> t.tzname()
'+01:00'
>>> t.strftime("%H:%M:%S %Z")
'12:10:30 +01:00'
>>> 'The {} is {:%H:%M}.'.format("time", t)
'The time is 12:10.'

اشیاء tzinfo

class datetime.tzinfo

این یک کلاس پایه انتزاعی است، به این معنا که این کلاس نباید مستقیماً نمونه‌سازی شود. برای ثبت اطلاعات درباره‌ی یک منطقه زمانی خاص، یک زیرکلاس از tzinfo تعریف کنید.

می‌توان یک نمونه از (یک زیرکلاس ملموس از) tzinfo را به سازنده‌های اشیاء datetime و time پاس داد. این اشیاء ویژگی‌های خود را به‌صورت زمان محلی در نظر می‌گیرند و شیء tzinfo از متدهایی پشتیبانی می‌کند که اختلاف زمان محلی از UTC، نام منطقه‌ی زمانی و اختلاف DST را، همگی نسبت به یک شیء date یا time که به آن‌ها پاس داده شده است، آشکار می‌کنند.

شما باید یک زیرکلاس عینی مشتق کنید و (حداقل) پیاده‌سازی متدهای استاندارد tzinfo مورد نیاز متدهای datetime مورد استفاده شما را فراهم کنید. ماژول datetime timezone را فراهم می‌کند؛ یک زیرکلاس عینی ساده از tzinfo که می‌تواند مناطق زمانی با اختلاف ثابت از UTC، مانند خود UTC یا EST و EDT آمریکای شمالی را نمایش دهد.

الزام ویژه برای پیکل‌کردن : یک زیرکلاس از tzinfo باید یک متد __init__() داشته باشد که بتوان آن را بدون آرگومان فراخوانی کرد، در غیر این صورت می‌توان آن را پیکل کرد، اما ممکن است دیگر نتوان آن را از حالت پیکل خارج کرد. این یک الزام فنی است که ممکن است در آینده تعدیل شود.

یک زیرکلاس عینی از tzinfo ممکن است نیاز داشته باشد متدهای زیر را پیاده‌سازی کند. اینکه دقیقاً کدام متدها مورد نیاز هستند، به نحوه‌ی استفاده از اشیای آگاه datetime بستگی دارد. در صورت تردید، کافی است همه‌ی آن‌ها را پیاده‌سازی کنید.

tzinfo.utcoffset(dt)

آفست زمان محلی از UTC را به‌صورت یک شیء timedelta برمی‌گرداند که برای شرق UTC مثبت است. اگر زمان محلی در غرب UTC باشد، این مقدار باید منفی باشد.

این نشان‌دهنده‌ی کل آفست از UTC است؛ برای مثال، اگر یک شیء tzinfo هم تنظیمات منطقه‌ی زمانی و هم تنظیمات ساعت تابستانی (DST) را نشان دهد، utcoffset() باید مجموع آن‌ها را برگرداند. اگر فاصله از UTC مشخص نیست، None را برگردانید. در غیر این صورت، مقدار برگردانده‌شده باید یک شیء timedelta باشد که اکیداً بین -timedelta(hours=24) و timedelta(hours=24) قرار دارد (اندازه‌ی فاصله باید کمتر از ۱ روز باشد). بیشتر پیاده‌سازی‌های utcoffset() احتمالاً شبیه یکی از این دو خواهند بود:

return CONSTANT                 # fixed-offset class
return CONSTANT + self.dst(dt)  # daylight-aware class

اگر utcoffset() None را برنگرداند، dst() نیز نباید None را برگرداند.

پیاده‌سازی پیش‌فرض utcoffset()، استثنای NotImplementedError را پرتاب می‌کند.

تغییر یافته در نسخه‌ی 3.7: آفست UTC به تعداد حسابی‌ای از دقیقه‌ها محدود نمی‌شود.

tzinfo.dst(dt)

مقدار تنظیم ساعت تابستانی (DST) را به‌صورت یک شیء timedelta یا None برمی‌گرداند، اگر اطلاعات DST شناخته‌نشده باشد.

اگر ساعت تابستانی فعال نباشد، timedelta(0) را برمی‌گرداند. اگر ساعت تابستانی فعال باشد، آفست را به‌صورت یک شیء timedelta برمی‌گرداند (برای جزئیات utcoffset() را ببینید). توجه داشته باشید که آفست ساعت تابستانی، در صورت اقتضا، از قبل به آفست UTC که utcoffset() برمی‌گرداند افزوده شده است، بنابراین نیازی به مراجعه به dst() نیست، مگر اینکه به کسب اطلاعات ساعت تابستانی به‌طور جداگانه علاقه‌مند باشید. برای مثال، datetime.timetuple() متد dst() مربوط به ویژگی tzinfo خود را فراخوانی می‌کند تا تعیین کند پرچم tm_isdst چگونه باید تنظیم شود، و tzinfo.fromutc() متد dst() را فراخوانی می‌کند تا تغییرات ساعت تابستانی را هنگام گذر از منطقه‌های زمانی در نظر بگیرد.

یک نمونه tz از یک زیرکلاس tzinfo که هم زمان استاندارد و هم زمان تابستانی را مدل‌سازی می‌کند، باید از این نظر سازگار باشد:

tz.utcoffset(dt) - tz.dst(dt)

باید برای هر datetime dt با dt.tzinfo == tz نتیجه‌ی یکسانی برگرداند. برای زیرکلاس‌های معقول tzinfo، این عبارت، «آفست» منطقه زمانی را به دست می‌دهد که نباید به تاریخ یا زمان وابسته باشد، بلکه فقط به موقعیت جغرافیایی وابسته باشد. پیاده‌سازی datetime.astimezone() به این موضوع متکی است، اما نمی‌تواند موارد نقض را تشخیص دهد؛ اطمینان از این موضوع بر عهده‌ی برنامه‌نویس است. اگر یک زیرکلاس tzinfo نتواند این موضوع را تضمین کند، ممکن است بتواند پیاده‌سازی پیش‌فرض tzinfo.fromutc() را بازنویسی کند تا در هر صورت با astimezone() به‌درستی کار کند.

بیشتر پیاده‌سازی‌های dst() احتمالاً به یکی از این دو شکل خواهند بود:

import datetime as dt

def dst(self, when):
    # a fixed-offset class:  doesn't account for DST
    return dt.timedelta(0)

یا:

import datetime as dt

def dst(self, when):
    # Code to set dston and dstoff to the time zone's DST
    # transition times based on the input when.year, and expressed
    # in standard local time.

    if dston <= when.replace(tzinfo=None) < dstoff:
        return dt.timedelta(hours=1)
    else:
        return dt.timedelta(0)

پیاده‌سازی پیش‌فرض dst() استثنای NotImplementedError را پرتاب می‌کند.

تغییر یافته در نسخه‌ی 3.7: آفست ساعت تابستانی (DST offset) به تعداد حسابی‌ای از دقیقه‌ها محدود نیست.

tzinfo.tzname(dt)

نام منطقه‌ی زمانی متناظر با شیء datetime یعنی dt را به‌صورت یک رشته برمی‌گرداند. ماژول datetime هیچ موردی را درباره‌ی نام‌های رشته‌ای تعریف نکرده است و الزامی ندارد که این نام معنای خاصی داشته باشد. برای مثال، "GMT"، "UTC"، "-500"، "-5:00"، "EDT"، "US/Eastern"، "America/New York" همگی پاسخ‌های معتبر هستند. اگر نام رشته‌ای شناخته‌شده نباشد، None را برمی‌گرداند. توجه داشته باشید که این یک متد است نه یک رشته ثابت، عمدتاً به این دلیل که برخی زیرکلاس‌های tzinfo ممکن است بخواهند بسته به مقدار مشخص dt داده‌شده، نام‌های متفاوتی برگردانند، به‌ویژه اگر کلاس tzinfo ساعت تابستانی را در نظر بگیرد.

پیاده‌سازی پیش‌فرض tzname()، استثنای NotImplementedError را پرتاب می‌کند.

این متدها توسط یک شیء datetime یا time، در پاسخ به متدهای هم‌نام آن‌ها فراخوانی می‌شوند. یک شیء datetime خود را به‌عنوان آرگومان ارسال می‌کند، و یک شیء time مقدار None را به‌عنوان آرگومان ارسال می‌کند. بنابراین متدهای یک کلاس فرعی از tzinfo باید برای پذیرفتن یک آرگومان dt با مقدار None یا از کلاس datetime آماده باشند.

وقتی None ارسال می‌شود، تصمیم درباره‌ی بهترین پاسخ بر عهده‌ی طراح کلاس است. برای مثال، اگر کلاس بخواهد بگوید که اشیای زمانی در پروتکل‌های tzinfo شرکت نمی‌کنند، بازگرداندن None مناسب است. ممکن است مفیدتر باشد که utcoffset(None) آفست استاندارد UTC را برگرداند، زیرا قرارداد دیگری برای پیدا کردن آفست استاندارد وجود ندارد.

هنگامی که یک شیء datetime در پاسخ به یک متد datetime ارسال می‌شود، dt.tzinfo همان شیء self است. متدهای tzinfo می‌توانند به این موضوع اتکا کنند، مگر آنکه کد کاربر متدهای tzinfo را مستقیماً فراخوانی کند. هدف این است که متدهای tzinfo، dt را به‌عنوان زمان محلی تفسیر کنند و نیازی به نگرانی درباره اشیاء در مناطق زمانی دیگر نداشته باشند.

یک متد دیگر از tzinfo وجود دارد که ممکن است یک کلاس فرعی بخواهد آن را بازنویسی کند:

tzinfo.fromutc(dt)

این متد از پیاده‌سازی پیش‌فرض datetime.astimezone() فراخوانی می‌شود. هنگامی که از آن فراخوانی شود، dt.tzinfo همان self است و داده‌های تاریخ و زمان dt باید به‌عنوان بیانگر یک زمان UTC در نظر گرفته شوند. هدف از fromutc() تنظیم داده‌های تاریخ و زمان و برگرداندن یک datetime معادل در زمان محلی self است.

بیشتر زیرکلاس‌های tzinfo باید بتوانند پیاده‌سازی پیش‌فرض fromutc() را بدون مشکل به ارث ببرند. این پیاده‌سازی به‌اندازه‌ای قوی است که مناطق زمانی با آفست ثابت و مناطق زمانی را که هم زمان استاندارد و هم ساعت تابستانی را در نظر می‌گیرند مدیریت کند، و مورد دوم را حتی اگر زمان‌های گذار ساعت تابستانی در سال‌های مختلف متفاوت باشد نیز مدیریت کند. مثالی از یک منطقه زمانی که پیاده‌سازی پیش‌فرض fromutc() ممکن است در تمام حالت‌ها آن را به‌درستی مدیریت نکند، منطقه‌ای است که آفست استاندارد آن (از UTC) به تاریخ و زمان مشخصی که داده می‌شود بستگی دارد؛ اتفاقی که ممکن است به دلایل سیاسی رخ دهد. پیاده‌سازی‌های پیش‌فرض astimezone() و fromutc() ممکن است نتیجه‌ای را که می‌خواهید تولید نکنند، اگر نتیجه یکی از ساعت‌هایی باشد که لحظه‌ی تغییر آفست استاندارد را در بر می‌گیرد.

با صرف‌نظر از کد مربوط به موارد خطا، پیاده‌سازی پیش‌فرض fromutc() مانند زیر عمل می‌کند:

import datetime as dt

def fromutc(self, when):
    # raise ValueError error if when.tzinfo is not self
    dtoff = when.utcoffset()
    dtdst = when.dst()
    # raise ValueError if dtoff is None or dtdst is None
    delta = dtoff - dtdst  # this is self's standard offset
    if delta:
        when += delta   # convert to standard local time
        dtdst = when.dst()
        # raise ValueError if dtdst is None
    if dtdst:
        return when + dtdst
    else:
        return when

در پرونده tzinfo_examples.py زیر، چند نمونه از کلاس‌های tzinfo وجود دارد:

import datetime as dt

# A class capturing the platform's idea of local time.
# (May result in wrong values on historical times in
#  timezones where UTC offset and/or the DST rules had
#  changed in the past.)
import time

ZERO = dt.timedelta(0)
HOUR = dt.timedelta(hours=1)
SECOND = dt.timedelta(seconds=1)

STDOFFSET = dt.timedelta(seconds=-time.timezone)
if time.daylight:
    DSTOFFSET = dt.timedelta(seconds=-time.altzone)
else:
    DSTOFFSET = STDOFFSET

DSTDIFF = DSTOFFSET - STDOFFSET


class LocalTimezone(dt.tzinfo):

    def fromutc(self, when):
        assert when.tzinfo is self
        stamp = (when - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND
        args = time.localtime(stamp)[:6]
        dst_diff = DSTDIFF // SECOND
        # Detect fold
        fold = (args == time.localtime(stamp - dst_diff))
        return dt.datetime(*args, microsecond=when.microsecond,
                           tzinfo=self, fold=fold)

    def utcoffset(self, when):
        if self._isdst(when):
            return DSTOFFSET
        else:
            return STDOFFSET

    def dst(self, when):
        if self._isdst(when):
            return DSTDIFF
        else:
            return ZERO

    def tzname(self, when):
        return time.tzname[self._isdst(when)]

    def _isdst(self, when):
        tt = (when.year, when.month, when.day,
              when.hour, when.minute, when.second,
              when.weekday(), 0, 0)
        stamp = time.mktime(tt)
        tt = time.localtime(stamp)
        return tt.tm_isdst > 0


Local = LocalTimezone()


# A complete implementation of current DST rules for major US time zones.

def first_sunday_on_or_after(when):
    days_to_go = 6 - when.weekday()
    if days_to_go:
        when += dt.timedelta(days_to_go)
    return when


# US DST Rules
#
# This is a simplified (i.e., wrong for a few cases) set of rules for US
# DST start and end times. For a complete and up-to-date set of DST rules
# and timezone definitions, visit the Olson Database (or try pytz):
# http://www.twinsun.com/tz/tz-link.htm
# https://sourceforge.net/projects/pytz/ (might not be up-to-date)
#
# In the US, since 2007, DST starts at 2am (standard time) on the second
# Sunday in March, which is the first Sunday on or after Mar 8.
DSTSTART_2007 = dt.datetime(1, 3, 8, 2)
# and ends at 2am (DST time) on the first Sunday of Nov.
DSTEND_2007 = dt.datetime(1, 11, 1, 2)
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
# Sunday in April and to end at 2am (DST time) on the last
# Sunday of October, which is the first Sunday on or after Oct 25.
DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)
DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
# on the last Sunday of October, which is the first Sunday
# on or after Oct 25.
DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)
DSTEND_1967_1986 = DSTEND_1987_2006


def us_dst_range(year):
    # Find start and end times for US DST. For years before 1967, return
    # start = end for no DST.
    if 2006 < year:
        dststart, dstend = DSTSTART_2007, DSTEND_2007
    elif 1986 < year < 2007:
        dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
    elif 1966 < year < 1987:
        dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
    else:
        return (dt.datetime(year, 1, 1), ) * 2

    start = first_sunday_on_or_after(dststart.replace(year=year))
    end = first_sunday_on_or_after(dstend.replace(year=year))
    return start, end


class USTimeZone(dt.tzinfo):

    def __init__(self, hours, reprname, stdname, dstname):
        self.stdoffset = dt.timedelta(hours=hours)
        self.reprname = reprname
        self.stdname = stdname
        self.dstname = dstname

    def __repr__(self):
        return self.reprname

    def tzname(self, when):
        if self.dst(when):
            return self.dstname
        else:
            return self.stdname

    def utcoffset(self, when):
        return self.stdoffset + self.dst(when)

    def dst(self, when):
        if when is None or when.tzinfo is None:
            # An exception may be sensible here, in one or both cases.
            # It depends on how you want to treat them.  The default
            # fromutc() implementation (called by the default astimezone()
            # implementation) passes a datetime with when.tzinfo is self.
            return ZERO
        assert when.tzinfo is self
        start, end = us_dst_range(when.year)
        # Can't compare naive to aware objects, so strip the timezone from
        # when first.
        when = when.replace(tzinfo=None)
        if start + HOUR <= when < end - HOUR:
            # DST is in effect.
            return HOUR
        if end - HOUR <= when < end:
            # Fold (an ambiguous hour): use when.fold to disambiguate.
            return ZERO if when.fold else HOUR
        if start <= when < start + HOUR:
            # Gap (a non-existent hour): reverse the fold rule.
            return HOUR if when.fold else ZERO
        # DST is off.
        return ZERO

    def fromutc(self, when):
        assert when.tzinfo is self
        start, end = us_dst_range(when.year)
        start = start.replace(tzinfo=self)
        end = end.replace(tzinfo=self)
        std_time = when + self.stdoffset
        dst_time = std_time + HOUR
        if end <= dst_time < end + HOUR:
            # Repeated hour
            return std_time.replace(fold=1)
        if std_time < start or dst_time >= end:
            # Standard time
            return std_time
        if start <= std_time < end - HOUR:
            # Daylight saving time
            return dst_time


Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")
Central  = USTimeZone(-6, "Central",  "CST", "CDT")
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")

توجه داشته باشید که در یک زیرکلاس tzinfo که هم زمان استاندارد و هم زمان تابستانی را در نظر می‌گیرد، دو بار در سال، در نقاط تغییر ساعت تابستانی (DST)، ظرافت‌های اجتناب‌ناپذیری وجود دارد. برای وضوح بیشتر، شرق ایالات متحده (UTC -0500) را در نظر بگیرید، که در آن EDT یک دقیقه پس از ۱:۵۹ (EST) در دومین یکشنبه مارس آغاز می‌شود و یک دقیقه پس از ۱:۵۹ (EDT) در نخستین یکشنبه نوامبر پایان می‌یابد:

  UTC   3:MM  4:MM  5:MM  6:MM  7:MM  8:MM
  EST  22:MM 23:MM  0:MM  1:MM  2:MM  3:MM
  EDT  23:MM  0:MM  1:MM  2:MM  3:MM  4:MM

 شروع  22:MM 23:MM  0:MM  1:MM  3:MM  4:MM

پایان  23:MM  0:MM  1:MM  1:MM  2:MM  3:MM

هنگامی که ساعت تابستانی آغاز می‌شود (خط «start»)، ساعت دیواری محلی از ۱:۵۹ به ۳:۰۰ جهش می‌کند. زمان دیواری به شکل 2:MM در آن روز واقعاً معنایی ندارد، بنابراین astimezone(Eastern) در روزی که ساعت تابستانی آغاز می‌شود، نتیجه‌ای که hour == 2 باشد برنمی‌گرداند. برای مثال، در انتقال به جلو بهار سال ۲۰۱۶، چنین نتیجه‌ای می‌گیریم:

>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname())
...
05:00:00 UTC = 00:00:00 EST
06:00:00 UTC = 01:00:00 EST
07:00:00 UTC = 03:00:00 EDT
08:00:00 UTC = 04:00:00 EDT

هنگامی که ساعت تابستانی (DST) به پایان می‌رسد (ردیف «end»)، یک مشکل بالقوه جدی‌تر وجود دارد: ساعتی وجود دارد که نمی‌توان آن را در زمان دیواری محلی به‌طور غیرمبهم نوشت: آخرین ساعت از زمان تابستانی. در Eastern، این زمان‌ها در روزی که زمان تابستانی به پایان می‌رسد، به شکل 5:MM UTC هستند. ساعت دیواری محلی از 1:59 (زمان تابستانی) دوباره به 1:00 (زمان استاندارد) به عقب برمی‌گردد. زمان‌های محلی به شکل 1:MM مبهم هستند. در این حالت، astimezone() رفتار ساعت محلی را با نگاشت دو ساعت UTC متوالی به همان ساعت محلی تقلید می‌کند. در مثال Eastern، زمان‌های UTC به شکل 5:MM و 6:MM هر دو هنگام تبدیل به Eastern به 1:MM نگاشت می‌شوند، اما در زمان‌های پیشین، ویژگی fold روی 0 تنظیم شده است و در زمان‌های بعدی روی 1 تنظیم شده است. برای مثال، در گذار عقب‌گرد (Fall back) سال ۲۰۱۶، به نتیجه زیر می‌رسیم:

>>> import datetime as dt
>>> from tzinfo_examples import HOUR, Eastern
>>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

توجه داشته باشید که نمونه‌های datetime که فقط از نظر مقدار ویژگی fold با هم تفاوت دارند، در مقایسه‌ها برابر در نظر گرفته می‌شوند.

برنامه‌های کاربردی که نمی‌توانند ابهام‌های زمان دیواری (wall-time) را تحمل کنند، باید به‌صراحت مقدار ویژگی fold را بررسی کنند یا از استفاده از زیرکلاس‌های ترکیبی tzinfo اجتناب کنند؛ هنگام استفاده از timezone، یا هر زیرکلاس دیگری از tzinfo با آفست ثابت، هیچ ابهامی وجود ندارد (مانند کلاسی که فقط EST (آفست ثابت منفی ۵ ساعت) یا فقط EDT (آفست ثابت منفی ۴ ساعت) را نشان می‌دهد).

همچنین ملاحظه نمائید

zoneinfo

ماژول datetime دارای یک کلاس timezone ساده (برای مدیریت آفست‌های ثابت دلخواه نسبت به UTC) و ویژگی timezone.utc آن (یک نمونه از timezone برای UTC) است.

zoneinfo پایگاه داده مناطق زمانی IANA (که با نام پایگاه داده Olson نیز شناخته می‌شود) را در پایتون در دسترس قرار می‌دهد و استفاده از آن توصیه می‌شود.

پایگاه داده‌ی منطقه‌های زمانی IANA

پایگاه داده‌ی مناطق زمانی (که اغلب tz، tzdata یا zoneinfo نامیده می‌شود) حاوی کد و داده‌هایی است که تاریخچه‌ی زمان محلی را برای بسیاری از مکان‌های معرف در سراسر جهان نشان می‌دهند. این پایگاه داده به‌طور دوره‌ای به‌روزرسانی می‌شود تا تغییراتی را که نهادهای سیاسی در مرزهای مناطق زمانی، آفست‌های UTC و قوانین ساعت تابستانی اعمال می‌کنند، منعکس کند.

اشیاء timezone

کلاس timezone زیرکلاسی از tzinfo است که هر نمونه از آن نشان‌دهنده‌ی یک منطقه‌ی زمانی تعریف‌شده با یک آفست ثابت از UTC است.

نمی‌توان از اشیای این کلاس برای نمایش اطلاعات منطقه زمانی در مکان‌هایی استفاده کرد که در روزهای مختلفی از سال از آفست‌های متفاوت استفاده می‌شود یا تغییرات تاریخی در زمان مدنی اعمال شده‌اند.

class datetime.timezone(offset, name=None)

آرگومان offset باید به‌صورت یک شیء timedelta مشخص شود که اختلاف بین زمان محلی و UTC را نشان می‌دهد. این مقدار باید به‌طور اکید بین -timedelta(hours=24) و timedelta(hours=24) باشد، در غیر این صورت ValueError پرتاب می‌شود.

آرگومان name اختیاری است. در صورت مشخص شدن، باید رشته‌ای باشد که به‌عنوان مقدار بازگشتی متد datetime.tzname() استفاده می‌شود.

اضافه شده در نسخه‌ی 3.2.

تغییر یافته در نسخه‌ی 3.7: آفست UTC به تعداد حسابی‌ای از دقیقه‌ها محدود نمی‌شود.

timezone.utcoffset(dt)

مقدار ثابتی را که هنگام ساخت نمونه‌ی timezone تعیین شده است، برمی‌گرداند.

آرگومان dt نادیده گرفته می‌شود. مقدار بازگشتی یک نمونه‌ی timedelta است که برابر با اختلاف بین زمان محلی و UTC است.

تغییر یافته در نسخه‌ی 3.7: آفست UTC به تعداد حسابی‌ای از دقیقه‌ها محدود نمی‌شود.

timezone.tzname(dt)

مقدار ثابتی را که هنگام ساخت نمونه‌ی timezone تعیین شده است، برمی‌گرداند.

اگر name در سازنده ارائه نشده باشد، نامی که tzname(dt) برمی‌گرداند از مقدار offset به‌صورت زیر تولید می‌شود. اگر offset برابر timedelta(0) باشد، نام "UTC" است، در غیر این صورت، رشته‌ای در قالب UTC±HH:MM خواهد بود که در آن ± علامت offset است و HH و MM به‌ترتیب دو رقمِ offset.hours و offset.minutes هستند.

تغییر یافته در نسخه‌ی 3.6: نام تولیدشده از offset=timedelta(0) اکنون 'UTC' ساده است، نه 'UTC+00:00'.

timezone.dst(dt)

همیشه None را برمی‌گرداند.

timezone.fromutc(dt)

dt + offset را برمی‌گرداند. آرگومان dt باید یک نمونه‌ی آگاه از datetime باشد که tzinfo آن روی self تنظیم شده باشد.

ویژگی‌های کلاس:

timezone.utc

منطقه زمانی UTC، timezone(timedelta(0)).

رفتار strftime() و strptime()

اشیاء date، datetime و time همگی از متد strftime(format) پشتیبانی می‌کنند تا رشته‌ای ایجاد کنند که زمان را تحت کنترل یک رشته قالب صریح نشان می‌دهد.

در مقابل، متدهای کلاس date.strptime()، datetime.strptime() و time.strptime() یک شیء را از یک رشته که زمان را نشان می‌دهد و یک رشته قالب متناظر ایجاد می‌کنند.

جدول زیر مقایسه‌ای سطح بالا بین strftime() و strptime() ارائه می‌دهد:

strftime

strptime

استفاده

تبدیل شیء به یک رشته مطابق با یک قالب داده‌شده

تجزیه یک رشته به یک شیء بر اساس قالب متناظر

نوع متد

متد نمونه

متد کلاس

امضا

strftime(format)

strptime(date_string, format)

کدهای قالب‌بندی strftime() و strptime()

این متدها کدهای قالبی را می‌پذیرند که می‌توان از آن‌ها برای تجزیه و قالب‌بندی تاریخ‌ها استفاده کرد:

>>> import datetime as dt
>>> dt.datetime.strptime('31/01/22 23:59:59.999999',
...                      '%d/%m/%y %H:%M:%S.%f')
datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)
>>> _.strftime('%a %d %b %Y, %I:%M%p')
'Mon 31 Jan 2022, 11:59PM'

فهرست زیر شامل تمام کدهای قالب‌بندی است که استاندارد C سال ۱۹۸۹ آن‌ها را الزامی می‌کند، و این کدها روی تمام سکوهای دارای پیاده‌سازی استاندارد C کار می‌کنند.

دایرکتیو

معنی

مثال

یادداشت‌ها

%a

روز هفته به‌صورت نام اختصاری محلی (locale).

Sun, Mon, ..., Sat (en_US);
So, Mo, ..., Sa (de_DE)

(1)

%A

نام کامل روز هفته بر اساس locale.

Sunday, Monday, ..., Saturday (en_US);
Sonntag, Montag, ..., Samstag (de_DE)

(1)

%w

روز هفته به‌صورت عدد دهدهی، که در آن ۰ یکشنبه و ۶ شنبه است.

0, 1, ..., 6

%d

روز ماه به‌صورت عدد دهدهی با صفرهای پیشرو.

01, 02, ..., 31

(9)

%b

ماه به‌صورت نام اختصاری locale.

Jan، Feb، ...، Dec (en_US)؛
Jan, Feb, ..., Dez (de_DE)

(1)

%B

ماه به‌صورت نام کامل locale.

January, February, ..., December (en_US);
Januar, Februar, ..., Dezember (de_DE)

(1)

%m

ماه به‌صورت عدد دهدهی با صفر پر شده.

01, 02, ..., 12

(9)

%y

سال بدون قرن به‌صورت عدد دهدهی با صفرِ پیش‌رو.

00, 01, ..., 99

(9)

%Y

سال همراه با قرن به‌صورت عدد دهدهی.

0001, 0002, ..., 2013, 2014, ..., 9998, 9999

(2)

%H

ساعت (ساعت ۲۴ ساعته) به‌صورت عدد دهدهی با صفر پرشده.

00, 01, ..., 23

(9)

%I

ساعت (ساعت ۱۲ ساعته) به‌صورت عدد دهدهی با صفر پرشده.

01, 02, ..., 12

(9)

%p

معادل locale برای AM یا PM.

AM, PM (en_US);
am, pm (de_DE)

(1), (3)

%M

دقیقه به‌صورت یک عدد ده‌دهی پر شده با صفر.

00, 01, ..., 59

(9)

%S

ثانیه به‌صورت عدد ده‌دهی با صفر پرشده.

00, 01, ..., 59

(4), (9)

%f

میکروثانیه به‌صورت عدد دهدهی، با صفر پر شده تا ۶ رقم.

000000, 000001, ..., 999999

(5)

%z

اختلاف از UTC در قالب ±HHMM[SS[.ffffff]] (اگر شیء ساده باشد، رشته خالی).

(empty), +0000, -0400, +1030, +063415, -030712.345216

(6)

%Z

نام منطقه زمانی (رشته خالی اگر شیء ساده باشد).

(empty), UTC, GMT

(6)

%j

روز سال به‌صورت عدد دهدهی با صفر پرشده.

001, 002, ..., 366

(9)

%U

شماره‌ی هفته‌ی سال (یکشنبه به‌عنوان اولین روز هفته) به‌صورت عدد ده‌دهی با صفر پرشده. همه‌ی روزهای سال جدید پیش از اولین یکشنبه، در هفته‌ی ۰ در نظر گرفته می‌شوند.

00, 01, ..., 53

(7), (9)

%W

شماره‌ی هفته‌ی سال (دوشنبه به‌عنوان نخستین روز هفته) به‌صورت عدد دهدهی با صفر پرشده. همه‌ی روزهای سال جدید پیش از نخستین دوشنبه، در هفته‌ی ۰ در نظر گرفته می‌شوند.

00, 01, ..., 53

(7), (9)

%c

نمایش مناسب تاریخ و زمان بر اساس تنظیمات locale .

Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)

(1)

%x

نمایش مناسب تاریخ بر اساس تنظیمات locale.

08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)

(1)

%X

نمایش زمان مناسب برای Locale.

21:30:00 (en_US);
21:30:00 (de_DE)

(1)

%%

یک نویسه‌ی '%' به‌صورت لفظی.

%

چند دایرکتیو اضافی که استاندارد C89 آن‌ها را الزامی نمی‌داند، برای سهولت گنجانده شده‌اند. این پارامترها همگی با مقادیر تاریخ ISO 8601 مطابقت دارند.

دایرکتیو

معنی

مثال

یادداشت‌ها

%G

سال ISO 8601 همراه با قرن، نشان‌دهنده‌ی سالی که بخش بزرگ‌تر هفته‌ی ISO (%V) در آن قرار دارد.

0001, 0002, ..., 2013, 2014, ..., 9998, 9999

(8)

%u

روز هفته در ISO 8601 به‌صورت عدد دهدهی که در آن ۱ دوشنبه است.

1, 2, ..., 7

%V

هفته‌ی ISO 8601 به‌صورت عدد ده‌دهی با دوشنبه به‌عنوان نخستین روز هفته. هفته‌ی 01 هفته‌ای است که شامل ۴ ژانویه می‌شود.

01, 02, ..., 53

(8), (9)

%:z

فاصله زمانی از UTC در قالب ±HH:MM[:SS[.ffffff]] (اگر شیء ساده باشد، رشته خالی).

(خالی)، +00:00، -04:00، +10:30، +06:34:15، -03:07:12.345216

(6)

ممکن است این‌ها هنگام استفاده با متد strftime() در همه سکوها در دسترس نباشند. دایرکتیوهای سال ISO 8601 و هفته ISO 8601 با دایرکتیوهای سال و شماره هفته در بالا قابل تعویض نیستند. فراخوانی strptime() با دایرکتیوهای ناقص یا مبهم ISO 8601 باعث پرتاب ValueError می‌شود.

مجموعه کامل کدهای قالب‌بندی پشتیبانی‌شده در پلتفرم‌های مختلف متفاوت است، زیرا پایتون تابع strftime() از کتابخانه C پلتفرم را فراخوانی می‌کند و تفاوت‌های بین پلتفرم‌ها رایج است. برای مشاهده مجموعه کامل کدهای قالب‌بندی پشتیبانی‌شده در پلتفرم شما، به مستندات strftime(3) مراجعه کنید. همچنین در مدیریت مشخص‌کننده‌های قالب‌بندی پشتیبانی‌نشده، بین پلتفرم‌ها تفاوت‌هایی وجود دارد.

اضافه شده در نسخه‌ی 3.6: %G، %u و %V افزوده شدند.

اضافه شده در نسخه‌ی 3.12: %:z افزوده شد.

جزئیات فنی

به‌طور کلی، d.strftime(fmt) مانند time.strftime(fmt, d.timetuple()) در ماژول time عمل می‌کند، اگرچه همه‌ی شی‌ها از متد timetuple() پشتیبانی نمی‌کنند.

برای متدهای کلاس datetime.strptime() و date.strptime()، مقدار پیش‌فرض 1900-01-01T00:00:00.000 است: هر کامپوننتی که در رشته‌ی قالب مشخص نشده باشد، از مقدار پیش‌فرض گرفته می‌شود.

توجه

رشته‌های قالب بدون جداکننده ممکن است در تجزیه مبهم باشند. برای مثال، با %Y%m%d، ممکن است رشته‌ی 2026111 به‌صورت 2026-11-01 یا به‌صورت 2026-01-11 تجزیه شود. برای اطمینان از اینکه ورودی مطابق منظور تجزیه می‌شود، از جداکننده‌ها استفاده کنید.

توجه

هنگامی که برای تجزیه‌ی تاریخ‌های ناقص فاقد سال استفاده شوند، datetime.strptime() و date.strptime() در صورت مواجهه با ۲۹ فوریه استثنا پرتاب می‌کنند، زیرا سال پیش‌فرض ۱۹۰۰ یک سال کبیسه نیست. همیشه پیش از تجزیه، یک سال کبیسه‌ی پیش‌فرض به رشته‌های تاریخ ناقص اضافه کنید.

>>> import datetime as dt
>>> value = "2/29"
>>> dt.datetime.strptime(value, "%m/%d")
Traceback (most recent call last):
...
ValueError: day 29 must be in range 1..28 for month 2 in year 1900
>>> dt.datetime.strptime(f"1904 {value}", "%Y %m/%d")
datetime.datetime(1904, 2, 29, 0, 0)

استفاده از datetime.strptime(date_string, format) معادل است با:

datetime(*(time.strptime(date_string, format)[0:6]))

مگر زمانی که قالب شامل کامپوننت‌های زیرثانیه‌ای یا اطلاعات اختلاف منطقه زمانی باشد، که در datetime.strptime پشتیبانی می‌شوند اما در time.strptime حذف می‌شوند.

برای اشیای time، نباید از کدهای قالب مربوط به سال، ماه و روز استفاده شود، زیرا اشیای time چنین مقادیری ندارند. اگر با این حال از آن‌ها استفاده شود، ۱۹۰۰ به‌جای سال و ۱ به‌جای ماه و روز جایگزین می‌شود.

برای اشیای date، نباید از کدهای قالب مربوط به ساعت، دقیقه، ثانیه و میکروثانیه استفاده کرد، زیرا اشیای date چنین مقادیری ندارند. اگر با این حال از آن‌ها استفاده شود، ۰ جایگزین آن‌ها می‌شود.

به همین دلیل، پردازش رشته‌های قالب‌بندی حاوی نقاط کد یونیکد که در مجموعه نویسه‌های locale قابل بازنمایی نیستند نیز وابسته به سکو است. در برخی سکوها چنین نقاط کدی به‌صورت دست‌نخورده در خروجی حفظ می‌شوند، در حالی که در سکوهایی دیگر strftime ممکن است UnicodeError را پرتاب کند یا در عوض یک رشته‌ی خالی برگرداند.

یادداشت‌ها:

  1. از آنجا که قالب به locale بستگی دارد، هنگامی که درباره‌ی مقدار خروجی فرض‌هایی می‌کنید، باید احتیاط کنید. ترتیب فیلدها متفاوت خواهد بود (برای مثال، «ماه/روز/سال» در برابر «روز/ماه/سال»)، و خروجی ممکن است شامل نویسه‌های غیر ASCII باشد.

  2. متد strptime() می‌تواند سال‌ها را در بازه‌ی کامل [۱، ۹۹۹۹] تجزیه کند، اما سال‌های کوچک‌تر از ۱۰۰۰ باید با صفر تا عرض ۴ رقمی پر شوند.

    تغییر یافته در نسخه‌ی 3.2: در نسخه‌های پیشین، متد strftime() به سال‌های >= ۱۹۰۰ محدود شده بود.

    تغییر یافته در نسخه‌ی 3.3: در نسخه 3.2، متد strftime() به سال‌های >= 1000 محدود شد.

  3. هنگامی که همراه با متد strptime() استفاده شود، دایرکتیو %p تنها در صورتی بر فیلد ساعت خروجی تأثیر می‌گذارد که از دایرکتیو %I برای تجزیه ساعت استفاده شود.

  4. برخلاف ماژول time، ماژول datetime از ثانیه‌های کبیسه پشتیبانی نمی‌کند.

  5. هنگامی که با متد strptime() استفاده شود، دایرکتیو %f از ۱ تا ۶ رقم را می‌پذیرد و سمت راست آن را با صفر پر می‌کند. %f افزونه‌ای بر مجموعه‌ی نویسه‌های قالب‌بندی در استاندارد C است (اما به‌طور جداگانه در اشیای datetime پیاده‌سازی شده است و بنابراین همیشه در دسترس است).

  6. برای یک شیء ساده، کدهای قالب %z، %:z و %Z با رشته‌های خالی جایگزین می‌شوند.

    برای یک شیء آگاه :

    %z

    utcoffset() به رشته‌ای به شکل ±HHMM[SS[.ffffff]] تبدیل می‌شود، که در آن HH رشته‌ای ۲ رقمی است که تعداد ساعت‌های اختلاف از UTC را نشان می‌دهد، MM رشته‌ای ۲ رقمی است که تعداد دقیقه‌های اختلاف از UTC را نشان می‌دهد، SS رشته‌ای ۲ رقمی است که تعداد ثانیه‌های اختلاف از UTC را نشان می‌دهد و ffffff رشته‌ای ۶ رقمی است که تعداد میکروثانیه‌های اختلاف از UTC را نشان می‌دهد. بخش ffffff زمانی حذف می‌شود که اختلاف، عدد حسابی‌ای بر حسب ثانیه باشد و هنگامی که اختلاف، عدد حسابی‌ای بر حسب دقیقه باشد، هر دو بخش ffffff و SS حذف می‌شوند. برای مثال، اگر utcoffset() مقدار timedelta(hours=-3, minutes=-30) را برگرداند، %z با رشته‌ی '-0330' جایگزین می‌شود.

    تغییر یافته در نسخه‌ی 3.7: آفست UTC به تعداد حسابی‌ای از دقیقه‌ها محدود نمی‌شود.

    تغییر یافته در نسخه‌ی 3.7: هنگامی که دایرکتیو %z به متد strptime() ارائه شود، انحراف‌های UTC می‌توانند دارای علامت دونقطه به‌عنوان جداکننده بین ساعت‌ها، دقیقه‌ها و ثانیه‌ها باشند. برای مثال، '+01:00:00' به‌عنوان انحرافی به اندازه یک ساعت تجزیه می‌شود. علاوه بر این، ارائه 'Z' معادل '+00:00' است.

    %:z

    دقیقاً مانند %z رفتار می‌کند، اما یک دونقطه به‌عنوان جداکننده بین ساعت‌ها، دقیقه‌ها و ثانیه‌ها اضافه شده است.

    %Z

    در strftime()، اگر tzname() مقدار None را برگرداند، %Z با یک رشته‌ی خالی جایگزین می‌شود؛ در غیر این صورت %Z با مقدار برگردانده‌شده جایگزین می‌شود، که باید یک رشته باشد.

    strptime() تنها مقادیر مشخصی را برای %Z می‌پذیرد:

    1. هر مقداری در time.tzname برای تنظیمات locale رایانه‌ی شما

    2. مقادیر سخت‌کد UTC و GMT

    بنابراین شخصی که در ژاپن زندگی می‌کند ممکن است JST، UTC و GMT را به‌عنوان مقادیر معتبر داشته باشد، اما احتمالاً EST را نه. برای مقادیر نامعتبر، ValueError پرتاب خواهد شد.

    تغییر یافته در نسخه‌ی 3.2: هنگامی که دایرکتیو %z به متد strptime() ارائه شود، یک شیء datetime آگاه از منطقه‌ی زمانی تولید می‌شود. tzinfo نتیجه به یک نمونه از timezone تنظیم می‌شود.

  7. هنگامی که با متد strptime() استفاده شوند، %U و %W فقط زمانی در محاسبات به کار می‌روند که روز هفته و سال گاه‌شماریی (%Y) مشخص شده باشند.

  8. مانند %U و %W، از %V فقط در محاسبات استفاده می‌شود، وقتی که روز هفته و سال ISO (%G) در یک رشته‌ی قالب strptime() تعیین شده باشند. همچنین توجه داشته باشید که %G و %Y قابل تعویض با یکدیگر نیستند.

  9. هنگام استفاده با متد strptime()، صفر پیشتاز برای قالب‌های %d، %m، %H، %I، %M، %S، %j، %U، %W و %V اختیاری است. برای قالب %y، صفر پیشتاز الزامی است.

  10. هنگام تجزیه‌ی ماه و روز با استفاده از strptime()، همیشه یک سال را در قالب بگنجانید. اگر مقداری که باید تجزیه کنید سال ندارد، یک سال کبیسه‌ی ساختگی را به‌صورت صریح به آن اضافه کنید. در غیر این صورت، کد شما هنگام مواجهه با روز کبیسه استثنایی پرتاب می‌کند، زیرا سال پیش‌فرض استفاده‌شده توسط پارسر (۱۹۰۰) سال کبیسه نیست. کاربران هر سال کبیسه با این اشکال مواجه می‌شوند.

    >>> month_day = "02/29"
    >>> dt.datetime.strptime(f"{month_day};1984", "%m/%d;%Y")  # No leap year bug.
    datetime.datetime(1984, 2, 29, 0, 0)
    

    منسوخ شده از نسخه‌ی 3.13, در نسخه‌ی 3.15 حذف خواهد شد: فراخوانی‌های strptime() که از یک رشته قالب شامل روز ماه بدون سال استفاده می‌کنند، اکنون یک DeprecationWarning را نشان می‌دهند. در 3.15 یا بعد از آن ممکن است این را به یک خطا تغییر دهیم یا سال پیش‌فرض را به یک سال کبیسه تغییر دهیم. gh-70647 را ببینید.

پانویس‌ها