নিষ্পাপ এবং সচেতন তারিখের সময় তুলনা করতে পারবেন না now এখন () <= চ্যালেঞ্জ.ডেটটাইম_েন্ড


154

আমি তুলনা অপারেটরগুলি ব্যবহার করে মডেলগুলিতে নির্দিষ্ট তারিখ এবং সময়গুলির সাথে বর্তমান তারিখ এবং সময়কে তুলনা করার চেষ্টা করছি:

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

স্ক্রিপ্ট এর সাথে ত্রুটিযুক্ত:

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

মডেলগুলি দেখতে এরকম:

class Fundraising_Challenge(models.Model):
    name = models.CharField(max_length=100)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()

আমি লোকাল তারিখ এবং সময় ব্যবহার করে জ্যাঙ্গোও পেয়েছি।

আমি যেটা খুঁজে পাইনি তা হ'ল ডেটটাইমফিল্ড () এর জন্য জাঙ্গো ব্যবহার করা ফর্ম্যাট। এটা কি নিষ্পাপ বা সচেতন? এবং আমি কীভাবে তারিখের সময় পাই? এখন (স্থানীয়) তারিখের সময় সনাক্ত করতে পারি?




1
তারিখের সাথে খেলতে খুব সুন্দর একটি লাইব রয়েছে: দুল (আমি অনুমোদিত নয়)
টমাস ডেকাউক্স

উত্তর:


137

ডিফল্টরূপে, datetimeঅবজেক্টটি naiveপাইথনে রয়েছে, সুতরাং আপনাকে উভয়কেই নিষ্পাপ বা সচেতন datetimeবস্তু তৈরি করতে হবে। এটি ব্যবহার করে করা যেতে পারে:

import datetime
import pytz

utc=pytz.UTC

challenge.datetime_start = utc.localize(challenge.datetime_start) 
challenge.datetime_end = utc.localize(challenge.datetime_end) 
# now both the datetime objects are aware, and you can compare them

দ্রষ্টব্য: এটি ইতিমধ্যে সেট করা ValueErrorথাকলে একটি উত্থাপন করবে tzinfo। আপনি যদি সে সম্পর্কে নিশ্চিত না হন তবে কেবল ব্যবহার করুন

start_time = challenge.datetime_start.replace(tzinfo=utc)
end_time = challenge.datetime_end.replace(tzinfo=utc)

বিটিডাব্লু, আপনি টাইমজোন তথ্যের সাথে ডেটটাইম.ডেটটাইম অবজেক্টে ইউনিক্স টাইমস্ট্যাম্পটি ফর্ম্যাট করতে পারেন

d = datetime.datetime.utcfromtimestamp(int(unix_timestamp))
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)

এটি বলে: ভ্যালুআরার: নিখুঁত ডেটটাইম নয় (tzinfo ইতিমধ্যে সেট করা আছে) যখন এটি গণনা করার চেষ্টা করে: ডেটটাইমস্টার্ট = utc.localize (চ্যালেঞ্জ.ডেটটাইম_স্টার্ট)
sccrthlt

হ্যাঁ, এটি মান বাড়িয়ে তোলে।
দিমিত্রি মিখাইলভ

4
পরিবর্তনের ফলে tzinfoকোনও রূপান্তর হয় না, তুলনাটি ভুল হয়ে যায়।
অরেঞ্জডোগ

এই জন্য +1। এবং, utc = pytz.utcপাইলট ত্রুটি রোধ করতে ব্যবহার করে No value for argument 'dt' in unbound method call (no-value-for-parameter)pytz লিংক
স্যাম

90

datetime.datetime.now টাইমজোন সচেতন নয়।

জ্যাঙ্গো এটির জন্য একটি সহায়ক নিয়ে আসে, যার প্রয়োজন pytz

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

আপনি তুলনা করতে সক্ষম হওয়া উচিত nowকরতেchallenge.datetime_start


3
তাহলে USE_TZ=Trueতারপর timezone.now()এমনকি যদি একটি সময় অঞ্চল-সচেতন DATETIME বস্তুর ফেরৎ pytzইনস্টল করা নেই (যদিও এটি অন্যান্য কারণের জন্য ইনস্টল করা বাঞ্ছনীয় হতে পারে)।
jfs

49

কোড সমাধানের একটি লাইন

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

বর্ণিত সংস্করণ

# Timezone info of your timezone aware variable
timezone = your_timezone_aware_variable.tzinfo

# Current datetime for the timezone of your variable
now_in_timezone = datetime.datetime.now(timezone)

# Now you can do a fair comparison, both datetime variables have the same time zone
if your_timezone_aware_variable <= now_in_timezone:
    pass #some code

সারসংক্ষেপ

আপনাকে অবশ্যই আপনার now()তারিখের সময়রেখার তথ্য যুক্ত করতে হবে ।
তবে আপনাকে অবশ্যই রেফারেন্স ভেরিয়েবলের একই টাইমজোনটি যুক্ত করতে হবে ; এজন্য আমি প্রথমে tzinfoগুণটি পড়েছি ।


18

সময় অঞ্চল অক্ষম করুন। ব্যবহার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):

2

সুতরাং যেভাবে আমি এই সমস্যাটি সমাধান করব তা হ'ল দুটি তারিখের সময় সঠিক সময়ে রয়েছে তা নিশ্চিত করা।

আমি দেখতে পাচ্ছি যে আপনি ব্যবহার করছেন datetime.now()যা কোনও সময় tzinfo সেট না করে সিস্টেমগুলি বর্তমান সময়ে ফিরে আসবে।

tzinfo হ'ল একটি ডেটটাইমের সাথে যুক্ত তথ্য যা এটি টাইমজোনটি কী তা তা জানাতে you আমি কেবলমাত্র ব্যবহারের সুপারিশ করবdatetime.utcnow()

আপনার কোথাও ডেটটাইম তৈরি হচ্ছে যা তাদের সাথে tzinfo যুক্ত রয়েছে, আপনার যা করা দরকার তা নিশ্চিত করা উচিত যে সেগুলি স্থানীয় সময় নির্ধারণ করা হয়েছে (tzinfo যুক্ত আছে) সঠিক সময়ের সাথে।

কটাক্ষপাত Delorean , এটা জিনিস এই সাজানোর অনেক সহজ সঙ্গে তার আচরণ করে তোলে।


8
আপনি এই সমস্যাটিও অবনকি দিয়ে দেখতে পাবেন।
অ্যান্ডি হেডেন 21

0

এটা আমার ফর্ম কাজ করছে। এখানে আমি তৈরি করা তারিখটি টেবিলটি জিত করছি এবং তারিখের সময় 10 মিনিট যুক্ত করছি। পরে বর্তমান সময়ের উপর নির্ভর করে মেয়াদোত্তীর্ণ অপারেশনগুলি সম্পন্ন হয়।

from datetime import datetime, time, timedelta
import pytz

ডেটাবেস ডেটটাইমে 10 মিনিট যুক্ত করা হয়েছে

টেবিল_ডেটটাইম = '2019-06-13 07: 49: 02.832969' (উদাহরণ)

# Added 10 minutes on database datetime
# table_datetime = '2019-06-13 07:49:02.832969' (example)

table_expire_datetime = table_datetime + timedelta(minutes=10 )

# Current datetime
current_datetime = datetime.now()


# replace the timezone in both time
expired_on = table_expire_datetime.replace(tzinfo=utc)
checked_on = current_datetime.replace(tzinfo=utc)


if expired_on < checked_on:
    print("Time Crossed)
else:
    print("Time not crossed ")

এটা আমার জন্য কাজ করেছে।


0

শুধু:

dt = datetimeObject.strftime(format) # format = your datetime format ex) '%Y %d %m'
dt = datetime.datetime.strptime(dt,format)

সুতরাং এটি করুন:

start_time = challenge.datetime_start.strftime('%Y %d %m %H %M %S')
start_time = datetime.datetime.strptime(start_time,'%Y %d %m %H %M %S')

end_time = challenge.datetime_end.strftime('%Y %d %m %H %M %S')
end_time = datetime.datetime.strptime(end_time,'%Y %d %m %H %M %S')

এবং তারপর ব্যবহার start_timeএবংend_time

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.