GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing python.github.io — datetime --- انواع پایه تاریخ و زمان
|
عملیات |
نتیجه |
|---|---|
|
مجموع |
|
تفاضل |
|
دلتا ضربشده در یک عدد صحیح. پس از آن |
بهطور کلی، |
|
|
دلتا در یک 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) برابر نباشد.
متدهای نمونه:
تعداد کل ثانیههای موجود در مدت را برمیگرداند. معادل 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]
همهی آرگومانها الزامی هستند. آرگومانها باید عدد صحیح باشند و در بازههای زیر قرار داشته باشند:
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= number of days in the given month and year
اگر آرگومانی خارج از آن بازهها داده شود، ValueError پرتاب میشود.
سازندههای دیگر، همه متدهای کلاس:
تاریخ محلی فعلی را برمیگرداند.
این معادل date.fromtimestamp(time.time()) است.
تاریخ محلی متناظر با برچسب زمانی POSIX را برمیگرداند، مانند مقداری که توسط time.time() برگردانده میشود.
این ممکن است در صورتی که برچسب زمانی خارج از بازه مقادیر پشتیبانیشده توسط تابع C localtime() در سکو باشد، OverflowError را پرتاب کند، و در صورت شکست localtime() نیز OSError را پرتاب کند. این معمولاً به سالهای ۱۹۷۰ تا ۲۰۳۸ محدود است. توجه داشته باشید که در سیستمهای غیر POSIX که ثانیههای کبیسه را در مفهوم برچسب زمانی خود لحاظ میکنند، ثانیههای کبیسه توسط fromtimestamp() نادیده گرفته میشوند.
تغییر یافته در نسخهی 3.3: اگر برچسب زمانی خارج از محدوده مقادیر پشتیبانیشده توسط تابع localtime() در C پلتفرم باشد، OverflowError به جای ValueError پرتاب میشود. در صورت شکست localtime()، OSError به جای ValueError پرتاب میشود.
تغییر یافته در نسخهی 3.15: هر عدد حقیقی را بهعنوان timestamp میپذیرد، نه فقط عدد صحیح یا float.
تاریخ متناظر با ordinal در گاهشماری میلادی تعمیمیافته (proleptic Gregorian) را برمیگرداند؛ بهطوریکه ۱ ژانویه سال ۱ دارای شماره ترتیبی ۱ است.
استثنای ValueError پرتاب میشود مگر اینکه 1 <= ordinal <= date.max.toordinal(). برای هر تاریخ d، date.fromordinal(d.toordinal()) == d.
یک 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 پشتیبانی میکرد.
یک date متناظر با تاریخ گاهشماری ISO مشخصشده با year، week و day برمیگرداند. این معکوس تابع date.isocalendar() است.
اضافه شده در نسخهی 3.8.
یک 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 روزی از ماه (%d) را بدون سال مشخص کند، خطای ValueError بالا میآید. این کار برای جلوگیری از بروز باگ سال کبیسهی چهارساله در کدهایی است که میخواهند فقط ماه و روز را تجزیه کنند؛ زیرا سال پیشفرض در صورت نبود سال در قالب، یک سال کبیسه نیست. راهحل جایگزین این است که همیشه یک سال را در 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(MINYEAR, 1, 1).
آخرین تاریخ قابلنمایش، date(MAXYEAR, 12, 31).
کمترین اختلاف ممکن بین اشیای date نابرابر، timedelta(days=1).
ویژگیهای نمونه (فقطخواندنی):
بین ۱ تا ۱۲، شامل هر دو.
بین ۱ تا تعداد روزهای ماه دادهشده در سال دادهشده.
عملیات پشتیبانیشده:
عملیات |
نتیجه |
|---|---|
|
|
|
|
|
(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 جدید با همان مقادیر برمیگرداند، اما پارامترهای مشخصشده بهروزرسانی میشوند.
مثال:
>>> import datetime as dt >>> d = dt.date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26)
تابع عام copy.replace() همچنین از اشیای date پشتیبانی میکند.
یک 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 مانند d، date.fromordinal(d.toordinal()) == d است.
روز هفته را بهصورت یک عدد صحیح برمیگرداند، که در آن دوشنبه ۰ و یکشنبه ۶ است. برای مثال، date(2002, 12, 4).weekday() == 2، یک چهارشنبه. همچنین isoweekday() را ببینید.
روز هفته را بهصورت یک عدد صحیح برمیگرداند، بهگونهای که دوشنبه ۱ و یکشنبه ۷ است. برای مثال، date(2002, 12, 4).isoweekday() == 3، یک چهارشنبه. همچنین ببینید weekday()، 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: نتیجه از یک تاپل به یک تاپل نامدار تغییر کرد.
رشتهای را برمیگرداند که نشاندهندهی تاریخ در قالب ISO 8601 است، YYYY-MM-DD:
>>> import datetime as dt >>> dt.date(2002, 12, 4).isoformat() '2002-12-04'
برای یک تاریخ d، str(d) معادل d.isoformat() است.
رشتهای را برمیگرداند که نشاندهندهی تاریخ است:
>>> 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 مطابقت دارد.
رشتهای برمیگرداند که نشاندهندهی تاریخ است و با یک رشته قالب صریح کنترل میشود. کدهای قالب مربوط به ساعت، دقیقه یا ثانیه مقدار ۰ خواهند داشت. همچنین ببینید رفتار strftime() و strptime() و date.isoformat().
همانند 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 فرض میکند که در هر روز دقیقاً ۳۶۰۰*۲۴ ثانیه وجود دارد.
سازنده:
آرگومانهای 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 اضافه شد.
سازندههای دیگر، همه متدهای کلاس:
تاریخ و زمان محلی فعلی را با tzinfo برابر None بازمیگرداند.
معادل با:
datetime.fromtimestamp(time.time())
همچنین ببینید now()، fromtimestamp().
این متد از نظر عملکردی معادل now() است، اما بدون پارامتر tz.
تاریخ و زمان محلی فعلی را برمیگرداند.
اگر آرگومان اختیاری tz برابر None باشد یا مشخص نشده باشد، این مانند today() است، اما در صورت امکان، دقت بیشتری نسبت به آنچه میتوان از طریق یک مهر زمانی از time.time() به دست آورد، فراهم میکند (برای مثال، این ممکن است در سکوهایی که تابع C gettimeofday() را ارائه میکنند، امکانپذیر باشد).
اگر tz None نباشد، باید نمونهای از یک زیرکلاس tzinfo باشد و تاریخ و زمان جاری به منطقهی زمانی tz تبدیل میشوند.
این تابع به today() و utcnow() ترجیح داده میشود.
نکته
فراخوانیهای بعدی به datetime.now() ممکن است بسته به دقت ساعت زیربنایی، همان لحظه را برگردانند.
تاریخ و زمان 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 استفاده کنید.
تاریخ و زمان محلی متناظر با مهر زمانی 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 آنها روی ۱ تنظیم شده است.
تغییر یافته در نسخهی 3.15: هر عدد حقیقی را بهعنوان timestamp میپذیرد، نه فقط عدد صحیح یا float.
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 استفاده کنید.
datetime متناظر با شماره ترتیبی گاهشماری میلادی پیشرو (proleptic Gregorian ordinal) را برمیگرداند، که در آن ۱ ژانویه سال ۱ شماره ترتیبی ۱ را دارد. استثنای ValueError پرتاب میشود، مگر اینکه 1 <= ordinal <= datetime.max.toordinal() باشد. ساعت، دقیقه، ثانیه و میکروثانیهی نتیجه همگی ۰ هستند و tzinfo برابر None است.
یک شیء جدید datetime برمیگرداند که کامپوننتهای تاریخ آن برابر با کامپوننتهای تاریخ شیء date دادهشده است، و کامپوننتهای زمان آن برابر با کامپوننتهای زمان شیء time دادهشده است. اگر آرگومان tzinfo ارائه شود، از مقدار آن برای تنظیم ویژگی tzinfo نتیجه استفاده میشود، در غیر این صورت از ویژگی tzinfo آرگومان time استفاده میشود. اگر آرگومان date یک شیء datetime باشد، کامپوننتهای زمان و ویژگی tzinfo آن نادیده گرفته میشوند.
برای هر شیء d از کلاس datetime، d == datetime.combine(d.date(), d.time(), d.tzinfo).
تغییر یافته در نسخهی 3.6: آرگومان tzinfo افزوده شد.
یک 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() باشند.
یک datetime متناظر با تاریخ گاهشماری ISO مشخصشده با year، week و day برمیگرداند. اجزای غیرتاریخی datetime با مقادیر پیشفرض معمول خود مقداردهی میشوند. این، معکوس تابع datetime.isocalendar() است.
اضافه شده در نسخهی 3.8.
یک datetime متناظر با date_string برمیگرداند که طبق format تجزیه شده است.
اگر format شامل میکروثانیه یا اطلاعات منطقه زمانی نباشد، این معادل است با:
datetime(*(time.strptime(date_string, format)[0:6]))
ValueError پرتاب میشود اگر date_string و format توسط time.strptime() قابل تجزیه نباشند یا اگر مقداری برگرداند که یک تاپل زمانیی نباشد. همچنین رفتار strftime() و strptime() و datetime.fromisoformat() را ببینید.
تغییر یافته در نسخهی 3.15: اگر format روزی از ماه (%d) را بدون سال مشخص کند، خطای ValueError بالا میآید. این کار برای جلوگیری از بروز باگ سال کبیسهی چهارساله در کدهایی است که میخواهند فقط ماه و روز را تجزیه کنند؛ زیرا سال پیشفرض در صورت نبود سال در قالب، یک سال کبیسه نیست. راهحل جایگزین این است که همیشه یک سال را در 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 قابلنمایش، datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None).
کوچکترین تفاوت ممکن بین اشیای datetime که برابر نیستند، timedelta(microseconds=1).
ویژگیهای نمونه (فقطخواندنی):
بین ۱ تا ۱۲، شامل هر دو.
بین ۱ تا تعداد روزهای ماه دادهشده در سال دادهشده.
در range(24).
در range(60).
در range(60).
در range(1000000).
شیء دادهشده بهعنوان آرگومان tzinfo به سازندهی datetime، یا None اگر هیچ شیء داده نشده باشد.
در [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 تبدیل نمیکند. میتوان رفتار پیشفرض را با بازنویسی متدهای ویژهی مقایسه در زیرکلاسها تغییر داد.
متدهای نمونه:
شیء time را با همان ساعت، دقیقه، ثانیه، میکروثانیه و fold برمیگرداند. tzinfo برابر None است. همچنین متد timetz() را ببینید.
تغییر یافته در نسخهی 3.6: مقدار fold به شیء time برگرداندهشده کپی میشود.
یک شیء time با همان ویژگیهای hour، minute، second، microsecond، fold و tzinfo را برمیگرداند. همچنین متد time() را ببینید.
تغییر یافته در نسخهی 3.6: مقدار fold به شیء time برگرداندهشده کپی میشود.
یک شیء datetime جدید با همان ویژگیها برمیگرداند، اما پارامترهای مشخصشده در آن بهروزرسانی شدهاند. توجه داشته باشید که میتوان tzinfo=None را مشخص کرد تا بدون هیچگونه تبدیل دادههای تاریخ و زمان، یک datetime ساده از یک datetime آگاه ایجاد شود.
تابع عام copy.replace() همچنین از اشیای datetime پشتیبانی میکند.
تغییر یافته در نسخهی 3.6: پارامتر fold اضافه شد.
یک شیء 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() را بر روی نمونههای ساده که فرض میشود زمان محلی سیستم را نشان میدهند، فراخوانی کرد.
اگر tzinfo برابر None باشد، None را برمیگرداند، در غیر این صورت self.tzinfo.utcoffset(self) را برمیگرداند، و اگر این فراخوانی None یا یک شیء timedelta با اندازهای کمتر از یک روز را برنگرداند، استثنایی پرتاب میکند.
تغییر یافته در نسخهی 3.7: آفست UTC به تعداد حسابیای از دقیقهها محدود نمیشود.
اگر tzinfo برابر None باشد، None را برمیگرداند، در غیر این صورت self.tzinfo.dst(self) را برمیگرداند، و اگر این فراخوانی None یا یک شیء timedelta با اندازهای کمتر از یک روز را برنگرداند، استثنا پرتاب میکند.
تغییر یافته در نسخهی 3.7: آفست ساعت تابستانی (DST offset) به تعداد حسابیای از دقیقهها محدود نیست.
اگر tzinfo برابر None باشد، None را بازمیگرداند، در غیر این صورت self.tzinfo.tzname(self) را بازمیگرداند، و اگر مورد اخیر None یا یک شیء رشته را برنگرداند، استثنایی را پرتاب میکند،
یک 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 روی ۰ تنظیم میشود.
اگر نمونهی 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() استفاده کنید.
شماره ترتیبی تاریخ در گاهشماری میلادی تعمیمیافته (proleptic Gregorian ordinal) را برمیگرداند. این مقدار همان self.date().toordinal() است.
مهر زمانی POSIX متناظر با نمونهی datetime را برمیگرداند. مقدار بازگشتی یک float مشابه مقداری است که time.time() برمیگرداند.
نمونههای ساده datetime فرض میشود که زمان محلی را نشان میدهند و این متد برای انجام تبدیل به توابع C پلتفرم وابسته است. از آنجا که datetime طیف وسیعتری از مقادیر را نسبت به توابع C پلتفرم در بسیاری از پلتفرمها پشتیبانی میکند، این متد ممکن است برای زمانهای دور در گذشته یا دور در آینده OverflowError یا OSError را به وجود آورد.
برای نمونههای 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: این متد دیگر برای انجام تبدیلها به تابع mktime() پلتفرم C وابسته نیست.
روز هفته را بهعنوان عدد صحیح بازمیگرداند، بهطوری که دوشنبه ۰ و یکشنبه ۶ است. معادل self.date().weekday() است. همچنین isoweekday() را ببینید.
روز هفته را بهصورت عدد صحیح برمیگرداند، که در آن دوشنبه ۱ و یکشنبه ۷ است. معادل self.date().isoweekday() است. همچنین weekday() و isocalendar() را ببینید.
یک named tuple با سه کامپوننت برمیگرداند: year، week و weekday. معادل self.date().isocalendar() است.
رشتهای را برمیگرداند که تاریخ و زمان را در قالب 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 افزوده شد.
رشتهای برمیگرداند که تاریخ و زمان را نشان میدهد:
>>> 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 مطابقت دارد.
رشتهای را برمیگرداند که نشاندهنده تاریخ و زمان است و توسط یک رشته قالب صریح کنترل میشود. همچنین رفتار strftime() و strptime() و datetime.isoformat() را ببینید.
مشابه 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 قابل تنظیم است.
تمام آرگومانها اختیاری هستند. tzinfo میتواند None یا نمونهای از یک زیرکلاس tzinfo باشد. آرگومانهای باقیمانده باید اعداد صحیحی در بازههای زیر باشند:
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
اگر آرگومانی خارج از آن بازهها داده شود، ValueError پرتاب میشود. مقدار پیشفرض همه ۰ است، به جز tzinfo که مقدار پیشفرض آن None است.
ویژگیهای کلاس:
کمترین تفاوت ممکن بین اشیای time نابرابر، timedelta(microseconds=1)، هرچند توجه داشته باشید که عملیات حسابی روی اشیای time پشتیبانی نمیشود.
ویژگیهای نمونه (فقطخواندنی):
در range(24).
در range(60).
در range(60).
در range(1000000).
شیءای که بهعنوان آرگومان tzinfo به سازندهی time داده میشود، یا None اگر هیچ موردی داده نشده باشد.
در [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 را ببینید.
سازندههای دیگر:
یک 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() میتوانست آنها را تولید کند.
یک 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 جدید با همان مقدارها برمیگرداند، اما پارامترهای مشخصشده در آن بهروزرسانی شدهاند. توجه داشته باشید که میتوان tzinfo=None را برای ایجاد یک time ساده از یک time آگاه، بدون تبدیل دادههای زمان مشخص کرد.
تابع عام copy.replace() نیز از اشیای time پشتیبانی میکند.
تغییر یافته در نسخهی 3.6: پارامتر fold اضافه شد.
رشتهای را برمیگرداند که زمان را در قالب 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 افزوده شد.
برای یک زمان t، str(t) معادل t.isoformat() است.
رشتهای را برمیگرداند که بازنماییکنندهی زمان است و با یک رشتهی قالب صریح کنترل میشود. همچنین رفتار strftime() و strptime() و time.isoformat() را ببینید.
مشابه time.strftime(). این امکان را به شما میدهد که یک رشته قالببندی را برای یک شیء time در رشتههای قالببندیشده و هنگام استفاده از str.format() مشخص کنید. همچنین ببینید رفتار strftime() و strptime() و time.isoformat().
اگر tzinfo برابر None باشد، None را برمیگرداند، در غیر این صورت self.tzinfo.utcoffset(None) را برمیگرداند، و اگر مورد اخیر None یا یک شیء timedelta با اندازهای کمتر از یک روز را برنگرداند، استثنایی پرتاب میکند.
تغییر یافته در نسخهی 3.7: آفست UTC به تعداد حسابیای از دقیقهها محدود نمیشود.
اگر tzinfo برابر None باشد، None را برمیگرداند، در غیر این صورت self.tzinfo.dst(None) را برمیگرداند، و اگر دومی None یا یک شیء timedelta با اندازهای کمتر از یک روز را برنگرداند، استثنایی را پرتاب میکند.
تغییر یافته در نسخهی 3.7: آفست ساعت تابستانی (DST offset) به تعداد حسابیای از دقیقهها محدود نیست.
اگر 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¶این یک کلاس پایه انتزاعی است، به این معنا که این کلاس نباید مستقیماً نمونهسازی شود. برای ثبت اطلاعات دربارهی یک منطقه زمانی خاص، یک زیرکلاس از tzinfo تعریف کنید.
میتوان یک نمونه از (یک زیرکلاس ملموس از) tzinfo را به سازندههای اشیاء datetime و time پاس داد. این اشیاء ویژگیهای خود را بهصورت زمان محلی در نظر میگیرند و شیء tzinfo از متدهایی پشتیبانی میکند که اختلاف زمان محلی از UTC، نام منطقهی زمانی و اختلاف DST را، همگی نسبت به یک شیء date یا time که به آنها پاس داده شده است، آشکار میکنند.
شما باید یک زیرکلاس عینی مشتق کنید و (حداقل) پیادهسازی متدهای استاندارد tzinfo مورد نیاز متدهای datetime مورد استفاده شما را فراهم کنید. ماژول datetime timezone را فراهم میکند؛ یک زیرکلاس عینی ساده از tzinfo که میتواند مناطق زمانی با اختلاف ثابت از UTC، مانند خود UTC یا EST و EDT آمریکای شمالی را نمایش دهد.
الزام ویژه برای پیکلکردن : یک زیرکلاس از tzinfo باید یک متد __init__() داشته باشد که بتوان آن را بدون آرگومان فراخوانی کرد، در غیر این صورت میتوان آن را پیکل کرد، اما ممکن است دیگر نتوان آن را از حالت پیکل خارج کرد. این یک الزام فنی است که ممکن است در آینده تعدیل شود.
یک زیرکلاس عینی از tzinfo ممکن است نیاز داشته باشد متدهای زیر را پیادهسازی کند. اینکه دقیقاً کدام متدها مورد نیاز هستند، به نحوهی استفاده از اشیای آگاه datetime بستگی دارد. در صورت تردید، کافی است همهی آنها را پیادهسازی کنید.
آفست زمان محلی از 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 به تعداد حسابیای از دقیقهها محدود نمیشود.
مقدار تنظیم ساعت تابستانی (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) به تعداد حسابیای از دقیقهها محدود نیست.
نام منطقهی زمانی متناظر با شیء 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 وجود دارد که ممکن است یک کلاس فرعی بخواهد آن را بازنویسی کند:
این متد از پیادهسازی پیشفرض 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 نیز شناخته میشود) را در پایتون در دسترس قرار میدهد و استفاده از آن توصیه میشود.
پایگاه دادهی مناطق زمانی (که اغلب tz، tzdata یا zoneinfo نامیده میشود) حاوی کد و دادههایی است که تاریخچهی زمان محلی را برای بسیاری از مکانهای معرف در سراسر جهان نشان میدهند. این پایگاه داده بهطور دورهای بهروزرسانی میشود تا تغییراتی را که نهادهای سیاسی در مرزهای مناطق زمانی، آفستهای UTC و قوانین ساعت تابستانی اعمال میکنند، منعکس کند.
timezone¶کلاس timezone زیرکلاسی از tzinfo است که هر نمونه از آن نشاندهندهی یک منطقهی زمانی تعریفشده با یک آفست ثابت از UTC است.
نمیتوان از اشیای این کلاس برای نمایش اطلاعات منطقه زمانی در مکانهایی استفاده کرد که در روزهای مختلفی از سال از آفستهای متفاوت استفاده میشود یا تغییرات تاریخی در زمان مدنی اعمال شدهاند.
آرگومان offset باید بهصورت یک شیء timedelta مشخص شود که اختلاف بین زمان محلی و UTC را نشان میدهد. این مقدار باید بهطور اکید بین -timedelta(hours=24) و timedelta(hours=24) باشد، در غیر این صورت ValueError پرتاب میشود.
آرگومان name اختیاری است. در صورت مشخص شدن، باید رشتهای باشد که بهعنوان مقدار بازگشتی متد datetime.tzname() استفاده میشود.
اضافه شده در نسخهی 3.2.
تغییر یافته در نسخهی 3.7: آفست UTC به تعداد حسابیای از دقیقهها محدود نمیشود.
مقدار ثابتی را که هنگام ساخت نمونهی timezone تعیین شده است، برمیگرداند.
آرگومان dt نادیده گرفته میشود. مقدار بازگشتی یک نمونهی timedelta است که برابر با اختلاف بین زمان محلی و UTC است.
تغییر یافته در نسخهی 3.7: آفست UTC به تعداد حسابیای از دقیقهها محدود نمیشود.
مقدار ثابتی را که هنگام ساخت نمونهی 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'.
همیشه None را برمیگرداند.
dt + offset را برمیگرداند. آرگومان dt باید یک نمونهی آگاه از datetime باشد که tzinfo آن روی self تنظیم شده باشد.
ویژگیهای کلاس:
منطقه زمانی 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 در سال ۲۰۱۱ الزامی کرده است آمده و این موارد روی تمام پلتفرمهای پشتیبانیشده کار میکنند.
دایرکتیو |
معنی |
مثال |
یادداشتها |
|---|---|---|---|
|
روز هفته بهصورت نام اختصاری محلی (locale). |
Sun, Mon, ..., Sat
(en_US);
So, Mo, ..., Sa
(de_DE)
|
(1) |
|
نام کامل روز هفته بر اساس locale. |
Sunday, Monday, ...,
Saturday (en_US);
Sonntag, Montag, ...,
Samstag (de_DE)
|
(1) |
|
ماه بهصورت نام اختصاری locale. |
Jan، Feb، ...، Dec (en_US)؛
Jan, Feb, ..., Dez
(de_DE)
|
(1) |
|
ماه بهصورت نام کامل locale. |
January, February,
..., December (en_US);
Januar, Februar, ...,
Dezember (de_DE)
|
(1) |
|
نمایش مناسب تاریخ و زمان بر اساس تنظیمات locale . |
Tue Aug 16 21:30:00
1988 (en_US);
Di 16 Aug 21:30:00
1988 (de_DE)
|
(1) |
|
سال تقسیم بر ۱۰۰ و قطعشده به یک عدد صحیح بهعنوان یک عدد دهدهی پرشده با صفر. |
01, 02, ..., 99 |
(0) |
|
روز ماه بهصورت عدد دهدهی با صفرهای پیشرو. |
01, 02, ..., 31 |
(9), (10) |
|
معادل |
11/28/25 |
(9) |
|
روز ماه بهعنوان یک عدد دهدهی پرشده با فاصله. |
␣1, ␣2, ..., 31 |
(10) |
|
معادل با |
2025-10-11, 1001-12-30 |
|
|
۲ رقم آخر سال ISO 8601 که نمایانگر سال شامل بخش بزرگتری از هفتهی ISO ( |
00, 01, ..., 99 |
(0) |
|
سال ISO 8601 همراه با قرن، نشاندهندهی سالی که بخش بزرگتر هفتهی ISO ( |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(8) |
|
معادل |
به |
(0) |
|
ساعت (ساعت ۲۴ ساعته) بهصورت عدد دهدهی با صفر پرشده. |
00, 01, ..., 23 |
(9) |
|
ساعت (ساعت ۱۲ ساعته) بهصورت عدد دهدهی با صفر پرشده. |
01, 02, ..., 12 |
(9) |
|
روز سال بهصورت عدد دهدهی با صفر پرشده. |
001, 002, ..., 366 |
(9) |
|
ماه بهصورت عدد دهدهی با صفر پر شده. |
01, 02, ..., 12 |
(9) |
|
دقیقه بهصورت یک عدد دهدهی پر شده با صفر. |
00, 01, ..., 59 |
(9) |
|
نویسهی خط جدید ( |
|
|
|
معادل locale برای AM یا PM. |
AM, PM (en_US);
am, pm (de_DE)
|
(1), (3) |
|
زمان ساعت ۱۲ ساعتهی locale. |
۱۲:۰۰:۰۰ ب.ظ |
(1), (0) |
|
معادل |
۱۰:۰۱ |
|
|
ثانیه بهصورت عدد دهدهی با صفر پرشده. |
00, 01, ..., 59 |
(4), (9) |
|
نویسهی تب ( |
|
|
|
قالب زمان ISO 8601، معادل |
۱۰:۰۱:۵۹ |
|
|
روز هفته در ISO 8601 بهصورت عدد دهدهی که در آن ۱ دوشنبه است. |
1, 2, ..., 7 |
|
|
شمارهی هفتهی سال (یکشنبه بهعنوان اولین روز هفته) بهصورت عدد دهدهی با صفر پرشده. همهی روزهای سال جدید پیش از اولین یکشنبه، در هفتهی ۰ در نظر گرفته میشوند. |
00, 01, ..., 53 |
(7), (9) |
|
هفتهی ISO 8601 بهصورت عدد دهدهی با دوشنبه بهعنوان نخستین روز هفته. هفتهی 01 هفتهای است که شامل ۴ ژانویه میشود. |
01, 02, ..., 53 |
(8), (9) |
|
روز هفته بهصورت عدد دهدهی، که در آن ۰ یکشنبه و ۶ شنبه است. |
0, 1, ..., 6 |
|
|
شمارهی هفتهی سال (دوشنبه بهعنوان نخستین روز هفته) بهصورت عدد دهدهی با صفر پرشده. همهی روزهای سال جدید پیش از نخستین دوشنبه، در هفتهی ۰ در نظر گرفته میشوند. |
00, 01, ..., 53 |
(7), (9) |
|
نمایش مناسب تاریخ بر اساس تنظیمات 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) |
|
سال بدون قرن بهصورت عدد دهدهی با صفرِ پیشرو. |
00, 01, ..., 99 |
(9) |
|
سال همراه با قرن بهصورت عدد دهدهی. |
0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
(2) |
|
اختلاف از UTC در قالب |
(empty), +0000, -0400, +1030, +063415, -030712.345216 |
(6) |
|
نام منطقه زمانی (رشته خالی اگر شیء ساده باشد). |
(empty), UTC, GMT |
(6) |
|
یک نویسهی |
% |
دایرکتیوهای سال و شماره هفته در ISO 8601 با دایرکتیوهای سال و شماره هفته در بالا قابلجایگزینی نیستند. فراخوانی متد strptime() با دایرکتیوهای ناقص یا مبهم ISO 8601 باعث ایجاد خطای ValueError خواهد شد.
چندین دایرکتیو اضافی که توسط استاندارد C11 الزامی نشدهاند، برای راحتی کار گنجانده شدهاند.
دایرکتیو |
معنی |
مثال |
یادداشتها |
|---|---|---|---|
|
میکروثانیه بهصورت عدد دهدهی، با صفر پر شده تا ۶ رقم. |
000000, 000001, ..., 999999 |
(5) |
|
فاصله زمانی از UTC در قالب |
(خالی)، +00:00، -04:00، +10:30، +06:34:15، -03:07:12.345216 |
(6) |
مجموعه کامل کدهای قالببندی پشتیبانیشده در پلتفرمهای مختلف متفاوت است، زیرا پایتون تابع strftime() از کتابخانه C پلتفرم را فراخوانی میکند و تفاوتهای بین پلتفرمها رایج است. برای مشاهده مجموعه کامل کدهای قالببندی پشتیبانیشده در پلتفرم شما، به مستندات strftime(3) مراجعه کنید. همچنین در مدیریت مشخصکنندههای قالببندی پشتیبانینشده، بین پلتفرمها تفاوتهایی وجود دارد.
اضافه شده در نسخهی 3.6: %G، %u و %V افزوده شدند.
اضافه شده در نسخهی 3.12: مقدار %:z برای strftime() اضافه شد.
اضافه شده در نسخهی 3.15: مواردهای %D، %F، %n، %t و %:z برای strptime() اضافه شدند.
بهطور کلی، 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() در صورت مواجهه با ۲۹ فوریه استثنا پرتاب میکنند، زیرا سال پیشفرض ۱۹۰۰ یک سال کبیسه نیست. همیشه پیش از تجزیه، یک سال کبیسهی پیشفرض به رشتههای تاریخ ناقص اضافه کنید.
نکته
اگر یک رشتهی قالب strptime() شامل بیش از یک دایرکتیو برای یک فیلد یکسان باشد، برای مثال هم %Y و هم %y، هر دایرکتیو همچنان باید با ورودی مطابقت داشته باشد، اما تنها مقدار آخرین مورد استفاده میشود. برای مثال، تجزیه کردن 200099 با %Y%y سال ۱۹۹۹ را نتیجه میدهد. تکرار کردن همان دایرکتیو، مانند %Y%Y، خطایی را ایجاد میکند.
>>> 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 را پرتاب کند یا در عوض یک رشتهی خالی برگرداند.
یادداشتها:
این کد قالب در حال حاضر توسط strptime() پشتیبانی نمیشود.
از آنجا که قالب به 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 میتوانند دارای یک علامت دونقطه بهعنوان جداکننده بین ساعتها، دقایق و ثانیهها باشند. برای مثال، هر دو مقدار '+010000' و '+01:00:00' بهعنوان آفستی برابر با یک ساعت تجزیه خواهند شد. علاوه بر این، ارائهی 'Z' با '+00:00' یکسان است.
%:zهنگامی که با strftime() استفاده میشود، دقیقاً مانند %z رفتار میکند، با این تفاوت که یک جداکنندهی دونقطه بین ساعتها، دقایق و ثانیهها اضافه میشود.
هنگامی که با strptime() استفاده میشود، آفست UTC باید دارای یک دونقطه بهعنوان جداکننده بین ساعتها، دقایق و ثانیهها باشد. برای مثال، '+01:00:00' (اما نه '+010000') بهعنوان آفستی معادل یک ساعت تجزیه خواهد شد. علاوه بر این، ارائهی 'Z' با '+00:00' یکسان است.
%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.15: استفاده از %d بدون سال اکنون باعث ایجاد ValueError میشود.
منسوخ شده از نسخهی 3.15, در نسخهی 3.17 حذف خواهد شد: فراخوانیهای متد strptime() که از یک رشتهی قالببندی حاوی %e بدون سال استفاده میکنند، اکنون یک DeprecationWarning صادر میکنند.
پانویسها