การลบวันที่ของรูบี้ (เช่น 90 วันที่ผ่านมา)


89

ฉันรู้สึกแย่กับ joda-time API ของ:

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);

ฉันกำลังพยายามทำสิ่งที่คล้ายกันใน Ruby แต่ฉัน

now = Time.now
ninetyDaysAgo = now - (90*24)

อย่างไรก็ตามคณิตศาสตร์ปิดอยู่ที่นี่ (ฉันกำลังทำงานกับวันที่ตอนเที่ยงคืน)

มี API ที่เป็นมิตรสำหรับการลบวันที่หรือไม่?

คำตอบ:


107
require 'date'
now = Date.today
ninety_days_ago = (now - 90)

เรียกใช้สิ่งนี้ผ่านคอนโซล IRB ที่ฉันได้รับ:

>>require 'date'
now = Date.today
ninety_days_ago = (now - 90)

require 'date'
=> false
now = Date.today
=> #<Date: 2011-03-02 (4911245/2,0,2299161)>
ninety_days_ago = (now - 90)
=> #<Date: 2010-12-02 (4911065/2,0,2299161)>

หากคุณต้องการเวลาที่คุณสามารถพูดได้ now = DateTime.now


โพสต์เดิมของคุณการแก้ไขล่วงหน้าใกล้เคียงกับสิ่งที่ฉันต้องการมากกว่า แต่วันที่ตอนนี้ได้รับการคุ้มครอง Date.today ทำงาน ถ้าคุณเปลี่ยนการแจ้งเตือนครั้งแรกให้มีบรรทัด now = Date.today ฉันจะยอมรับมัน
darthtrevino

3
@ แมท: แล้วจะลบ 90 ชั่วโมงแทนวันได้อย่างไร?
Esteban Feldman

@EstebanFeldman ยังช่วยให้เศษส่วนเพื่อให้คุณสามารถทำDate Date.today - (90.0/24.0)ผลลัพธ์สามารถแปลงได้ง่ายto_datetimeหรือto_timeเกินไป
jchook

15

สำหรับผู้ที่ใช้ Rails โปรดดูสิ่งต่อไปนี้:

DateTime.now - 10.days
=> Sat, 04 May 2013 12:12:07 +0300

20.days.ago - 10.days
=> Sun, 14 Apr 2013 09:12:13 UTC +00:00

10

หากคุณใช้ Rails หรือไม่สนใจที่จะรวม ActiveSupport คุณสามารถใช้DSL แบบตัวเลข # วันดังนี้:

ruby-1.9.2-p136 :002 > Date.today
 => Wed, 02 Mar 2011 
ruby-1.9.2-p136 :003 > Date.today - 90.days
 => Thu, 02 Dec 2010 

เนื่องจากคุณกำลังทำงานกับวันที่แทนที่จะใช้เวลาคุณควรเริ่มต้นด้วยอินสแตนซ์ Date หรือแปลงอินสแตนซ์ DateTime ของคุณด้วย #to_date เมื่อเพิ่ม / ลบตัวเลขจากอินสแตนซ์วันที่ตัวเลขจะเป็นวันโดยปริยาย

ruby-1.9.2-p136 :016 > DateTime.now.to_date
 => #<Date: 2011-03-02 (4911245/2,0,2299161)> 
ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90
 => #<Date: 2010-12-02 (4911065/2,0,2299161)> 

8

Ruby รองรับการคำนวณวันที่ในคลาส Date และ DateTimeซึ่งเป็นส่วนหนึ่งของไลบรารีมาตรฐานของ Ruby ทั้งคลาสเหล่านั้นจะแสดงวิธีการ# +และ#ซึ่งจะบวกและลบวันจากวันที่หรือเวลา

$ irb
 > require 'date'
 => true 
 > (DateTime.new(2015,4,1) - 90).to_s  # Apr 1, 2015 - 90 days
 => "2015-01-01T00:00:00+00:00"
 > (DateTime.new(2015,4,1) - 1).to_s   # Apr 1, 2015 - 1 day
 => "2015-03-31T00:00:00+00:00" 

ใช้วิธีการ# <<และ# >>เพื่อดำเนินการเป็นเดือนแทนที่จะเป็นวัน เลขคณิตในเดือนจะแตกต่างจากเลขคณิตในวันเล็กน้อย การใช้ Date แทน DateTime ทำให้เอฟเฟกต์ชัดเจนยิ่งขึ้น

 > (Date.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
 => "2015-02-28" 

ตามตัวอย่าง joda-time ของคุณคุณอาจเขียนสิ่งนี้ใน Ruby

now =  DateTime.now
ninety_days_ago = now - 90

หรืออาจจะแค่

ninety_days_ago = DateTime.now - 90

5

นี่คือการโพสต์เก่าสุด แต่ถ้าคุณอยากให้มีTimeวัตถุเช่นถูกถามเดิมมากกว่าการเปลี่ยนเป็นวัตถุที่คุณอาจต้องการที่จะพิจารณาการใช้DateRuby Facets

Ruby Facets เป็นไลบรารีส่วนขยายมาตรฐานสำหรับคลาส Ruby หลัก

http://rubyworks.github.io/facets/

เมื่อต้องการ Facets คุณสามารถทำสิ่งต่อไปนี้กับวัตถุ Time ได้

Time.now.less(90, :days)


โครงการนี้ไม่ได้รับการอัปเดตเป็นเวลาสองปีแล้วและได้เปิดประเด็นด้วยความคิดเห็นเดียว มันตายแล้ว.
user4674453

@ user4674453 อัปเดตล่าสุดเมื่อหกเดือนที่แล้ว เป็นไลบรารีที่เสถียรซึ่งยังคงใช้งานได้กับ Ruby เวอร์ชันล่าสุด ไม่จำเป็นต้องอัปเดตโค้ดเบสทั้งหมดทุกวันเพื่อที่จะไม่ถือว่า "ตาย"
bigtunacan


-1

วิธีง่ายๆ:

days90_ago = 90.days.ago.to_date.to_s

OUTPUT:
puts 90_days_ago
=> "2019-10-09" # considering cur_date: 2020-01-07

กำลังใช้ ActiveSupport (Rails)
Espen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.