দুটি তারিখের মধ্যে দিন গণনা করুন


149

এই দুটি তারিখের মধ্যে আমি কীভাবে দিনের সংখ্যা গণনা করব?

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"

উত্তর:


207

তারিখ (এবং তারিখটাইম) ক্লাসের সাহায্যে আপনি (end_date - start_date).to_iদিনের সংখ্যার পার্থক্য পেতে পারেন ।


5
@ মিশেলডুরান্ট আপনি একটি অনিয়ন্ত্রিত অনুমান করছেন। তারা স্ট্রিং কিনা তা ব্যবহারকারী নির্দিষ্ট করে না। বাস্তবে যেহেতু তারা রেলগুলি ব্যবহার করছে সেহেতু সম্ভবত সম্ভবত তারিখগুলি অ্যাক্টিভেকর্ড থেকে আসছে যা এটি স্বয়ংক্রিয়ভাবে তারিখের অবজেক্টগুলিতে কাস্ট করবে। প্রদত্ত পাঠ্যটি ডেট অবজেক্টের উপস্থাপনার সাথেও অভিন্ন, এটি সম্ভবত কোনও স্থানীয় উত্স থেকে এসেছে making
অ্যান্ড্রু ফ্রান্স

84
এটি আমাকে রেলের সাথে দিনগুলিতে নয় সেকেন্ডের মধ্যে পার্থক্য দেয় v3 / 4
কল-বিশৃঙ্খলা

6
যতদূর আমি বলতে পারি রুবি এবং অ্যাক্টিভসপোর্টের সমস্ত সাম্প্রতিক সংস্করণগুলিতে আচরণ একই থাকে, যথাক্রমে 2.0 এবং 4.1.0 অন্তর্ভুক্ত করুন 1 Timeবস্তু যদিও সেকেন্ড ফিরে।
অ্যান্ড্রু ফ্রান্স

5
@ 2 ক্যালড-বিশৃঙ্খলার উত্তরে প্রসারিত করতে, আপনার প্রয়োজনীয় দিনগুলি পাওয়ার জন্য (শেষ_ তারিখ - শুরু_ তারিখ) / 1.day, যা আপনাকে ভাসিয়ে দেবে। আপনি যদি পুরো দিনগুলি চান তবে কেবল আপনি ((শেষ_সীমা
ডেভিড কে।

2
@ ডেভিড ব্যতীত @ 2called-বিশৃঙ্খলা দ্বারা করা মন্তব্য ভুল করে Timeঅবজেক্টগুলিকে নয়, বস্তুর উল্লেখ করছে Date। সম্ভবত আপনি নিজের মন্তব্যে নামকরণ আপডেট করতে পারেন যে তারা তারিখ নয়?
অ্যান্ড্রু ফ্রান্স 21

109

ধরে নিই end_dateএবং start_dateএটি উভয় ActiveSupport::TimeWithZoneশ্রেণিরই কারাগারে রয়েছে তবে আপনি ব্যবহার করতে পারেন:

(end_date.to_date - start_date.to_date).to_i

2
যদি টেবিল ক্ষেত্রগুলির সাথে এটি করতে হয় তবে এই উত্তরটি যাওয়ার উপায়; এখানে সর্বাধিক রেট দেওয়া পরিবর্তে।
বেন

এর জন্য কাজ করে না (Time.zone.now.to_date - 23.hours.ago.to_date).to_i, এটি 1 দেয় এবং 0 হওয়া উচিত
ইউরি ঘেনসেভ

3
@ ইউরিঝেনসেভ, আপনি যখন আপনার উদাহরণ কোডটি চালাবেন তখন এটি নির্ভর করে, উদাহরণস্বরূপ এখন Time.zone.now.to_date"বুধ, 15 নভেম্বর 2017", যখন 23.hours.ago.to_date"মঙ্গল, 14 নভেম্বর 2017" প্রদান করবে। দিনের সংখ্যার পার্থক্য হ'ল এবং 1 হওয়া উচিত যদি না আপনি মধ্যরাতের আগের ঘন্টাটিতে আপনার কোডটি চালান।
লি

35

রেলগুলির সাহায্যকারীদের মধ্যে কিছু বিল্ট রয়েছে যা এটি আপনার জন্য সমাধান করতে পারে। একটি বিষয় মনে রাখবেন যে এটি অ্যাকশনভিউ হেল্পারদের অংশ, তাই তারা সরাসরি কনসোল থেকে উপলব্ধ হবে না।

এটা চেষ্টা কর

<% start_time =  "2012-03-02 14:46:21 +0100" %>
<% end_time   =  "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time)  %>

 "about 1 month"

@ মায়াননাভে যখন আপনার গণনার জন্য প্রকৃত সংখ্যা প্রয়োজন হয় তা হওয়া উচিত নয়।
ফেডকম্প

এই প্রশ্নটি সেই ক্ষেত্রে একটি যেখানে প্রশ্নটি নিজেই আলাদাভাবে জিজ্ঞাসা করা ভাল। আপনি যদি এখানে অন্যান্য উত্তরগুলি অনুসরণ করেন তবে আপনি এমন কেসগুলিতে ছুটে যাবেন যেখানে কখনও কখনও আপনি দিনের পরিবর্তে সপ্তাহ বা বছর দেখায়। এটি সত্যই "সঠিক" রেলের উত্তর হিসাবে গ্রহণ করা উচিত।
ডিলান পিয়ার্স

34

আমি সেকেন্ডে ফলাফল পেতে থাকি, সুতরাং এটি আমার পক্ষে কাজ করেছিল:

(Time.now - self.created_at) / 86400

1
@Epigene 1.dayনয় rubyযেমন ওপি (ট্যাগ) অনুরোধ করা হয়েছে। এটি Railsবা আরও সুনির্দিষ্ট active supportযদিও created_atমূলত এটির একটি Modelপদ্ধতি Rails..
রোকো

26

একটি সময়ের মধ্যে দিনের সংখ্যা পেতে (সমস্ত দিনের মাত্র একটি গণনা)

(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32

2 তারিখের মধ্যে দিনের সংখ্যা পেতে

(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31

এই @ a14m এর জন্য ধন্যবাদ! সম্মিলিত এবং একচেটিয়া তারিখ ক্যাপচারগুলি করার জন্য আমাকে একটি উপায় দিয়েছেন :)
ক্রিস বয়ড

18

পূর্ববর্তী উত্তরগুলির মধ্যে (এই তারিখে) দুটি তারিখের মধ্যে দিনের মধ্যে সঠিক পার্থক্য দেয় না।

নিকটতম যেটি আসে তা হ'ল entডাঙ্কেন্ট । একটি সম্পূর্ণ উত্তর রূপান্তর to_iএবং তারপর বিভক্ত হবে:

(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0

(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1

(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1

প্রশ্নের সুনির্দিষ্ট উদাহরণে, Dateসময়টি প্রাসঙ্গিক হলে পার্স করা উচিত নয় । Time.parseপরিবর্তে ব্যবহার করুন।


সময়গুলি ডিএসটি রূপান্তরকে এগিয়ে নিয়ে যাওয়ার সময় এটি প্রত্যাশার মতো কাজ করতে পারে না। এই ক্ষেত্রে, ডিএসটি ট্রানজিশনাল দিনের দৈর্ঘ্য বৈধভাবে 24 ঘন্টােরও কম, তবে পূর্ণসংখ্যার পাটিগণিতের কারণে সে দিনটি মোটেই প্রতিফলিত হবে না।
পিনিএম

4

দুটি তারিখের (পুরো DateTimeবস্তুর) মধ্যে পুরো দিনের সংখ্যা থাকা :

((end_at - start_at).to_f / 1.day).floor

ইউরি যে উত্তর দিয়েছে তা হিসাবে একই ডিএসটি ইস্যু। সময়ের সাথে পাটিগণিত কখনও প্রত্যাশার মতো সহজ সরল নয় :)
PinnyM

0

দুটি তারিখ দ্বারা দিনের পার্থক্য পেতে:

(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i

-8
def business_days_between(date1, date2)
  business_days = 0
  date = date2
  while date > date1
   business_days = business_days + 1 unless date.saturday? or date.sunday?
   date = date - 1.day
  end
  business_days
end

3
তারিখের অবজেক্টগুলি বিয়োগ করা অনেক সহজ।
ওপেন কোডারএক্স

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