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.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.
اشیای این نوعها تغییرناپذیر هستند.
روابط زیرکلاسها:
ویژگیهای مشترک¶
انواع date، datetime، time و timezone این ویژگیهای مشترک را دارند:
تعیین آگاه یا ساده بودن یک شیء¶
اشیای نوع date همیشه ساده هستند.
یک شیء از نوع time یا datetime ممکن است آگاه یا ساده باشد.
یک شیء datetime به نام d آگاه است اگر هر دو شرط زیر برقرار باشند:
d.tzinfoبرابر باNoneنیستd.tzinfo.utcoffset(d)مقدارNoneرا برنمیگرداند
در غیر این صورت، d ساده است.
یک شیء t از کلاس time آگاه است اگر هر دو مورد زیر برقرار باشند:
t.tzinfoبرابرNoneنیست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 < 10000000 <= 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.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¶
از ۰ تا ۹۹۹٬۹۹۹ (شامل هر دو).
عملیات پشتیبانیشده:
عملیات |
نتیجه |
|---|---|
|
مجموع |
|
تفاضل |
|
دلتا ضربشده در یک عدد صحیح. پس از آن |
بهطور کلی، |
|
|
دلتا در یک float ضرب میشود. نتیجه به نزدیکترین مضرب timedelta.resolution با استفاده از روش گرد کردن نیمه به زوج (round-half-to-even) گرد میشود. |
|
تقسیم (۳) مدتزمان کل |
|
دلتا تقسیمشده بر یک float یا int. نتیجه به نزدیکترین مضرب timedelta.resolution با استفاده از گرد کردن نیمه به زوج (round-half-to-even) گرد میشود. |
|
مقدار کف محاسبه میشود و باقیمانده (در صورت وجود) دور انداخته میشود. در حالت دوم، یک عدد صحیح برگردانده میشود. (۳) |
|
باقیمانده بهصورت یک شیء |
|
خارجقسمت و باقیمانده را محاسبه میکند: |
|
یک شیء |
|
معادل |
|
هنگامی که |
|
رشتهای را در قالب |
|
نمایش رشتهای شیء |
یادداشتها:
این دقیق است، اما ممکن است سرریز شود.
این دقیق است و نمیتواند سرریز کند.
تقسیم بر صفر باعث پرتاب
ZeroDivisionErrorمیشود.-timedelta.maxبهصورت یک شیءtimedeltaقابل نمایش نیست.نمایشهای رشتهای اشیای
timedeltaبهصورت مشابهی با نمایش داخلی آنها نرمال میشوند. این موضوع برای timedeltaهای منفی به نتایج نسبتاً غیرمعمولی منجر میشود. برای مثال:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
عبارت
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 <= MAXYEAR1 <= month <= 121 <= 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 برمیگرداند، با استثناهای زیر:تاریخهای با دقت کاهشیافته در حال حاضر پشتیبانی نمیشوند (
YYYY-MM،YYYY).بازنماییهای گستردهی تاریخ در حال حاضر پشتیبانی نمیشوند (
±YYYYYY-MM-DD).تاریخهای ترتیبی در حال حاضر پشتیبانی نمیشوند (
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.month¶
بین ۱ تا ۱۲، شامل هر دو.
- date.day¶
بین ۱ تا تعداد روزهای ماه دادهشده در سال دادهشده.
عملیات پشتیبانیشده:
عملیات |
نتیجه |
|---|---|
|
|
|
|
|
(3) |
date1 == date2date1 != date2 |
مقایسه برابری. (۴) |
date1 < date2date1 > date2date1 <= date2date1 >= date2 |
مقایسهی ترتیب. (۵) |
یادداشتها:
date2 اگر
timedelta.days > 0باشد، به جلو در زمان منتقل میشود، یا اگرtimedelta.days < 0باشد، به عقب در زمان منتقل میشود. پس از آنdate2 - date1 == timedelta.daysخواهد بود.timedelta.secondsوtimedelta.microsecondsنادیده گرفته میشوند. اگرdate2.yearکوچکتر ازMINYEARیا بزرگتر ازMAXYEARباشد،OverflowErrorپرتاب میشود.timedelta.secondsوtimedelta.microsecondsنادیده گرفته میشوند.این دقیق است و امکان سرریز ندارد.
timedelta.secondsوtimedelta.microsecondsبرابر ۰ هستند و پس از آنdate2 + timedelta == date1برقرار است.اشیای
dateزمانی با هم برابرند که تاریخ یکسانی را نشان دهند.اشیای
dateکه نمونههایdatetimeنیز نیستند، هرگز با اشیایdatetimeبرابر نیستند، حتی اگر نشاندهندهی تاریخ یکسانی باشند.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()به دست آورد، فراهم میکند (برای مثال، این ممکن است در سکوهایی که تابع Cgettimeofday()را ارائه میکنند، امکانپذیر باشد).اگر 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)¶
datetimeUTC متناظر با مهر زمانی 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 برمیگرداند، با استثناهای زیر:آفستهای منطقه زمانی ممکن است ثانیههای کسری داشته باشند.
میتوان جداکنندهی
Tرا با هر نویسهی یونیکد واحدی جایگزین کرد.ساعتها و دقیقههای کسری پشتیبانی نمیشوند.
تاریخهای با دقت کاهشیافته در حال حاضر پشتیبانی نمیشوند (
YYYY-MM،YYYY).بازنماییهای گستردهی تاریخ در حال حاضر پشتیبانی نمیشوند (
±YYYYYY-MM-DD).تاریخهای ترتیبی در حال حاضر پشتیبانی نمیشوند (
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.max¶
آخرین
datetimeقابلنمایش،datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
- datetime.resolution¶
کوچکترین تفاوت ممکن بین اشیای
datetimeکه برابر نیستند،timedelta(microseconds=1).
ویژگیهای نمونه (فقطخواندنی):
- 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.
عملیات پشتیبانیشده:
عملیات |
نتیجه |
|---|---|
|
(1) |
|
(2) |
|
(3) |
datetime1 == datetime2datetime1 != datetime2 |
مقایسه برابری. (۴) |
datetime1 < datetime2datetime1 > datetime2datetime1 <= datetime2datetime1 >= datetime2 |
مقایسهی ترتیب. (۵) |
datetime2به اندازهی یک بازهی زمانیtimedeltaازdatetime1فاصله دارد؛ اگرtimedelta.days > 0باشد در زمان به جلو حرکت میکند و اگرtimedelta.days < 0باشد در زمان به عقب حرکت میکند. نتیجه همان ویژگیtzinfoرا دارد که datetime ورودی دارد، و پس از آنdatetime2 - datetime1 == timedeltaبرقرار است. اگرdatetime2.yearکوچکتر ازMINYEARیا بزرگتر ازMAXYEARباشد،OverflowErrorپرتاب میشود. توجه داشته باشید که حتی اگر ورودی یک شیء آگاه باشد، هیچگونه تنظیمی برای منطقهی زمانی انجام نمیشود.datetime2را بهگونهای محاسبه میکند کهdatetime2 + timedelta == datetime1. همانند عمل جمع، نتیجه همان ویژگیtzinfoرا دارد که datetime ورودی دارد، و حتی اگر ورودی آگاه از منطقه زمانی باشد، هیچ تنظیمی برای منطقه زمانی انجام نمیشود.تفریق یک
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())است، با این تفاوت که پیادهسازی هرگز دچار سرریز نمیشود.اشیای
datetimeدر صورتی برابر هستند که تاریخ و زمان یکسانی را نشان دهند، با در نظر گرفتن منطقهی زمانی.اشیای
datetimeساده و آگاه هرگز برابر نیستند.اگر هر دو طرف مقایسه آگاه باشند و ویژگی
tzinfoیکسانی داشته باشند، ویژگیهایtzinfoوfoldنادیده گرفته میشوند و تاریخزمانهای پایه مقایسه میشوند. اگر هر دو طرف مقایسه آگاه باشند و ویژگیهایtzinfoمتفاوتی داشته باشند، مقایسه بهگونهای عمل میکند که گویی دو طرف مقایسه ابتدا به تاریخزمانهای UTC تبدیل شدهاند، با این تفاوت که پیادهسازی هرگز دچار سرریز نمیشود. نمونههایdatetimeدر یک بازه تکراری هرگز با نمونههایdatetimeدر منطقه زمانی دیگر برابر نیستند.datetime1 کمتر از datetime2 در نظر گرفته میشود، هرگاه datetime1 با در نظر گرفتن منطقه زمانی، از نظر زمانی قبل از datetime2 قرار داشته باشد.
مقایسهی ترتیبی بین اشیای
datetimeساده و آگاه، باعث پرتابTypeErrorمیشود.اگر هر دو طرف مقایسه آگاه باشند و ویژگی
tzinfoیکسانی داشته باشند، ویژگیهایtzinfoوfoldنادیده گرفته میشوند و datetimeهای پایه مقایسه میشوند. اگر هر دو طرف مقایسه آگاه باشند و ویژگیهایtzinfoمتفاوتی داشته باشند، مقایسه بهگونهای رفتار میکند که گویی طرفین مقایسه ابتدا به datetimeهای UTC تبدیل شدهاند، با این تفاوت که پیادهسازی هرگز دچار سرریز نمیشود.
تغییر یافته در نسخهی 3.3: مقایسههای برابری بین نمونههای datetime آگاه و ساده، استثنای TypeError را پرتاب نمیکنند.
تغییر یافته در نسخهی 3.13: مقایسه بین شیء datetime و نمونهای از زیرکلاس date که زیرکلاسی از datetime نیست، دیگر دومی را با نادیده گرفتن بخش زمان و منطقهی زمانی به 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
datetimeinstances are assumed to represent local time and this method relies on platform C functions to perform the conversion. Sincedatetimesupports a wider range of values than the platform C functions on many platforms, this method may raiseOverflowErrororOSErrorfor 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بگنجانید.'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.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.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 را برمیگرداند، با استثناهای زیر:آفستهای منطقه زمانی ممکن است ثانیههای کسری داشته باشند.
Tآغازین، که معمولاً در مواردی که ممکن است بین تاریخ و زمان ابهام وجود داشته باشد لازم است، لازم نیست.ثانیههای کسری میتوانند هر تعداد رقم داشته باشند (ارقام بیش از ۶ حذف خواهند شد).
ساعتها و دقیقههای کسری پشتیبانی نمیشوند.
مثالها:
>>> 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بگنجانید.'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مورد استفاده شما را فراهم کنید. ماژولdatetimetimezoneرا فراهم میکند؛ یک زیرکلاس عینی ساده از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)باید برای هر
datetimedt با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()¶
این متدها کدهای قالبی را میپذیرند که میتوان از آنها برای تجزیه و قالببندی تاریخها استفاده کرد:
>>> 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 کار میکنند.
دایرکتیو |
معنی |
مثال |
یادداشتها |
|---|---|---|---|
|
روز هفته بهصورت نام اختصاری محلی (locale). |
Sun, Mon, ..., Sat
(en_US);
So, Mo, ..., Sa
(de_DE)
|
(1) |
|
نام کامل روز هفته بر اساس locale. |
Sunday, Monday, ...,
Saturday (en_US);
Sonntag, Montag, ...,
Samstag (de_DE)
|
(1) |
|
روز هفته بهصورت عدد دهدهی، که در آن ۰ یکشنبه و ۶ شنبه است. |
0, 1, ..., 6 |
|
|
روز ماه بهصورت عدد دهدهی با صفرهای پیشرو. |
01, 02, ..., 31 |
(9) |
|
ماه بهصورت نام اختصاری locale. |
Jan، Feb، ...، Dec (en_US)؛
Jan, Feb, ..., Dez
(de_DE)
|
(1) |
|
ماه بهصورت نام کامل locale. |
January, February,
..., December (en_US);
Januar, Februar, ...,
Dezember (de_DE)
|
(1) |
|
ماه بهصورت عدد دهدهی با صفر پر شده. |
01, 02, ..., 12 |
(9) |
|
سال بدون قرن بهصورت عدد دهدهی با صفرِ پیشرو. |
00, 01, ..., 99 |
(9) |
|
سال همراه با قرن بهصورت عدد دهدهی. |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(2) |
|
ساعت (ساعت ۲۴ ساعته) بهصورت عدد دهدهی با صفر پرشده. |
00, 01, ..., 23 |
(9) |
|
ساعت (ساعت ۱۲ ساعته) بهصورت عدد دهدهی با صفر پرشده. |
01, 02, ..., 12 |
(9) |
|
معادل locale برای AM یا PM. |
AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
|
دقیقه بهصورت یک عدد دهدهی پر شده با صفر. |
00, 01, ..., 59 |
(9) |
|
ثانیه بهصورت عدد دهدهی با صفر پرشده. |
00, 01, ..., 59 |
(4), (9) |
|
میکروثانیه بهصورت عدد دهدهی، با صفر پر شده تا ۶ رقم. |
000000, 000001, ..., 999999 |
(5) |
|
اختلاف از UTC در قالب |
(empty), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
نام منطقه زمانی (رشته خالی اگر شیء ساده باشد). |
(empty), UTC, GMT |
(6) |
|
روز سال بهصورت عدد دهدهی با صفر پرشده. |
001, 002, ..., 366 |
(9) |
|
شمارهی هفتهی سال (یکشنبه بهعنوان اولین روز هفته) بهصورت عدد دهدهی با صفر پرشده. همهی روزهای سال جدید پیش از اولین یکشنبه، در هفتهی ۰ در نظر گرفته میشوند. |
00, 01, ..., 53 |
(7), (9) |
|
شمارهی هفتهی سال (دوشنبه بهعنوان نخستین روز هفته) بهصورت عدد دهدهی با صفر پرشده. همهی روزهای سال جدید پیش از نخستین دوشنبه، در هفتهی ۰ در نظر گرفته میشوند. |
00, 01, ..., 53 |
(7), (9) |
|
نمایش مناسب تاریخ و زمان بر اساس تنظیمات locale . |
Tue Aug 16 21:30:00
1988 (en_US);
Di 16 Aug 21:30:00
1988 (de_DE)
|
(1) |
|
نمایش مناسب تاریخ بر اساس تنظیمات locale. |
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
|
(1) |
|
نمایش زمان مناسب برای Locale. |
21:30:00 (en_US);
21:30:00 (de_DE)
|
(1) |
|
یک نویسهی |
% |
چند دایرکتیو اضافی که استاندارد C89 آنها را الزامی نمیداند، برای سهولت گنجانده شدهاند. این پارامترها همگی با مقادیر تاریخ ISO 8601 مطابقت دارند.
دایرکتیو |
معنی |
مثال |
یادداشتها |
|---|---|---|---|
|
سال ISO 8601 همراه با قرن، نشاندهندهی سالی که بخش بزرگتر هفتهی ISO ( |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(8) |
|
روز هفته در ISO 8601 بهصورت عدد دهدهی که در آن ۱ دوشنبه است. |
1, 2, ..., 7 |
|
|
هفتهی ISO 8601 بهصورت عدد دهدهی با دوشنبه بهعنوان نخستین روز هفته. هفتهی 01 هفتهای است که شامل ۴ ژانویه میشود. |
01, 02, ..., 53 |
(8), (9) |
|
فاصله زمانی از UTC در قالب |
(خالی)، +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 را پرتاب کند یا در عوض یک رشتهی خالی برگرداند.
یادداشتها:
از آنجا که قالب به locale بستگی دارد، هنگامی که دربارهی مقدار خروجی فرضهایی میکنید، باید احتیاط کنید. ترتیب فیلدها متفاوت خواهد بود (برای مثال، «ماه/روز/سال» در برابر «روز/ماه/سال»)، و خروجی ممکن است شامل نویسههای غیر ASCII باشد.
متد
strptime()میتواند سالها را در بازهی کامل [۱، ۹۹۹۹] تجزیه کند، اما سالهای کوچکتر از ۱۰۰۰ باید با صفر تا عرض ۴ رقمی پر شوند.تغییر یافته در نسخهی 3.2: در نسخههای پیشین، متد
strftime()به سالهای >= ۱۹۰۰ محدود شده بود.تغییر یافته در نسخهی 3.3: در نسخه 3.2، متد
strftime()به سالهای >= 1000 محدود شد.هنگامی که همراه با متد
strptime()استفاده شود، دایرکتیو%pتنها در صورتی بر فیلد ساعت خروجی تأثیر میگذارد که از دایرکتیو%Iبرای تجزیه ساعت استفاده شود.برخلاف ماژول
time، ماژولdatetimeاز ثانیههای کبیسه پشتیبانی نمیکند.هنگامی که با متد
strptime()استفاده شود، دایرکتیو%fاز ۱ تا ۶ رقم را میپذیرد و سمت راست آن را با صفر پر میکند.%fافزونهای بر مجموعهی نویسههای قالببندی در استاندارد C است (اما بهطور جداگانه در اشیای datetime پیادهسازی شده است و بنابراین همیشه در دسترس است).برای یک شیء ساده، کدهای قالب
%z،%:zو%Zبا رشتههای خالی جایگزین میشوند.برای یک شیء آگاه :
%zutcoffset()به رشتهای به شکل±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میپذیرد:هر مقداری در
time.tznameبرای تنظیمات locale رایانهی شمامقادیر سختکد
UTCوGMT
بنابراین شخصی که در ژاپن زندگی میکند ممکن است
JST،UTCوGMTرا بهعنوان مقادیر معتبر داشته باشد، اما احتمالاًESTرا نه. برای مقادیر نامعتبر،ValueErrorپرتاب خواهد شد.
تغییر یافته در نسخهی 3.2: هنگامی که دایرکتیو
%zبه متدstrptime()ارائه شود، یک شیءdatetimeآگاه از منطقهی زمانی تولید میشود.tzinfoنتیجه به یک نمونه ازtimezoneتنظیم میشود.هنگامی که با متد
strptime()استفاده شوند،%Uو%Wفقط زمانی در محاسبات به کار میروند که روز هفته و سال گاهشماریی (%Y) مشخص شده باشند.مانند
%Uو%W، از%Vفقط در محاسبات استفاده میشود، وقتی که روز هفته و سال ISO (%G) در یک رشتهی قالبstrptime()تعیین شده باشند. همچنین توجه داشته باشید که%Gو%Yقابل تعویض با یکدیگر نیستند.هنگام استفاده با متد
strptime()، صفر پیشتاز برای قالبهای%d،%m،%H،%I،%M،%S،%j،%U،%Wو%Vاختیاری است. برای قالب%y، صفر پیشتاز الزامی است.هنگام تجزیهی ماه و روز با استفاده از
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 را ببینید.
پانویسها