रूबी दिनांक घटाव (जैसे 90 दिन पहले)


89

मैं joda-time API से थोड़ा खराब हो गया हूँ:

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

मैं रूबी में एक समान काम करने की कोशिश कर रहा हूं, लेकिन मैं हूं

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

हालांकि, गणित यहां बंद है (मैं आधी रात को तारीखों के साथ काम कर रहा हूं)।

क्या तारीख घटाने के लिए अनुकूल एपीआई है?

जवाबों:


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

आईआरबी कंसोल के माध्यम से मुझे यह मिल रहा है:

>>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.Now सुरक्षित थी। Date.today ने काम किया। यदि आप अपने पहले ब्लर को अब लाइन = Date.today में बदलते हैं, तो मैं इसे स्वीकार करूंगा।
darthtrevino

3
@ मैट: और दिनों के बजाय 90 घंटे कैसे घटाएं?
एस्टेबन फेल्डमैन

@EstebanFeldman Dateभी भिन्नों की अनुमति देता है ताकि आप कर सकें Date.today - (90.0/24.0)। परिणाम आसानी से to_datetimeया to_timeभी परिवर्तित किया जा सकता है।
jchook

15

रेल का उपयोग करने वालों के लिए, निम्नलिखित देखें:

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 

चूंकि आप समय के बजाय तारीखों के साथ काम कर रहे हैं, इसलिए आपको या तो दिनांक उदाहरणों के साथ शुरू करना चाहिए, या #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

रूबी डेट और डेटटाइम कक्षाओं में तिथि अंकगणित का समर्थन करती है , जो रूबी के मानक पुस्तकालय का हिस्सा हैं। वे दोनों वर्ग # + और # - विधियों को उजागर करते हैं, जो किसी तिथि या समय से दिनों को जोड़ते और घटाते हैं।

$ 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.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
 => "2015-02-28" 

अपने जॉडा-टाइम उदाहरण के बाद, आप रूबी में कुछ इस तरह लिख सकते हैं।

now =  DateTime.now
ninety_days_ago = now - 90

या शायद बस

ninety_days_ago = DateTime.now - 90

5

यह एक सुपर पुरानी पोस्ट है, लेकिन अगर आप किसी Timeऑब्जेक्ट के साथ रखना चाहते हैं , जैसे कि मूल रूप से पूछा गया था, तो किसी Dateऑब्जेक्ट पर स्विच करने के बजाय आप उपयोग करने पर विचार कर सकते हैं Ruby Facets

रूबी पहलुओं कोर रूबी वर्गों के लिए विस्तार का एक मानकीकृत पुस्तकालय है।

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

पहलुओं की आवश्यकता के बाद आप समय वस्तुओं के साथ निम्नलिखित कर सकते हैं।

Time.now.less(90, :days)


इस परियोजना को दो साल के लिए अद्यतन नहीं किया गया है और एक टिप्पणी के साथ मुद्दों को खोला है। यह मर चुका है।
user4674453

@ user4674453 अंतिम अद्यतन छह महीने पहले था। यह एक स्थिर पुस्तकालय है जो अभी भी रूबी के नवीनतम संस्करण के साथ काम करता है। "मृत" न समझे जाने के लिए सभी कोडबेस को प्रतिदिन अपडेट करने की आवश्यकता नहीं है।
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 (रेल) का उपयोग कर रहा है।
एस्पेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.