وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

کار با Datetime در پایتون با پیکان

0 16
زمان لازم برای مطالعه: 7 دقیقه


معرفی

فلش یک ماژول پایتون برای کار با تاریخ و زمان است. با توجه به اینکه ماژول های مختلفی وجود دارند که این کار را انجام می دهند که مهم ترین آنها این است ساخته شده است 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 ما در بخش بعدی به این موضوع اشاره خواهیم کرد، زمانی که نگاهی دقیق تر به مدیریت مناطق زمانی داشته باشیم.

پیشنهاد می‌کنیم بخوانید:  یک آرایه در جاوا اسکریپت یک شی استاندارد شده داخلی است که برای ذخیره چندین شی تحت یک نام استفاده می شود. به زبان ساده، می توانید به شی Array به عنوان یک آرایه در هر زبان برنامه نویسی دیگری نگاه کنید. اساساً کلاسی است که یک آرایه (لیست مرتب شده ای از مقادیر) را کپسوله می کند...

در حال حاضر، ما می توانیم تایید کنیم که در واقع یک است 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() تابع.

پیشنهاد می‌کنیم بخوانید:  ارسال درخواست HTTP در React هنگام کار با API ها اغلب می خواهیم داده ها را برای پردازش به سرور ارسال کنیم. به عنوان مثال، اگر ما لیستی از کارهای انجام شده داریم و می خواهیم به آن اضافه کنیم، شاید از طریق ارسال فرم، از درخواست های POST HTTP برای ارسال یک درخواست با یک بار برای پردازش و ... استفاده می کنیم.

این تابع معجزه می کند 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید