জাঙ্গো ১.৪ - অফসেট-সাদাসিধা এবং অফসেট-সচেতন তারিখের সময়ের তুলনা করতে পারে না


86

আমি জাঙ্গো ১.২ থেকে ১.৪ এ একটি অ্যাপ্লিকেশন স্থানান্তর করার প্রক্রিয়াধীন।

আমার একটি প্রতিদিনের টাস্ক অবজেক্ট রয়েছে যাতে দিনের একটি সময় থাকে যে কাজটি শেষ করা উচিত:

class DailyTask(models.Model):
    time = models.TimeField()
    last_completed = models.DateTimeField()
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    weekends = models.BooleanField()

    def __unicode__(self):
        return '%s' % (self.name)

    class Meta:
        db_table = u'dailytask'
        ordering = ['name']

আজও কোনও কাজ শেষ হওয়া প্রয়োজন কিনা তা পরীক্ষা করার জন্য আমার কাছে নিম্নলিখিত কোড রয়েছে:

def getDueDailyTasks():
    dueDailyTasks=[]
    now = datetime.datetime.now()
    try:
        dailyTasks = DailyTask.objects.all()
    except dailyTask.DoesNotExist:
        return None
    for dailyTask in dailyTasks:
        timeDue = datetime.datetime(now.year,now.month,now.day,dailyTask.time.hour,dailyTask.time.minute,dailyTask.time.second)
        if timeDue<now and timeDue>dailyTask.last_completed:
            if dailyTask.weekends==False and now.weekday()>4:
                pass
            else:
                dueDailyTasks.append({'id':dailyTask.id,
                            'due':timeDue,
                             'name': dailyTask.name,
                             'description':dailyTask.description})
    return dueDailyTasks

এটি 1.2 এর নিচে জরিমানা কাজ করেছে, তবে 1.4 এর নীচে আমি ত্রুটি পেয়েছি:

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

লাইনের কারণে

if timeDue<now and timeDue>dailyTask.last_completed

এবং উভয় তুলনা ক্লজ এই ত্রুটি নিক্ষেপ।

আমি আর্গুমেন্ট হিসাবে পাইটজ.ইউটিসি যুক্ত করে টাইমডাউন টাইমজোনকে সচেতন করার চেষ্টা করেছি, তবে এটি এখনও একই ত্রুটি উত্থাপন করে।

আমি টাইমজোনগুলিতে কয়েকটি ডক পড়েছি তবে আমার কেবল টাইমডোন টাইমজোনটি সচেতন করা দরকার কিনা, বা আমার ডিবি এবং বিদ্যমান ডেটাগুলিতে মৌলিক পরিবর্তন করা দরকার কিনা তা নিয়ে আমি বিভ্রান্ত হয়ে পড়েছি।

উত্তর:


170

বিস্তারিত তথ্যের জন্য সম্পূর্ণ নথিটি পরীক্ষা করুন

সাধারণত, django.utils.timezone.nowএকটি অফসেট সচেতন বর্তমান তারিখের সময় করতে ব্যবহার করুন

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)

এবং django.utils.timezone.make_awareএকটি অফসেট সচেতন তারিখ সময় করতে

>>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone())
datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

তারপরে আপনি অফসেট-সচেতন তারিখের সময় w / o সমস্যা উভয়ের তুলনা করতে পারেন।

তদাতিরিক্ত, আপনি টাইমজোন তথ্য বন্ধ করে অফসেট-সচেতন ডেটটাইমকে অফসেট-সাদামাটা ডেটটাইমে রূপান্তর করতে পারেন, তারপরে এটি datetime.datetime.now()ইউটিসি এর অধীনে ডাব্লু / স্বাভাবিকের সাথে তুলনা করা যেতে পারে ।

>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)

USE_TZহয় True'ডিফল্টরূপে' (আসলে এটা Falseডিফল্ট ভাবে, কিন্তু settings.pyফাইল দ্বারা উত্পন্ন django-admin.py startprojectসেট এটি True), তারপর যদি আপনার ডিবি সমর্থন টাইমজোন সচেতন বার, সময়-সম্পর্কিত মডেল ক্ষেত্র মান সময় অঞ্চল-সচেতন হতে হবে। আপনি সেটিংসে সেটিংস USE_TZ=False(বা কেবল অপসারণ USE_TZ=True) দ্বারা এটি অক্ষম করতে পারেন ।


4
জ্যাঙ্গো টাইমফিল্ডের জন্য সচেতন সময় সংরক্ষণ করে না, এটি কেবল ডেটটাইমফিল্ডের জন্য করে। এটি সত্যই বিরক্তিকর, কারণ পাইথনের ডেটটাইম.টাইম অবজেক্টটি ডেটটাইম.ডেটটাইম অবজেক্টের মতো টিজিনফোকে সমর্থন করে। আমি ভাবছি তারা পরবর্তী প্রকাশে এটি ঠিক করে দেবে। বিটিডব্লিউ আমি এটি পোস্টার 9.1 ডাটাবেস সার্ভারে পরীক্ষা করেছি।
tejinderss

@tejinderss: datetime.timeভুল is 'Asia/Shanghai'আপনি যদি তারিখটি না জানেন তবে টাইমজোন সংরক্ষণ করার কোনও অর্থ নেই (ইউটিসি অফসেট একই সময়ে পৃথক হতে পারে তবে বিভিন্ন তারিখে)।
jfs

@ ওকেম: আপনার স্থানীয় সময় অঞ্চল থেকে পৃথক make_aware(datetime.now(), get_default_timezone())হলে ব্যর্থ হয় get_default_timezone()(এটি হওয়া উচিত তবে এটি সম্পূর্ণ নির্ভরযোগ্য নয়)। শুধু ব্যবহার timezone.now()পরিবর্তে (এটা সময় অঞ্চল-সচেতন যদি USE_TZহয় True)।
jfs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.