রুবিতে দুটি তারিখের অবজেক্টের মধ্যে আমি কীভাবে দিনের সংখ্যা জানতে পারি?


141

দুটি তারিখের অবজেক্টের মধ্যে আমি কীভাবে দিনের সংখ্যা জানতে পারি?

উত্তর:


170

প্রারম্ভের তারিখটি শেষ তারিখ থেকে বিয়োগ করুন:

endDate - beginDate 

2
মনে হয় আপনার শেষের তারিখ থেকে শুরু করার তারিখটি বিয়োগফল :)
নাদের

99
এন্টিক্লিম্যাকটিক এহ?
ব্রিগ

18
দ্রষ্টব্য: আপনি যদি ভেরিবলকে আইআরবিতে ব্যবহার করছেন (আউটপুট রঙিন করতে) যুক্তিযুক্ত সংখ্যার শেষে একটি 1 যুক্ত হবে। বাবা! আপনি ফলাফলটিকে পূর্ণসংখ্যায় রূপান্তর করতে to_i ব্যবহার করতে চাইতে পারেন
jwal

9
আপনার যদি কোনও DateTimeঅবজেক্ট থাকে তবে Dateপ্রথমে রূপান্তর করতে ভুলবেন না, তা না হলে এটি সেকেন্ডের সংখ্যা ফিরে আসে (আমার ধারণা)।
জোশুয়া মুহিম

44
দুটি Dateবিষয়বস্তু বিয়োগ Rationalকরা আপনাকে একটি পূর্ণসংখ্যায় টাইপকাস্ট করার প্রয়োজন হতে পারে তা নোট করুন(endDate - beginDate).to_i
MusikAnimal

98
irb(main):005:0> a = Date.parse("12/1/2010")
=> #<Date: 4911063/2,0,2299161>

irb(main):007:0> b = Date.parse("12/21/2010")
=> #<Date: 4911103/2,0,2299161>

irb(main):016:0> c = b.mjd - a.mjd
=> 20

এটি একটি পরিবর্তিত জুলিয়ান ডে নম্বর ব্যবহার করে

উইকিপিডিয়া থেকে :

জুলিয়ান তারিখ (জেডি) হ'ল খ্রিস্টপূর্ব 1 জানুয়ারী, 4713 খ্রিস্টাব্দ থেকে গ্রীনউইচ দুপুর, জুলিয়ান প্রলেপটিক ক্যালেন্ডার থেকে দিনের এবং দিনের একটি সময়ের ব্যবধান।


53

এটি রুবি ২.০ এ পরিবর্তিত হতে পারে

যখন আমি এটি করি আমি একটি ভগ্নাংশ পাই। কনসোলে উদাহরণস্বরূপ (হয় আইআরবি বা রেল গ)

2.0.0-p195 :005 > require 'date'
 => true 
2.0.0-p195 :006 >  a_date = Date.parse("25/12/2013")
 => #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)> 
2.0.0-p195 :007 >  b_date = Date.parse("10/12/2013")
 => #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)> 
2.0.0-p195 :008 > a_date-b_date
 => (15/1) 

অবশ্যই, একটি পূর্বে কাস্টিং প্রত্যাশিত ফলাফল দেয়

2.0.0-p195 :009 > (a_date-b_date).to_i
 => 15 

এটি ডেটটাইম অবজেক্টগুলির জন্যও কাজ করে তবে আপনাকে এই উদাহরণ হিসাবে কয়েক সেকেন্ড বিবেচনা করতে হবে

2.0.0-p195 :017 >   a_date_time = DateTime.now
 => #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)> 
2.0.0-p195 :018 > b_date_time = DateTime.now-20
 => #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)> 
2.0.0-p195 :019 > a_date_time - b_date_time
 => (1727997655759/86400000000) 
2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
 => 19 
2.0.0-p195 :021 > c_date_time = a_date_time-20
 => #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)> 
2.0.0-p195 :022 > a_date_time - c_date_time
 => (20/1) 
2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
 => 20 

29

রুবিতে ২.১.৩ বিষয় পরিবর্তন হয়েছে:

> endDate = Date.new(2014, 1, 2)
 => #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)> 
> beginDate = Date.new(2014, 1, 1)
 => #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)> 
> days = endDate - beginDate
 => (1/1) 
> days.class
 => Rational 
> days.to_i
 => 1 

21

এ কেমন?

(beginDate...endDate).count

রেঞ্জটি অনন্য সিরিয়ালের একটি সেট। এবং ...একটি একচেটিয়া রেঞ্জ আক্ষরিক।

তাই beginDate..(endDate - 1)একই। ব্যতীত না।

কেস যখন beginDate সমান endDate , প্রথম উপাদান স্বতন্ত্রতা কারণে বাদ দেওয়া হবে এবং ...গত এক অগ্রাহ্য করবে। সুতরাং আমরা যদি .countআজ এবং আজকের মধ্যে তারিখগুলি করতে চাই তবে এটি 0 এ ফিরে আসবে।


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



6

এই সবগুলি আমাকে সঠিক ফলাফলের দিকে চালিত করেছে, কিন্তু আমি ক্ষতবিক্ষত করেছি

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd

একটি উল্লেখযোগ্য বিষয়: রুবিতে ডেটটাইম.পার্স আশা করে যে তারিখটি ডিডি / এমএম / ওয়াইওয়াই, বা ডিডি-এমএম-ওয়াইওয়াই হিসাবে দেওয়া হবে। আমেরিকান হিসাবে, এটি সর্বদা আমাকে ছুড়ে ফেলে!
রিকুমালী

15
@ ক্রিকুমালী বিশ্বের অন্য সদস্য হিসাবে, আমি "আমাদের" ডিফল্ট তারিখের ফর্ম্যাটটি ব্যবহার করার জন্য রুবিকে ধন্যবাদ জানাই।
ক্লাদিও হল্যান্ডা

7
@ ক্রিকুমালী রুবি YYYY-MM-DDফরম্যাটে তারিখটিও গ্রহণ করে , যাইহোক যেভাবেই প্রত্যেকেরই ব্যবহার করা উচিত।
ব্যবহারকারী513951

1

দিন = (শেষ তারিখ - আরম্ভের তারিখ) / (60 * 60 * 24)


5
তারিখ দিনের শর্তে, সুতরাং আপনার এটি করার দরকার নেই। আমি মনে করি আপনার সমাধান ডেটটাইম পার্থক্যের সাথে প্রাসঙ্গিক হয়ে ওঠে।
সুগা_শানে

1

ঠিক আছে, "মধ্যবর্তী" দ্বারা আপনি কী বোঝাতে চেয়েছেন তা যত্ন নিন ...

days_apart = (to - from).to_i     # from + days_apart = to
total_days = (to - from).to_i + 1 # number of "selected" days
in_between_days = (to - from).to_i - 1 # how many days are in between from and to, i.e. excluding those two days
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.