اذهب إلى المحتوى

السؤال

نشر

أحاول أن أقارن بين التاريخ والوقت الحاليين بالتواريخ والأوقات المحددة في النماذج باستخدام عوامل المقارنة كالتالي:

if post.datetime_start <= datetime.now() <= post.datetime_end:

لكن يظهر لي الخطأ التالي:

TypeError: can't compare offset-naive and offset-aware datetimes

تبدو الحقول في النموذج الذي لدي كما يلي:

class Post(models.Model):
    name = models.CharField(max_length=255)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()

كما أني لم أتمكن من معرفة صيغة الوقت والتاريخ التي يستخدمها جانغو Django للحقل DateTimeField. هل هي من نوع naive  أم aware؟

Recommended Posts

  • 1
نشر

بشكل افتراضي، يكون كائن التاريخ والوقت في Python من نوع naive، لذلك تحتاج إلى جعل كلاهما إما كائنات naive أو aware. ويمكن القيام بذلك باستخدام:

import datetime
import pytz

utc = pytz.UTC

post.datetime_start = utc.localize(post.datetime_start) 
post.datetime_end = utc.localize(post.datetime_end) 
# الآن كلا الحقلين من نوع aware, ويمكن المقارنة بينهما

كما أن جانغو Django يقدم طريقة سهلة لكي تحصل على الوقت والتاريخ الحاليين بنفس الصيغة التي يستعملها من خلال التبع datetime.datetime.now، على النحو التالي:

from django.utils import timezone
now = timezone.now()

كما يمكنك أن تقوم بتحويل الوقت والتاريخ من صيغة UNIX من خلال الكائن datetime.datetime، كالتالي:

unix_time = int(unix_timestamp)
d = datetime.datetime.utcfromtimestamp(unix_time)
d_with_tz = datetime.datetime(
    year = d.year,
    month = d.month,
    day = d.day,
    hour = d.hour,
    minute = d.minute,
    second = d.second,
    tzinfo = pytz.UTC)

 

  • 0
نشر

بدايةً كتوضيح بسيط.. هناك نوعان من كائنات الوقت والتاريخ: "الواعي aware" و "البسيط naive". يمتلك الكائن الواعي معرفة كافية بالعمليات الحسابية والتعديلات الدولية على الأوقات، كالمناطق الزمنية والتوقيت الصيفي، وتعديل القيمة الخاصّة به بصورة تتناسب مع الكائنات الواعية الأخرى. يستخدم الكائن الواعي لتمثيل فترة زمنية معيّنة غير مفتوحة للتفسير. أما الكائن البسيط فلا يمتلك المعلومات الكافية ليضع نفسه في المكان الصحيح نسبة إلى كائنات الوقت أو التاريخ الأخرى. تعتمد القيمة التي يمثّلها الكائن البسيط، سواء أكانت التوقيت العالمي المنسق (Coordinated Universal Time UTC) أو التوقيت المحلي، أو التوقيت في منطقة زمنية أخرى، تعتمد هذه القيمة بصورة تامة على البرنامج، وهو المسؤول الوحيد عن تمثيل رقم معيّن للأمتار أو الأميال أو الكتلة. بالنسبة لكائن datetime فهو من النوع البسيط. ولمزيد من التفاصيل يمكنك زيارة الرابط التالي:
https://wiki.hsoub.com/Python/datetime#.D8.A7.D9.84.D8.B5.D9.86.D9.81_datetime.date
أما بالنسبة للمشكلة فيجب عليك إضافة معلومات المنطقة الزمنية إلى datetime.now:

# aware_variable معلومات المنطقة الزمنية لل 
timezone = your_timezone_aware_variable.tzinfo
# التاريخ والوقت الحالي للمنطقة الزمنية للمتغير الخاص بك
now_in_timezone = datetime.datetime.now(timezone)
#يمكنك الآن إجراء مقارنة بينهما، فكل من متغيري التاريخ والوقت لهما نفس المنطقة الزمنية 
if your_timezone_aware_variable <= now_in_timezone:
    pass 

ويمكنك اختصار ماسبق بسطر واحد:

if timezone_aware_var <= datetime.datetime.now(timezone_aware_var.tzinfo):
    pass

 

  • 0
نشر

قم بتعطيل المنطقة الزمنية باستخدام السطر التالي

challenge.datetime_start.replace(tzinfo=None);

يمكنك أيضا استخدام replace(tzinfo=None) لتاريخ ووقت آخر كالتالي

if challenge.datetime_start.replace(tzinfo=None) <= datetime.now().replace(tzinfo=None) <= challenge.datetime_end.replace(tzinfo=None):

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...