أصبحت مواعيد بايثون سهلة.
يدعم بايثون 3.8 وأحدث .
> >> import pendulum
> >> now_in_paris = pendulum . now ( 'Europe/Paris' )
> >> now_in_paris
'2016-07-04T00:49:58.502116+02:00'
# Seamless timezone switching
> >> now_in_paris . in_timezone ( 'UTC' )
'2016-07-03T22:49:58.502116+00:00'
> >> tomorrow = pendulum . now (). add ( days = 1 )
> >> last_week = pendulum . now (). subtract ( weeks = 1 )
> >> past = pendulum . now (). subtract ( minutes = 2 )
> >> past . diff_for_humans ()
'2 minutes ago'
> >> delta = past - last_week
> >> delta . hours
23
> >> delta . in_words ( locale = 'en' )
'6 days 23 hours 58 minutes'
# Proper handling of datetime normalization
> >> pendulum . datetime ( 2013 , 3 , 31 , 2 , 30 , tz = 'Europe/Paris' )
'2013-03-31T03:30:00+02:00' # 2:30 does not exist (Skipped time)
# Proper handling of dst transitions
> >> just_before = pendulum . datetime ( 2013 , 3 , 31 , 1 , 59 , 59 , 999999 , tz = 'Europe/Paris' )
'2013-03-31T01:59:59.999999+01:00'
> >> just_before . add ( microseconds = 1 )
'2013-03-31T03:00:00+02:00'
تعد مثيلات datetime
الأصلية كافية للحالات الأساسية، ولكن عندما تواجه حالات استخدام أكثر تعقيدًا، فغالبًا ما تظهر قيودًا وليس من السهل التعامل معها. يوفر Pendulum
واجهة برمجة تطبيقات أكثر نظافة وسهولة في الاستخدام مع الاستمرار في الاعتماد على المكتبة القياسية. لذلك لا يزال datetime
ولكنه أفضل.
على عكس مكتبات التاريخ والوقت الأخرى لـ Python، يعد البندول بديلاً مباشرًا لفئة datetime
القياسية (ترث منها)، لذلك، يمكنك بشكل أساسي استبدال جميع مثيلات datetime
بمثيلات DateTime
في التعليمات البرمجية الخاصة بك (توجد استثناءات للمكتبات التي تتحقق من نوع الكائنات باستخدام وظيفة type
مثل sqlite3
أو PyMySQL
على سبيل المثال).
كما أنه يزيل فكرة أوقات التاريخ الساذجة: كل مثيل Pendulum
يكون مدركًا للمنطقة الزمنية وبشكل افتراضي بالتوقيت UTC
لسهولة الاستخدام.
يعمل البندول أيضًا على تحسين فئة timedelta
القياسية من خلال توفير أساليب وخصائص أكثر سهولة.
على الرغم من أن فئة DateTime
هي فئة فرعية من datetime
إلا أن هناك بعض الحالات النادرة حيث لا يمكنها استبدال الفئة الأصلية مباشرةً. فيما يلي قائمة (غير شاملة) بالحالات المبلغ عنها مع الحل المحتمل، إن وجد:
sqlite3
الدالة type()
لتحديد نوع الكائن افتراضيًا. للتغلب على هذه المشكلة، يمكنك تسجيل محول جديد: from pendulum import DateTime
from sqlite3 import register_adapter
register_adapter ( DateTime , lambda val : val . isoformat ( ' ' ))
mysqlclient
( MySQLdb
سابقًا) و PyMySQL
الدالة type()
لتحديد نوع الكائن افتراضيًا. للتغلب على هذه المشكلة، يمكنك تسجيل محول جديد: import MySQLdb . converters
import pymysql . converters
from pendulum import DateTime
MySQLdb . converters . conversions [ DateTime ] = MySQLdb . converters . DateTime2literal
pymysql . converters . conversions [ DateTime ] = pymysql . converters . escape_datetime
django
طريقة isoformat()
لتخزين أوقات التاريخ في قاعدة البيانات. ومع ذلك، نظرًا لأن pendulum
دائمًا على علم بالمنطقة الزمنية، فسيتم دائمًا إرجاع معلومات الإزاحة بواسطة isoformat()
مما يؤدي إلى ظهور خطأ، على الأقل بالنسبة لقواعد بيانات MySQL. للتغلب على هذه المشكلة، يمكنك إما إنشاء DateTimeField
الخاص بك أو استخدام الحل البديل السابق لـ MySQLdb
: from django . db . models import DateTimeField as BaseDateTimeField
from pendulum import DateTime
class DateTimeField ( BaseDateTimeField ):
def value_to_string ( self , obj ):
val = self . value_from_object ( obj )
if isinstance ( value , DateTime ):
return value . to_datetime_string ()
return '' if val is None else val . isoformat ()
المساهمات هي موضع ترحيب، وخاصة مع الترجمة.
للعمل على قاعدة بيانات البندول، ستحتاج إلى استنساخ المشروع محليًا وتثبيت التبعيات المطلوبة عبر الشعر.
$ git clone [email protected]:sdispater/pendulum.git
$ poetry install
إذا كنت تريد المساعدة في الترجمة، فهناك حالتان مختلفتان: اللغة موجودة بالفعل أم لا.
إذا لم تكن الإعدادات المحلية موجودة، فستحتاج إلى إنشائها باستخدام الأداة المساعدة clock
:
./clock locale create < your-locale >
سيتم إنشاء دليل في pendulum/locales
المسماة باسم منطقتك، بالبنية التالية:
<اللغة المحلية الخاصة بك>/
- custom.py
- locale.py
لا يجب تعديل الملف locale.py
. أنه يحتوي على الترجمات المقدمة من قاعدة بيانات CLDR.
الملف custom.py
هو الملف الذي تريد تعديله. أنه يحتوي على البيانات التي يحتاجها البندول والتي لا توفرها قاعدة بيانات CLDR. يمكنك أخذ البيانات كمرجع لمعرفة البيانات المطلوبة.
يجب عليك أيضًا إضافة اختبارات للغة التي تم إنشاؤها أو تعديلها.