রেলের অন রুবেলে দুটি তারিখের মধ্যে মাসের সন্ধান করুন


95

আমার কাছে দু'জন রুবি রেলস ডেটটাইম অবজেক্টে রয়েছে। তাদের মধ্যে মাসের সংখ্যাটি কীভাবে সন্ধান করবেন? (তারা বিভিন্ন বছরের অন্তর্গত হতে পারে তা মাথায় রেখে)


4
এখানে জিজ্ঞাসা করা হয়েছিল এবং উত্তর দেওয়া হয়েছিল: stackoverflow.com/questions/5887756/…
টিম বাশ

এটা ইশারা জন্য ধন্যবাদ. আমি অনুসন্ধান করেছি কিন্তু তাতে হোঁচট খেয়েছি না।
ফিনিক্সউইজার্ড

এই লিঙ্কটি দেখুন stackoverflow.com/questions/1065320/…
sangeethkumar

আমি বরং সংখ্যায় লিঙ্কটি চাই। আমি ম্যাসিমিলিয়ানো
পেলুসো

কেবল আমি এটি আপনার রেফারেন্সের জন্য দিয়েছি .. যাইহোক ধন্যবাদ ..
সংজিৎকুমার

উত্তর:


182
(date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)

http://www.ruby-forum.com/topic/72120 এ আরও তথ্য


25
এই সমাধান দিন বিবেচনা করে না। 28/4/2000 এবং 1/5/2000 এর মধ্যে মাসের সংখ্যা 1 মাস নয়, তবে 0
ডিগিল্পেরেজ

15
দিনগুলি বিবেচনা না করে আমার একটি দরকার তাই এটি আমার পক্ষে কাজ করে। +1
ওয়াটসআইনাবক্স

4
এই দুর্দান্ত উত্তরের জন্য আরও একটি বৈকল্পিক:(12 * (date2.year - date1.year) + date2.month - date1.month).abs if date1 && date2
স্টেপান জখারভ

যদি আমরা 2 বছরের মধ্যে অর্থাৎ 2017-05-20 থেকে 2018-05-22 মাসের মধ্যে মাস আনার চেষ্টা করি তবে এটি মাসের ভুল দেখাচ্ছে। আউটপুটটি 1 মাস দেখায়।
কৌতুহল বিকাশকারী

4
সঠিক মাসের অর্থাত্ @CuriousDeveloper এটা দেখানো হয় 12
TS

40

আরও সঠিক উত্তরটি দূরত্বের দিনগুলি বিবেচনা করবে।

উদাহরণস্বরূপ, আপনি যদি বিবেচনা করেন যে মাসের দূরত্বটি তার থেকে 28/4/2000এবং 1/5/2000এর 0চেয়ে বেশি হয় 1তবে আপনি ব্যবহার করতে পারেন:

(date2.year - date1.year) * 12 + date2.month - date1.month - (date2.day >= date1.day ? 0 : 1)

4
উদাহরণস্বরূপ, কেউ তার বেতন সর্বদা মাসের
ম্যাথিয়াস

15

চেষ্টা করুন

((date2.to_time - date1.to_time)/1.month.second).to_i

irb>Time.at("2014-10-01".to_time - "2014-12-01".to_time).month => 10 (আমি ফর্ম্যাটিং ছেড়ে দিয়েছি ... এটি অনুমান করতে পারছি না)
টবি জয়েনার

এমনকি আপনি তারিখ অবজেক্টটি ব্যবহার করলেও @ টোবি-জয়েন্টারের মন্তব্য এখনও সঠিক হবে। কারণটি হ'ল <অক্টোবর> - <ডিসেম্বর> -২ মাস, তবে সময় ডট (-২ মাস) monমাসটি মাসে -2 এর সমতুল্য দেয় (যেমন -2% 12 # => 10)) আপনার প্রস্তাবিত পদ্ধতিটি কার্যকর হবে যদি দুই মাস একে অপরকে অনুসরণ করে এবং এক বছরেরও কম সময় বাদে থাকে তবে দু'মাস যদি বিপরীত ক্রমে থাকে (যেমন অক্টোবর - ডিসেম্বর) বা দুই মাস এক বছরের বেশি সময় ব্যয় হয় তবে তা ব্যর্থ হবে।
elreimundo

4
আমি এর পেছনের ধারণাটি পছন্দ করি তবে ডেটস্প্যানটি যদি সত্যিই দীর্ঘ হয় তবে এটি ভুল is আমার উদাহরণে Date.new(2014, 10, 31), Date.new(1997, 4, 30)আমি 210 মাসের পরিবর্তে 213 পেয়েছি। এর কারণ 1.month.secondsহ'ল 30 দিনের মধ্যে সেকেন্ডের সংখ্যা এবং এক মাসে গড় সেকেন্ড নয়। ডাউনভোটিং যাতে অন্যরা বাগ-মুক্ত থাকে।
জো এফের্ট

4
এই অভ্যস্ত কাজ এক মাসে 30 দিনের নয় নির্বাচন হলে
Dima

4
এই পদ্ধতিটি খুব সঠিক নয়।
ভবঘুরে

9

আপনি "তারিখের মাসের শুরুতে কত প্রথম দিন রয়েছে" হিসাবে এই প্রশ্নটি পুনরায় লিখে দিতে পারেন এবং তারপরে ক্রিয়ামূলক-স্টাইলের ডেটা ট্রান্সফর্মেশনগুলি ব্যবহার করতে পারেন:

(date1.beginning_of_month...date2.beginning_of_month).select { |date| date.day == 1 }.size

এবং আসল প্রশ্নে ফিরে আসতে, আপনি দিনগুলি যোগ করতে পারেন (যেমন আপনি প্রথমটির সাথে করছেন) এবং পরিমাণের গড় নিতে পারেন।
জো এফের্ট

9

ধরে নেওয়া উভয় তারিখ: ((date2 - date1).to_f / 365 * 12).round সাধারণ।


খুব সুন্দর সমাধান! পরিষ্কার, সহজ এবং এমনকি সারা বছর জুড়ে কাজ করে - যেমন ফেব্রুয়ারী 2018 এবং ডিসেম্বর 2017 এর মধ্যে মাসের পরিসীমা
জেফডিল

4
অ্যাকাউন্টে ঘন্টা, মিনিট এবং সেকেন্ড নেওয়ার প্রয়োজন ((date2 - date1).to_f / 60 / 60 / 24 / 365 * 12).round
স্কার্ভার

4
@ স্কার্ভার 2 আপনার গণনা থেকে আপনি যে নম্বর পেয়েছেন তা বন্ধ। আমরা যা কিছু করছি তা দিন সময় নিচ্ছে এবং সেগুলিকে মাসগুলিতে রূপান্তর করা, এটি অত্যন্ত সঠিক নয় কারণ এটি প্রতিমাসে 30.4167 দিন অনুমান করে তবে এটি খুব কাছাকাছি এবং তারপরে যাইহোক এটি গোল হয়।
Andreykul


2

আপনি যে ফলাফলটি এক মাসের ভগ্নাংশ অন্তর্ভুক্ত করতে চান তা যদি খুঁজে পেয়েছি (ইতিমধ্যে এখানে পোস্ট করা একটি সমাধান তৈরি করেছেন) এর জন্য অন্য একটি সমাধান উদাহরণস্বরূপ দূরত্ব 1.2 months

((date2.to_time - date1.to_time)/1.month.second).round(1) #Tenth of a month Ex: 1.2
((date2.to_time - date1.to_time)/1.month.second).round(2) #Hundreth, ex: 1.23 months
etc...

4
মেঝে সঙ্গে বৃত্তাকার raplacing চেষ্টা যদি ইচ্ছা পোষণ করি শুধুমাত্র সেগুলিই দেখায় মাসের আসলে অতিপন্ন
ম্যাথিয়াস

2
def difference_in_months(date1, date2)
  month_count = (date2.year == date1.year) ? (date2.month - date1.month) : (12 - date1.month + date2.month)
  month_count = (date2.year == date1.year) ? (month_count + 1) : (((date2.year - date1.year - 1 ) * 12) + (month_count + 1))
  month_count
end

4
আপনি যদি এই বিষয়ে বিস্তারিত বলতে পারেন তবে এটি কার্যকর হবে? সাধারণত এসও জবাবগুলিতে কোড কী করে এবং এটি কেন সমাধান হিসাবে কাজ করে সে সম্পর্কে একটি ব্যাখ্যা অন্তর্ভুক্ত রয়েছে
একক সত্তা

1

আমার দুটি তারিখের মধ্যে মাসের সঠিক সংখ্যা (দশমিক সহ) প্রয়োজন এবং এর জন্য নিম্নলিখিত পদ্ধতিটি লিখেছি।

def months_difference(period_start, period_end)
  period_end = period_end + 1.day
  months = (period_end.year - period_start.year) * 12 + period_end.month - period_start.month - (period_end.day >= period_start.day ? 0 : 1)
  remains = period_end - (period_start + months.month)

  (months + remains/period_end.end_of_month.day).to_f.round(2)
end

যদি তুলনা করা যাক 26 শে সেপ্টেম্বর থেকে 26 শে সেপ্টেম্বর পর্যন্ত (একই দিন) আমি এটিকে 1 দিন হিসাবে গণনা করি। আপনার যদি প্রয়োজন না হয় তবে আপনি পদ্ধতিটিতে প্রথম লাইনটি সরিয়ে ফেলতে পারেন:period_end = period_end + 1.day

এটি নিম্নলিখিত চশমা পাস:

expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 31))).to eq 1.0
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 30))).to eq 0.97
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 10, 31))).to eq 3.0
# Overlapping february (28 days) still counts Feb as a full month
expect(months_difference(Date.new(2017, 1, 1), Date.new(2017, 3, 31))).to eq 3.0
expect(months_difference(Date.new(2017, 2, 10), Date.new(2017, 3, 9))).to eq 1.0
# Leap year
expect(months_difference(Date.new(2016, 2, 1), Date.new(2016, 2, 29))).to eq 1.0

বিটিডব্লিউ এটি রেলের 'অ্যাক্টিভসপোর্ট
14

1

এখানে হিংস্র জোর করে বৈকল্পিক:

date1 = '2016-01-05'.to_date
date2 = '2017-02-27'.to_date
months = 0

months += 1 while (date2 << (count+1)) >= date1
puts months # => 13

date2 সর্বদা এর চেয়ে বড় হতে হবে date1


0

এখানে অন্য পদ্ধতি। এটি দুটি তারিখের মধ্যে পুরো মাসের সংখ্যা গণনা করতে সহায়তা করবে

def months_difference(date_time_start, date_time_end)
  curr_months = 0
  while (date_time_start + curr_months.months) < date_time_end
    curr_months += 1
  end
  curr_months -= 1 if (date_time_start + curr_months.months) > date_time_end
  curr_months.negative? ? 0 : curr_months
end

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