۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نوع تاریخ زمان استاد پایتون

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

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

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

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

اشیاء زمان تاریخ و فاصله نام

نام datetime هم به کتابخانه datetime و هم به یکی از انواع داده‌های پایتون اشاره دارد. فضای نام کتابخانه فقط به صورت datetime است. اما نوع داده برای اشیاء تاریخ زمان به صورت datetime.datetime در فضای نام قرار می گیرد.

اگر فقط import datetime را در برنامه پایتون وارد کنید، فقط کتابخانه datetime را وارد می‌کنید. اگر می‌خواهید با نوع داده datetime برای ایجاد تاریخ و زمان کار کنید، باید به datetime.datetime مراجعه کنید یا از from datetime import datetime این شیء نوع داده را به جای کتابخانه بازیابی می کند.

دو راه برای کاهش سردرگمی هنگام کار با کتابخانه datetime و نوع داده وجود دارد:

  1. اشیاء را از کتابخانه datetime با استفاده از نحو from datetime import ... وارد کنید. نوع داده datetime فقط در فضای نام محلی قرار می‌گیرد که از from datetime import datetime برای کار با آن استفاده کنید.
  2. همیشه از 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های ساده را با datetimes با اطلاعات منطقه زمانی مقایسه کنید. اگر دو 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 که در بالا توضیح داده شد کار کردن با آن آسان تر است و به طور خودکار سازگار است.