Skip to content

Commit f7f05c8

Browse files
author
Saeid Darvish
committed
l25: strptime, strftime - starting
1 parent 2efe242 commit f7f05c8

1 file changed

Lines changed: 202 additions & 2 deletions

File tree

lessons/l25.rst

Lines changed: 202 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,9 @@
516516
datetime.date(2021, 4, 10)
517517

518518

519+
* **متد** ``(format)strftime`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.date.strftime>`__]: این متد بسیار پرکاربرد است و عملکرد آن به این صورت می‌باشد که یک قالب (format) را دریافت و معادل ``str`` از شی مورد نظر را بر اساس ساختار آن قالب برمی‌گردادند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت می‌باشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
520+
521+
519522

520523

521524

@@ -722,8 +725,7 @@
722725
>>> t.replace(tzinfo=tz_teh)
723726
datetime.time(22, 22, 22, tzinfo=datetime.timezone(datetime.timedelta(seconds=16200), 'Asia/Tehran'))
724727

725-
باید توجه داشت که با تغییر منطقه زمانی یک شی ``datetime.time``، اطلاعات مربوط به ساعت، در آن تغییری نخواهند داشت. چرا که تغییر ساعت بر اساس منطقه زمانی می‌تواند منجر به تغییر تاریخ گردد و این شی هیچ اطلاعاتی از تاریخ ندارد.
726-
728+
باید توجه داشت که با تغییر منطقه زمانی یک شی ``datetime.time``، اطلاعات مربوط به ساعت، در آن تغییری نخواهند داشت. چرا که وظیفه این متد تنها جایگزینی مقادیر می‌باشد و با جایگزینی منطقه زمانی، تغییری در زمان ثبت شده ایجاد نمی‌گردد.
727729

728730

729731
* **متد** ``isoformat`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.time.isoformat>`__]: معادل مقدار ساعت شی را در قالب استاندارد ISO 8601 برمی‌گرداند::
@@ -775,6 +777,8 @@
775777
'Asia/Tehran'
776778

777779

780+
* **متد** ``(format)strftime`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.time.strftime>`__]: این متد بسیار پرکاربرد است و عملکرد آن به این صورت می‌باشد که یک قالب (format) را دریافت و معادل ``str`` از شی مورد نظر را بر اساس ساختار آن قالب برمی‌گردادند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت می‌باشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
781+
778782

779783
naive / aware
780784
----------------------------
@@ -1045,6 +1049,202 @@ naive / aware
10451049
برخی از Instance methodهای یک شی ``datetime.datetime`` پایتون به شرح زیر هستند:
10461050

10471051

1052+
* **متد** ``date`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.date>`__]: بخش تاریخ از شی مورد نظر را در قالب یک شی ``datetime.date`` برمی‌گرداند::
1053+
1054+
>>> import datetime
1055+
>>> dt = datetime.datetime(2021, 4, 15, 12, 0, 0, tzinfo=datetime.timezone.utc)
1056+
>>> dt.date()
1057+
datetime.date(2021, 4, 15)
1058+
1059+
1060+
* **متد** ``time`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.time>`__]: بخش ساعت از شی مورد نظر را در قالب یک شی ``datetime.time``، بدون مقدار ``tzinfo`` برمی‌گرداند::
1061+
1062+
>>> import datetime
1063+
>>> dt = datetime.datetime(2021, 4, 15, 12, 0, 0, tzinfo=datetime.timezone.utc)
1064+
>>> dt.time()
1065+
datetime.time(12, 0)
1066+
1067+
>>> print(dt.time().tzinfo)
1068+
None
1069+
1070+
1071+
* **متد** ``timetz`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.timetz>`__]: بخش ساعت از شی مورد نظر را در قالب یک شی ``datetime.time``، به همراه مقدار ``tzinfo`` برمی‌گرداند::
1072+
1073+
>>> import datetime
1074+
>>> dt = datetime.datetime(2021, 4, 15, 12, 0, 0, tzinfo=datetime.timezone.utc)
1075+
>>> dt.timetz()
1076+
datetime.time(12, 0, tzinfo=datetime.timezone.utc)
1077+
1078+
>>> print(dt.timetz().tzinfo)
1079+
UTC
1080+
1081+
1082+
1083+
* **متد** ``astimezone(tz=None)`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.astimezone>`__]: با استفاده از این متد می‌توان منطقه زمانی شی مورد نظر را تغییر و به صورت یک شی جدید ``datetime.datetime`` دریافت کرد::
1084+
1085+
>>> import datetime
1086+
>>> dt = datetime.datetime(2021, 4, 15, 12, 0, 0, tzinfo=datetime.timezone.utc)
1087+
>>> dt
1088+
datetime.datetime(2021, 4, 15, 12, 0, tzinfo=datetime.timezone.utc)
1089+
1090+
>>> tz_ir = datetime.timezone(timedelta(hours=4, minutes=30), 'Asia/Tehran')
1091+
>>> dt.astimezone(tz_ir)
1092+
datetime.datetime(2021, 4, 15, 16, 30, tzinfo=datetime.timezone(datetime.timedelta(seconds=16200), 'Asia/Tehran'))
1093+
1094+
1095+
* **متد** ``utcoffset`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.utcoffset>`__]: اگر پارامتر ``tzinfo`` برابر ``None`` باشد، مقدار ``None`` و در غیر این صورت مقدار ``self.tzinfo.utcoffset(None)`` را برمی‌گرداند.
1096+
1097+
* **متد** ``tzname`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.tzname>`__]: اگر پارامتر ``tzinfo`` برابر ``None`` باشد، مقدار ``None`` و در غیر این صورت مقدار ``self.tzinfo.tzname(None)`` را برمی‌گرداند.
1098+
1099+
::
1100+
1101+
>>> from datetime import timedelta, timezone, datetime
1102+
1103+
>>> tz = timezone(timedelta(hours=4, minutes=30), 'Asia/Tehran')
1104+
>>> dt = datetime(year=2021, month=4, day=15, hour=12, minute=0, tzinfo=tz)
1105+
1106+
>>> dt.utcoffset()
1107+
datetime.timedelta(seconds=16200)
1108+
1109+
>>> dt.tzname()
1110+
'Asia/Tehran'
1111+
1112+
1113+
1114+
* **متد** ``timestamp`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp>`__]: معادل POSIX timestamp از زمان شی مورد نظر را در قالب یک شی ``float`` برمی‌گرداند::
1115+
1116+
>>> import datetime
1117+
1118+
>>> today = datetime.datetime(2021, 4, 15, 12, 0)
1119+
>>> today.timestamp()
1120+
1618471800.0
1121+
1122+
توجه داشته باشید استفاده از این متد تنها محدود به سال‌های مابین ۱۹۷۰ تا ۲۰۳۸ می‌باشد. چرا که این متد از تابع localtime یا gmtime در زبان برنامه‌نویسی C استفاده می‌کند که از سال ۲۰۳۸ به بعد مقدار timestamp از نوع signed 32-bit integer در این زبان، Overflow خواهد داشت! [`ویکی‌پدیا: Year 2038 problem <https://en.wikipedia.org/wiki/Year_2038_problem>`__]
1123+
1124+
1125+
* **متد** ``toordinal`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.toordinal>`__]: معادل proleptic Gregorian ordinal از شی مورد نظر را برمی‌گرداند::
1126+
1127+
>>> import datetime
1128+
1129+
>>> today = datetime.datetime(2021, 4, 15, 12, 0)
1130+
>>> today.toordinal()
1131+
737895
1132+
1133+
1134+
1135+
* **متد** ``weekday`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.isocalendar>`__]: شماره روز از هفته جاری را برمی‌گرداند. دوشنبه:صفر، سه‌شنبه:۱ ... یک‌شنبه:۶::
1136+
1137+
>>> import datetime
1138+
1139+
>>> today = datetime.datetime(2021, 4, 15, 12, 0) # Thursday, April 15, 2021
1140+
>>> today.weekday()
1141+
3
1142+
1143+
1144+
1145+
* **متد** ``isoweekday`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.isoweekday>`__]: شماره روز از هفته جاری را بر اساس استاندارد ISO calendar برمی‌گرداند. دوشنبه:۱، سه‌شنبه:۲ ... یک‌شنبه:۷::
1146+
1147+
>>> import datetime
1148+
1149+
>>> today = datetime.datetime(2021, 4, 15, 12, 0) # Thursday, April 15, 2021
1150+
>>> today.isoweekday()
1151+
4
1152+
1153+
1154+
* **متد** ``isocalendar`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.isocalendar>`__]: معادل ISO calendar از مقدار تاریخ شی مورد نظر را برمی‌گرداند::
1155+
1156+
>>> import datetime
1157+
1158+
>>> today = datetime.datetime(2021, 4, 15, 12, 0) # Thursday, April 15, 2021
1159+
>>> today.isocalendar()
1160+
(2021, 15, 4)
1161+
1162+
1163+
1164+
از پایتون نسخه 3.9 نوع خروجی این متد به صورت زیر تغییر کرده است::
1165+
1166+
1167+
>>> today.isocalendar()
1168+
datetime.IsoCalendarDate(year=2021, week=14, weekday=5)
1169+
1170+
1171+
* **متد** ``isoformat`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.isoformat>`__]: معادل مقدار زمان ثبت شده در شی مورد نظر را در قالب استاندارد ISO 8601 برمی‌گرداند::
1172+
1173+
>>> import datetime
1174+
1175+
>>> today = datetime.datetime(2021, 4, 15, 12, 0)
1176+
>>> today.isoformat()
1177+
'2021-04-15T12:00:00'
1178+
1179+
::
1180+
1181+
>>> today = datetime.datetime(2021, 4, 15, 12, 0, tzinfo=datetime.timezone.utc)
1182+
>>> today.isoformat()
1183+
'2021-04-15T12:00:00+00:00'
1184+
1185+
1186+
1187+
* **متد** ``replace`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.replace>`__]: با استفاده از این متد می‌توان یک شی ``datetime.datetime`` جدید همانند شی جاری ایجاد کرد ولی با کمی تغییرات::
1188+
1189+
replace(year,
1190+
month,
1191+
day,
1192+
hour=0,
1193+
minute=0,
1194+
second=0,
1195+
microsecond=0,
1196+
tzinfo=None, *, fold=0)
1197+
1198+
::
1199+
1200+
>>> import datetime
1201+
>>> today = datetime.datetime(2021, 4, 15, 12, 0)
1202+
1203+
>>> another_day = today.replace(day=22)
1204+
>>> another_day
1205+
datetime.datetime(2021, 4, 22, 12, 0)
1206+
1207+
1208+
به مثالی دیگر توجه نمایید::
1209+
1210+
>>> from datetime import timedelta, timezone, datetime
1211+
1212+
>>> tz = timezone(timedelta(hours=-5), 'Eastern Time Zone')
1213+
>>> dt = datetime(2021, 4, 15, 12, 0, tzinfo=tz)
1214+
>>> dt
1215+
datetime.datetime(2021, 4, 15, 12, 0, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=68400), 'Eastern Time Zone'))
1216+
1217+
1218+
>>> tz_teh = timezone(timedelta(hours=4, minutes=30), 'Asia/Tehran')
1219+
>>> dt.replace(tzinfo=tz_teh)
1220+
datetime.datetime(2021, 4, 15, 12, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=16200), 'Asia/Tehran'))
1221+
1222+
1223+
توجه داشته باشید که وظیفه این متد تنها جایگزینی مقادیر می‌باشد و با جایگزینی منطقه زمانی، تغییری در زمان ثبت شده ایجاد نمی‌گردد.
1224+
1225+
1226+
1227+
* **متد** ``(format)strftime`` [`اسناد پایتون <https://docs.python.org/3/library/datetime.html#datetime.datetime.strftime>`__]: این متد بسیار پرکاربرد است و عملکرد آن به این صورت می‌باشد که یک قالب (format) را دریافت و معادل ``str`` از شی مورد نظر را بر اساس ساختار آن قالب برمی‌گردادند. ساختار قالب در اینجا با آنچه توسط استاندارد ISO 8601 مطرح شده است کمی متفاوت می‌باشد که در انتهای این درس مورد بررسی قرار خواهد گرفت.
1228+
1229+
1230+
1231+
1232+
naive / aware
1233+
----------------------------
1234+
1235+
یک شی ``datetime.datetime`` (به عنوان مثال متغیر:‌ ``dt``) از نوع aware خواهد بود اگر دو شرط زیر برای آن درست باشد:
1236+
1237+
1238+
* مقدار پارامتر ``dt.zinfo`` مخالف ``None`` باشد.
1239+
* حاصل ``dt.tzinfo.utcoffset(dt)`` مخالف ``None`` باشد.
1240+
1241+
1242+
1243+
متدهای ``strftime`` و ``strptime``
1244+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1245+
1246+
1247+
10481248

10491249

10501250

0 commit comments

Comments
 (0)