تكرار السؤال: …
الإجابة المختصرة
الـ naive datetime لا يحمل منطقة زمنية، فيُفسَّر حسب إعدادات الجهاز، مما يسبب مقارنات وتحويلات خاطئة. خزّن الأوقات كـ aware بتوقيت UTC وحوّلها لمنطقة المستخدم عند العرض فقط.
الشرح
datetime.now() بدون معامل تعيد وقتًا محليًا naive، و datetime.utcnow() أصبحت مهملة (deprecated) منذ Python 3.12؛ استخدم datetime.now(timezone.utc). مقارنة naive مع aware ترمي TypeError. استخدم zoneinfo (المدمج منذ 3.9) لمناطق مثل Africa/Cairo بدل الإزاحات الثابتة لأن التوقيت الصيفي يغيرها. واختبر الحالات الحدية حول تغيير التوقيت.
مثال بالكود
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
created_at = datetime.now(timezone.utc) # للتخزين
local = created_at.astimezone(ZoneInfo("Africa/Cairo")) # للعرض
print(created_at.isoformat()) # 2026-10-05T12:00:00+00:00أخطاء شائعة
- استخدام datetime.utcnow() التي تعيد naive datetime ويُفهم خطأً أنه محلي.
- تخزين أوقات بتوقيت الخادم المحلي ثم نقل الخادم لمنطقة أخرى.