ฉันจะค้นหาจำนวนวันระหว่างวันที่สองวัตถุในทับทิมได้อย่างไร


คำตอบ:


170

ลบวันที่เริ่มต้นจากวันที่สิ้นสุด:

endDate - beginDate 

2
คิดว่าคุณหมายถึงลบวันที่เริ่มต้นจากวันที่สิ้นสุด :)
Nader

99
ชนิดของการ anticlimactic ใช่มั้ย
Brig

18
หมายเหตุ: หากคุณใช้ Wirble ใน irb (เพื่อทำให้สีของภาพออก) จำนวนตรรกยะจะมี 1 ตัวต่อกันจนจบ อ๊ะ! คุณอาจต้องการใช้ to_i เพื่อแปลงผลลัพธ์ให้เป็นจำนวนเต็ม
jwal

9
หากคุณมีDateTimeวัตถุต้องแน่ใจว่าได้แปลงเป็นDateอันดับแรกมิฉะนั้นจะคืนค่าจำนวนวินาที (ฉันเดา)
Joshua Muheim

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

สิ่งนี้ใช้หมายเลขจูเลียนที่แก้ไขแล้ว

จากวิกิพีเดีย :

Julian date (JD) เป็นช่วงเวลาเป็นวันและเศษส่วนของวันตั้งแต่ 1 มกราคม 4713 BC Greenwich เที่ยงปฏิทิน Julian Proleptic


53

สิ่งนี้อาจมีการเปลี่ยนแปลงใน Ruby 2.0

เมื่อฉันทำสิ่งนี้ฉันจะได้รับเศษส่วน ตัวอย่างเช่นบนคอนโซล (ทั้ง irb หรือ rails c)

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 

นอกจากนี้ยังใช้งานได้กับวัตถุ DateTime แต่คุณต้องพิจารณาวินาทีเช่นตัวอย่าง

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

ใน Ruby 2.1.3 มีการเปลี่ยนแปลง:

> 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

The Range เป็นชุดของ serials ที่ไม่ซ้ำกัน และ...เป็นช่วงตัวอักษรพิเศษ

ดังนั้นbeginDate..(endDate - 1)จะเหมือนกัน ยกเว้นจะไม่

ในกรณีที่startDateเท่ากับendDateองค์ประกอบแรกจะถูกแยกออกเพราะไม่ซ้ำกันและ...จะแยกองค์ประกอบสุดท้าย ดังนั้นถ้าเราต้องการ.countเดทระหว่างวันนี้และวันนี้มันจะคืนค่า 0


นี่เป็นคำตอบที่ดีมากหากการเริ่มต้นวันที่เก่ากว่าสิ้นสุดวันที่มันจะกลับมา0ซึ่งจะทำงานได้อย่างสมบูรณ์ในบางกรณี นอกจากนี้หากทั้งสองวันเหมือนกันก็จะกลับเป็น 0 และยังส่งกลับจำนวนเต็มธรรมดา คำตอบอื่น ๆ จะต้องถูกแปลงเป็นจำนวนเต็มหรือคุณอาจต้องแปลเป็น 0 หากผลลัพธ์เป็นลบ
EmmanuelB



6

สิ่งเหล่านี้นำพาฉันไปสู่ผลลัพธ์ที่ถูกต้อง แต่ฉันก็ทำไป

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

หนึ่งชิ้นอาหารอันโอชะที่จะชี้ให้เห็น: DateTime.parse ใน Ruby คาดว่าวันที่จะได้รับเป็น DD / MM / YYYY หรือ DD-MM-YYYY ในฐานะที่เป็นคนอเมริกันมันมักจะทิ้งฉัน!
rickumali

15
@rickumali ในฐานะสมาชิกจากทั่วโลกฉันขอขอบคุณ Ruby ที่ใช้รูปแบบวันที่เริ่มต้น "ของเรา"
Claudio Holanda

7
@rickumali Ruby ยอมรับวันที่ในYYYY-MM-DDรูปแบบด้วยซึ่งเป็นสิ่งที่ทุกคนควรใช้
user513951

1

วัน = (สิ้นสุดวันที่ - วันเริ่มต้น) / (60 * 60 * 24)


5
วันที่เป็นวันดังนั้นคุณไม่จำเป็นต้องทำเช่นนี้ ฉันคิดว่าโซลูชันของคุณเกี่ยวข้องกับความแตกต่างของ DateTime
suga_shane

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.