یاد بگیرید که چگونه با مقادیر تاریخ و زمان با استفاده از کتابخانه تاریخ پایتون کار کنید، و چگونه از برخی از مشکلات و مشکلات مربوط به نوع داده تاریخ جلوگیری کنید.
- اشیاء زمان تاریخ و فاصله نام
- نوع داده زمان تاریخ
- مناطق زمانی و زمانهای تاریخ ساده
- تفاوتهای زمانی و اشیاء timedelta
- تبدیل از و به مُهر زمانی POSIX
- تبدیل رشته های تاریخ و زمان
کتابخانه datetime
پایتون، بخشی از کتابخانه استاندارد آن، انواع دادهها و روشهایی را برای کار با تاریخها و زمانها ارائه میکند. با این حال، تاریخها و زمانها لغزنده و ناسازگار هستند و کتابخانههای کار با آنها فقط میتوانند موارد را تا حد زیادی برطرف کنند.
در این مقاله، نحوه استفاده از کتابخانه datetime
پایتون، انواع دادهها و روشهای آن را بررسی خواهیم کرد. شما یاد خواهید گرفت که چگونه از این ویژگی ها بهترین استفاده را ببرید و در عین حال از تله ها و پیچیدگی های آنها در پایتون دوری کنید.
اشیاء زمان تاریخ و فاصله نام
نام datetime
هم به کتابخانه datetime
و هم به یکی از انواع دادههای پایتون اشاره دارد. فضای نام کتابخانه فقط به صورت datetime
است. اما نوع داده برای اشیاء تاریخ زمان به صورت datetime.datetime
در فضای نام قرار می گیرد.
اگر فقط import datetime
را در برنامه پایتون وارد کنید، فقط کتابخانه datetime
را وارد میکنید. اگر میخواهید با نوع داده datetime
برای ایجاد تاریخ و زمان کار کنید، باید به datetime.datetime
مراجعه کنید یا از from datetime import datetime
این شیء نوع داده را به جای کتابخانه بازیابی می کند.
دو راه برای کاهش سردرگمی هنگام کار با کتابخانه datetime
و نوع داده وجود دارد:
- اشیاء را از کتابخانه
datetime
با استفاده از نحوfrom datetime import ...
وارد کنید. نوع دادهdatetime
فقط در فضای نام محلی قرار میگیرد که ازfrom datetime import datetime
برای کار با آن استفاده کنید. - همیشه از
dt
برای مراجعه به کتابخانهdatetime
استفاده کنید. به عنوان مثال، به جایimport datetime
، می توانید ازimport datetime به عنوان dt
استفاده کنید. به این ترتیب،dt
همیشه به کتابخانه وdatetime
همیشه به نوع داده اشاره خواهد کرد.
برای وضوح، گزینه دوم را برای مثال های خود در نظر می گیریم و از datetime
برای ارجاع به نوع داده و dt
به عنوان نام مستعار برای < استفاده می کنیم. کتابخانه code>datetime.
نوع داده تاریخ
نوع داده datetime
نحوه نمایش تاریخ و زمان در یک شیء توسط پایتون است. وقتی یک نمونه از datetime
ایجاد میکنید، میتوانید آن را به یکی از چندین روش نمونهسازی کنید:
- از تاریخ و زمان فعلی با
datetime.now()
استفاده کنید. فقط برای تاریخ، ازdatetime.today()
استفاده کنید. - ارگومانهای کلمه کلیدی را برای
سال
،ماه
وday
به سازنده، با گزینههای اضافی برایhour
ارائه دهید. >،دقیقه
،ثانیه
وmicrosecond
. - از
مهر زمان
POSIX با استفاده ازdatetime.fromtimestamp(timestamp)
استفاده کنید. (به زودی بیشتر در این مورد.) - یک رشته تاریخ/زمان را در قالب مشخص شده با
datetime.strptime()
ارائه دهید. (به زودی بیشتر در این مورد.)
همه اینها یک شی datetime
جدید را با اطلاعات تاریخ و زمان به عنوان ویژگی در آن کدگذاری میکنند. به عنوان مثال، اگر یک شی datetime
جدید به نام now
ایجاد کرده اید، می توانید با بررسی now.year
، سال را دریافت کنید.
مناطق زمانی و زمانهای تاریخ ساده
هر datetime
که مربوط به دنیای واقعی است باید دارای منطقه زمانی مرتبط با آن باشد. اما در تمام مثالهای بالا برای ایجاد یک datetime
، شیء بهدستآمده چیزی است که سادهپوست datetime
نامیده میشود – یکی با no em> اطلاعات منطقه زمانی به آن پیوست شده است.
datetime
های ساده مشکلی ندارند مگر اینکه فقط آنها را با datetime
های ساده مقایسه کنید. به عنوان مثال، اگر یک شی datetime
را به صورت دوره ای به عنوان بخشی از یک عملیات محک گذاری در نظر بگیرید، و فقط آن اشیاء را با یکدیگر مقایسه کنید، مشکلی نیست.
مشکل زمانی است که میخواهید datetime
های ساده را با datetime
s با اطلاعات منطقه زمانی مقایسه کنید. اگر دو datetime
اطلاعات منطقه زمانی داشته باشند، تنظیم آنها و تعیین رابطه آنها کار سختی نیست. اما اگر کسی ساده لوح باشد، راهی برای مقایسه قابل فهم آنها وجود ندارد.
برای این منظور، هنگامی که اشیاء datetime
را ایجاد میکنید، عادت به افزودن یک منطقه زمانی دارید. شما همیشه می توانید از زمان UTC به عنوان یک بازگشت استفاده کنید، مانند:
- برای
dt.datetime.now()
، می توانید در یک منطقه زمانی به عنوان آرگومان ارسال کنید:dt.datetime.now(dt.timezone.utc)
.< /li> - برای
dt.datetime
، می توانید یک منطقه زمانی را به عنوان آرگومان کلمه کلیدیtzinfo
ارسال کنید:dt.datetime(year=2023, month=4, day= 1، tzinfo=dt.timezone.utc)
.
اگر datetime
ساده ای دارید و می خواهید یک منطقه زمانی به آن اختصاص دهید، می توانید از روش datetime.astimezone()
استفاده کنید. این به شما امکان میدهد از یک منطقه زمانی به عنوان آرگومان عبور کنید و یک جدید datetime
را با یک منطقه زمانی برگردانید. اطلاعات اولیه datetime
به عنوان زمان UTC در نظر گرفته می شود.
اگر میخواهید بدانید چه منطقه زمانی (در صورت وجود) با یک شی datetime
مرتبط است، ویژگی .tzinfo
آن را بررسی کنید. هیچکدام
به این معنی است که شما به datetime
ساده لوح نگاه می کنید.
تفاوت های زمانی و اشیاء timedelta
اشیاء
datetime
یک نقطه زمان را توصیف می کنند. اگر شیئی می خواهید که به بازه زمانی یا تفاوت بین دو نقطه در زمان اشاره کند، به نوع دیگری از شی نیاز دارید: timedelta< /code>.
اشیاء
timedelta
چیزی هستند که وقتی دو شی datetime
را می گیرید و یکی را از دیگری کم می کنید تا تفاوت را بدست آورید. اگر یک datetime
از هماکنون و یک datetime
از یک ساعت قبل داشته باشید، timedelta
حاصل، این تفاوت یک ساعته را نشان میدهد. اگر یک مقدار سوم datetime
ایجاد کنید و آن timedelta
را به آن اضافه کنید، یک شی datetime
جدید دریافت خواهید کرد که با این مدت زمان جبران شده است.< /p>
در اینجا یک مثال ساده آمده است:
import time
import datetime as dt
now = dt.datetime.now()
time.sleep(10)
# ten seconds later ...
now_2 = dt.datetime.now()
ten_seconds_delta = now_2 - now
now
و now_2
با فاصله ۱۰ ثانیه از یکدیگر گرفته شدند. تفاوت بین این دو را دریافت کنید و یک شی timedelta
۱۰ ثانیه ای داریم.
همچنین میتوانید اشیاء timedelta
را بهصورت دستی با ارسال آرگومانهایی به سازنده که تفاوتها را توصیف میکنند، ایجاد کنید. در اینجا یک مثال با استفاده از مقدار دلتای منفی آمده است:
import datetime as dt
now = dt.datetime.now()
minus_one_hour = dt.timedelta(hours=-1)
one_hour_ago = now + minus_one_hour
نکته مهمی که در مورد اشیاء timedelta
باید فهمید این است که ممکن است به نظر برسد که واحدهای خاصی را از دست داده اند. آنها حاوی اطلاعات زمان (ثانیه، دقیقه، ساعت) و اطلاعات تاریخ به صورت روز هستند. اما آنها ن حاوی هفته، ماه یا سال نیستند.
این یک اشکال نیست، بلکه یک حذف عمدی است. مقادیر تاریخ فراتر از شمارش روزها معیارهای متناقضی دارند، بنابراین هیچ فایده ای ندارد که آنها بخشی از timedelta
باشند. برای مثال، منطقی نیست که در مورد دلتای "یک ماه" صحبت کنید، اگر ندانید کدام ماه مورد بحث است، زیرا همه ماه ها تعداد روز یکسانی ندارند. (این امر برای سالها صدق میکند.) بنابراین اگر میخواهید در مورد آنچه در همان روز ماه گذشته، مثلاً سی ام اتفاق افتاده، صحبت کنید، باید مطمئن شوید که ماه گذشته آن روز را داشته است.< /p>
تبدیل از و به مُهرهای زمانی POSIX
یک قالب رایج برای زمان در محاسبات، مهر زمانی POSIX یا تعداد ثانیهها (که به صورت شناور بیان میشود) از ۱ ژانویه ۱۹۷۰ است. >datetime.fromtimestamp()، که مهر زمانی را به عنوان آرگومان و یک منطقه زمانی اختیاری می گیرد. همچنین می توانید از یک شی datetime
با datetime.timestamp()
یک مهر زمانی بدست آورید.
به شما هشدار داده می شود که تلاش برای دریافت مهر زمانی از یک شی زمانی که خارج از محدوده زمان های معتبر برای یک مهر زمانی است، یک استثنا OverflowError
ایجاد می کند. به عبارت دیگر، اگر تاریخهای تاریخی را پردازش میکنید، از مهرهای زمانی POSIX برای ذخیره یا سریالسازی آنها استفاده نکنید. از قالب رشته ای ISO 8601 که در بخش بعدی توضیح داده شده است استفاده کنید.
تبدیل رشته های تاریخ و زمان
اگر می خواهید یک شی datetime
را به یک رشته سریالی کنید، مطمئن ترین و قابل حمل ترین راه برای انجام آن datetime.isoformat()
است. این یک نسخه رشته ای از شی datetime را در قالب ISO 8601 برمی گرداند. به عنوان مثال، '۲۰۲۳-۰۴-۱۱T12:03:17.328474'
. سپس می توان این رشته را با datetime.fromisoformat()
به یک شی datetime
تبدیل کرد.
برای قالببندی سفارشی تاریخ/زمان، اشیاء datetime
datetime.strftime()
را برای چاپ یک شی datetime
با استفاده از قالببندی سفارشی ارائه میدهند و < code>datetime.strptime() برای تجزیه رشته های تاریخ/زمان با قالب بندی سفارشی. کدهای قالب برای strftime و strptime از استاندارد C89 پیروی می کنند ، با چند برنامه افزودنی سفارشی بسته به پلتفرم.
دوباره، به عنوان یک قاعده کلی، از قالب تاریخ سفارشی برای سریالسازی تاریخها به رشتهها و دوباره استفاده نکنید. قالب ISO که در بالا توضیح داده شد کار کردن با آن آسان تر است و به طور خودکار سازگار است.
پست های مرتبط
نوع تاریخ زمان استاد پایتون
نوع تاریخ زمان استاد پایتون
نوع تاریخ زمان استاد پایتون