از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
کار با Datetime در پایتون با پیکان
سرفصلهای مطلب
معرفی
فلش یک ماژول پایتون برای کار با تاریخ و زمان است. با توجه به اینکه ماژول های مختلفی وجود دارند که این کار را انجام می دهند که مهم ترین آنها این است ساخته شده است datetime
ماژول، چه چیزی Arrow را متفاوت می کند؟
مهمتر از همه، این کتابخانه از الهام گرفته شده است Moment.js، یک کتابخانه جاوا اسکریپت که اجرای پیشفرض Date/Time API را لغو میکند.
در این راهنما، نگاهی به برخی از ویژگیهای کلیدی Arrow خواهیم انداخت تا ببینیم چگونه برخی از وظایف رایج را انجام میدهد.
ابتدا بیایید پیش برویم و آن را نصب کنیم:
$ pip install Arrow
را فلش کلاس
را Arrow
کلاس پیاده سازی است datetime
رابط، با قابلیت های اضافی. همچنین، آن است از منطقه زمانی آگاه است به طور پیش فرض – ما کمی بعداً به این موضوع خواهیم پرداخت.
شما به راحتی می توانید یک جدید ایجاد کنید Arrow
به عنوان مثال با ارائه چند آرگومان سازنده آن:
import arrow
arrow_object = arrow.Arrow(2021, 1, 1)
print(arrow_object)
این نتیجه در:
2021-01-01T00:00:00+00:00
همچنین می توانید ساعت ها، دقیقه ها و ثانیه ها را از طریق سازنده تهیه کنید:
import arrow
arrow_object = arrow.Arrow(2021, 1, 1, 14, 30, 21)
print(arrow_object)
این نتیجه در:
2021-01-01T14:30:21+00:00
پشتیبانی از تبدیل با پیکان
تجزیه تاریخ و زمان از یک رشته کار ساده ای است process با فلش – شما به سادگی از get()
روش، و آن را با یک قالب رشته معتبر تهیه کنید. همچنین، Arrow به شما امکان می دهد بدون زحمت بین پیاده سازی خود تبدیل کنید datetime
کلاس و داخلی datetime
هدف – شی.
با پیکان رشته را به Datetime تبدیل کنید
اگر رشته ای از قبل در فرمت شده باشد ISO 8601 قالب (YYYY-MM-DDTHH:MM:SS.mmmmmm
، می توان آن را به طور مستقیم به get()
روش:
import arrow
datetime = arrow.get('2021/03/30 12:05')
print(datetime)
این اراده print خارج از Arrow
به عنوان مثال، که اجرای خود Arrow از datetime
رابط:
<Arrow (2021-03-30T12:05:00+00:00)>
با این حال، در عمل، بعید است که ما از رشته هایی با فرمت صحیح، پیروی از مشخصات ISO استفاده کنیم.
خوشبختانه، ما همچنان میتوانیم رشتههایی را که به قراردادها پایبند نیستند، با استفاده از درست تجزیه کنیم نشانه های قالب پیکان. اینها از پیش تعریف شده اند و اطلاعات مورد نیاز برای تجزیه رشته را به Arrow می دهند:
import arrow
datetime = arrow.get('March 30 2021 12:05', 'MMMM DD YYYY HH:mm')
print(datetime)
در اینجا، ما به طور موثر به Arrow گفتیم که فرمت چیست. توکن های فرمت ارائه شده را با رشته ای که می خواهیم تجزیه کنیم نگاشت می کند و یک Arrow
مبتنی بر شی روی آن اطلاعات اجرای این نتیجه می شود:
<Arrow (2021-03-30T12:05:00+00:00)>
تبدیل بین فلش و زمان قرار اشیاء
تا الان باهاش کار کردیم Arrow
نمونه ها با این حال، بسیاری از برنامه ها و کتابخانه ها به صراحت از شما می خواهند که از a datetime
هدف – شی. تبدیل بین این دو فرمت بسیار مهم است.
بیایید نگاهی به type()
متغیر ما:
type(datetime)
خروجی:
arrow.arrow.Arrow
برای تبدیل این به a datetime
به عنوان مثال، ما به سادگی آن را استخراج می کنیم datetime
میدان از Arrow
هدف – شی:
datetime = datetime.datetime
print(datetime)
این منجر به آگاهی از منطقه زمانی می شود datetime
نمونه، مثال:
datetime.datetime(2021, 3, 12, 12, 5, tzinfo=tzutc())
حتی اگر هنگام ایجاد نسخه اصلی، منطقه زمانی را مشخص نکرده باشیم Arrow
شیء، datetime
شیء دارای tzinfo
پیش فرض UTC ما در بخش بعدی به این موضوع اشاره خواهیم کرد، زمانی که نگاهی دقیق تر به مدیریت مناطق زمانی داشته باشیم.
در حال حاضر، ما می توانیم تایید کنیم که در واقع یک است datetime
نوع شی:
type(now)
این منجر به
datetime.datetime
به طور مشابه به اندازه کافی، شما به راحتی می توانید تبدیل کنید datetime
اشیاء به Arrow
اشیاء، با استفاده از fromdatetime()
تابع:
datetime = datetime.datetime(2021, 1, 1, 0, 0)
arrow_object = arrow.Arrow.fromdatetime(datetime)
print(arrow_object)
این نتیجه در:
2021-01-01T00:00:00+00:00
برخورد با مناطق زمانی
یکی از مسائل مهم با datetime
ماژول روشی است که مناطق زمانی را مدیریت می کند. در نظر گرفته شده است منطقه زمانی ساده، به این معنی که هیچ داده مرتبط با منطقه زمانی ندارد. فلش روی دست دیگر حاوی الف است tzinfo
پارامتر برای هر نمونه، که می توانید از طریق سازنده یا از طریق متدها تنظیم کنید. را tzinfo
بدون توجه به موقعیت مکانی کاربر، روی UTC پیشفرض قرار میگیرد.
از نظر عملی این بدان معنی است که با datetime
، یک کاربر در هنگ کنگ به وقت محلی هنگ کنگ کار می کند در حالی که کاربر در بریتانیا به وقت محلی بریتانیا کار می کند – مگر اینکه غیر از این مشخص شده باشد:
import datetime
datetime.datetime.now()
خروجی برای کاربر مستقر در هنگ کنگ خواهد بود:
datetime.datetime(2021, 3, 31, 00, 35, 08, 114203)
در حالی که شخصی مستقر در بریتانیا می بیند:
datetime.datetime(2021, 3, 30, 17, 35, 25, 119213)
با افزایش کار از راه دور و همچنین جهانی شدن پروژه ها، داشتن یک منطقه زمانی پیش فرض استاندارد به طور فزاینده ای مهم است. نیاز به تنظیم صریح مناطق زمانی برای datetime
اشیا به سرعت کهنه می شوند Arrow این را خودکار می کند process، در یک منطقه زمانی واحد، یکپارچه و پیش فرض. البته می توانید آن را روی مناطق زمانی دیگر یا حتی محلی تنظیم کنید.
صرف نظر از موقعیت جغرافیایی کاربر، خطوط کد زیر همان خروجی را می دهد:
arrow.now()
خروجی:
<Arrow (2021-03-30T17:37:28.374335+01:00)>
ما می توانیم تأیید کنیم که این مطابق با زمان UTC است:
arrow.utcnow()
خروجی:
<Arrow (2021-03-30T16:37:59.721766+00:00)>
ما می توانیم مناطق زمانی را تعیین کنیم روی را Arrow
به عنوان مثال به سادگی با ارسال رشته منطقه زمانی در سازنده آن:
arrow.now('US/Pacific)
این در کنار سایر پارامترهایی که قبلاً استفاده کردهایم کار میکند. تنظیم یک منطقه زمانی در حین ساخت Arrow
instance هم برای تبدیل رشته ها و هم برای datetime
اشیاء و فراخوانی سازنده به صراحت:
import arrow
import datetime as datetime
date = '2021.01.01 00:00'
datetime = datetime.datetime(2021, 1, 1, 0, 0)
arrow_1 = arrow.Arrow(2021, 1, 1, 0, 0, tzinfo='US/Pacific')
arrow_2 = arrow.get(date, tzinfo='US/Pacific')
arrow_3 = arrow.Arrow.fromdatetime(datetime, tzinfo='US/Pacific')
print(arrow_1)
print(arrow_2)
print(arrow_3)
حالا اینها Arrow
نمونه ها روی تنظیم خواهند شد US/Pacific
منطقه زمانی، و در 1 ژانویه 2021 تنظیم شده است:
2021-01-01T00:00:00-08:00
2021-01-01T00:00:00-08:00
2021-01-01T00:00:00-08:00
همانطور که می بینید، اشیاء اکنون دارای یک هستند -08:00
پسوند، از آنجایی که US/Pacific
منطقه زمانی 8 ساعت عقب تر از UTC است.
همچنین میتوانید نسخههای ساده این تاریخها را با فراخوانی آنها استخراج کنید naive
رشته:
print(arrow_1.naive)
print(arrow_2.naive)
print(arrow_3.naive)
این امر آنها را از آگاهی منطقه زمانی خود دور نمی کند و در نتیجه زمانی که با افراد ساده لوح کار می کنید انتظار دارید. datetime
اشیاء:
2021-01-01 00:00:00
2021-01-01 00:00:00
2021-01-01 00:00:00
تبدیل بین مناطق زمانی با پیکان
حوزه دیگری که ارزش بررسی دارد این است که چگونه می توانیم با استفاده از Arrow بین مناطق زمانی مختلف را تبدیل کنیم to()
روش. در حالی که Arrow به طور کامل با ماژول های منطقه زمانی سازگار است، نیازی به آن وجود ندارد import هر ماژول اضافی برای تبدیل منطقه زمانی.
برای شروع می توانیم زمان جاری را دریافت کرده و آن را به یک متغیر اختصاص دهیم:
utc=arrow.now()
print(utc)
<Arrow (2021-03-30T17:41:08.765166+01:00)>
حالا بیایید این شی را به منطقه زمانی دیگری تبدیل کنیم:
utc.to('US/Pacific')
این نتیجه در:
<Arrow (2021-03-30T09:41:08.765166-07:00)>
یا زمان هنگ کنگ:
utc.to('Asia/Hong_Kong')
<Arrow (2021-03-30T09:41:08.765166-07:00)>
حتی می توانیم تفاوت زمانی را با تعداد ساعت مشخص کنیم:
utc.to('-05:00')
این یک راه بسیار بصری تر برای تبدیل بین مناطق زمانی است، به خصوص اگر لیستی از نام های مناسب در دسترس ندارید:
<Arrow (2021-03-30T11:41:08.765166-05:00)>
انسان سازی و تغییر تاریخ ها
اغلب اوقات، وقتی با بازه های زمانی سروکار داریم، واقعاً به a نیاز نداریم تاریخ. هنگام صحبت با همکاران می گوییم:
“من به خرید رفتم دیروز“.
نه:
“من به خرید رفتم روی 2021/12/03″، که روز قبل از 2021/12/04” است، که همین روز است.
در بسیاری از موارد، ممکن است بخواهید تاریخها را انسانی کنید، مانند حاشیهنویسی هنگام دریافت اعلان، ارسال ایمیل یا زمانی که شخصی یک اقدام ثبت شده خاص را انجام داد. خوشبختانه، Arrow به ما این امکان را می دهد که به راحتی هر تاریخی را از طریق آن انسانی سازی کنیم humanize()
تابع.
این تابع معجزه می کند shift()
تابع، که می تواند تاریخ ها را تغییر دهد 0...n
روزها. ممکن است بخواهید سیستمی بسازید که به فرد اطلاع دهد که چه زمانی تاریخ مشخصی در راه است انسان صحبت کن:
import arrow
now = arrow.now()
tomorrow = now.shift(days=1)
yesterday = now.shift(days=-1)
next_week = now.shift(days=7)
notification = now.shift(days=-2, hours=-5, minutes=-7)
print(now.humanize())
print(tomorrow.humanize())
print(yesterday.humanize())
print(next_week.humanize())
print(notification.humanize(granularity=('day', 'hour', 'minute')))
در اینجا، ما ایجاد کرده ایم Arrow
شی با استفاده از now()
تابع. سپس، یک سری از اشیاء را با تغییر مقادیر به بالا یا پایین ایجاد کرده ایم. را shift()
تابع آرگومان هایی مانند years
، months
، days
، hours
، minutes
و seconds
. ما ایجاد کرده ایم tomorrow
و yesterday
شی با جابجایی یک روز به بالا و پایین (نه در جای خود) و یک شی برای next_week
و خودسرانه notification
چیزی که 2 روز و 5 ساعت و 7 دقیقه پیش اتفاق افتاده است.
در نهایت، هنگام انسان سازی، می توانید آن را مشخص کنید granularity
، که به Arrow اجازه می دهد در مورد زمان گزارش دهی به زبان انسان چقدر دقیق باشد. به طور پیشفرض، جزئیات را روی آن تنظیم میکند day
و/یا week
، بسته به روی محدوده زمانی در مورد ما، تنظیمات پیش فرض را رها کرده ایم روی، به جز شی نهایی که در آن ما به طور خاص کمی دانه بندی دقیق تر می خواهیم:
just now
in a day
a day ago
in a week
2 days 5 hours and 7 minutes ago
این یک روش بسیار شهودی و انسانی برای نشان دادن تاریخ ها به کاربر شما است – مانند شمارش معکوس روزها برای یک رویداد، یا شمارش روز از جانب یک رویداد.
مزایای استفاده از پیکان
مزایای استفاده از Arrow را می توان با اظهارات رسمی مستندات آنها خلاصه کرد:
رویکرد معقول و انسان دوستانه.
پشتیبانی از بسیاری از سناریوهای ایجاد رایج
به شما کمک می کند تا با واردات کمتر و کد بسیار کمتر با تاریخ و زمان کار کنید.
در این موارد، به نظر می رسد که موفق شده است، و Arrow بر مشکلات اصلی غلبه می کند datetime
کتابخانه از آنچه در مثال های خود در بالا مشاهده کردیم، مطمئناً یک پیشرفت از نظر موارد زیر است:
- کاهش نیاز به وارد کردن چندین ماژول
- کار در یک نوع داده (فلش)
- آگاه بودن از منطقه زمانی
- ساده سازی ایجاد متداول ترین توابع تاریخ و زمان
- تبدیل آسان بین انواع مختلف
- توابع انسان سازی مفید
- به راحتی ارزش ها را به گذشته و آینده تغییر دهید
نتیجه
در این راهنما، ما تمرکز کرده ایم روی برخی از مزایای استفاده از کتابخانه Arrow برای کار با تاریخ و زمان در پایتون. از Moment.js الهام گرفته شده است و راه حل هایی برای برخی از مشکلات شناخته شده ارائه می دهد datetime
کتابخانه
با این حال، شایان ذکر است که بسیاری از ماژول های تاریخ و زمان دیگر در دسترس هستند. همچنین شایان ذکر است که ماژول داخلی بودن می دهد datetime
مزیت نیاز به کاربرانی که فعالانه به دنبال جایگزینی آن هستند.
همه چیز به این بستگی دارد که عنصر تاریخ و زمان برای پروژه و کد شما چقدر مهم است.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-11 11:26:04