मेरे पास एक स्ट्रिंग है: "31-02-2010"और यह जांचना चाहते हैं कि यह वैध तारीख है या नहीं। यह करने के लिए सबसे अच्छा तरीका क्या है?
मुझे एक ऐसी विधि की आवश्यकता है, जो अगर स्ट्रिंग वैध तिथि है और यदि यह नहीं है तो यह सही है।
मेरे पास एक स्ट्रिंग है: "31-02-2010"और यह जांचना चाहते हैं कि यह वैध तारीख है या नहीं। यह करने के लिए सबसे अच्छा तरीका क्या है?
मुझे एक ऐसी विधि की आवश्यकता है, जो अगर स्ट्रिंग वैध तिथि है और यदि यह नहीं है तो यह सही है।
जवाबों:
require 'date'
begin
Date.parse("31-02-2010")
rescue ArgumentError
# handle invalid date
end
यहाँ एक सरल एक लाइनर है:
DateTime.parse date rescue nil
मैं शायद वास्तविक जीवन में हर स्थिति में ऐसा करने की सिफारिश नहीं करूंगा क्योंकि आप कॉल करने वाले को शून्य की जांच करने के लिए मजबूर करते हैं, उदाहरण के लिए। खासकर जब स्वरूपण। यदि आप एक डिफ़ॉल्ट दिनांक लौटाते हैं। त्रुटि यह मित्रता हो सकती है।
Date.strptime(date, '%d/%m/%Y') rescue nil
rescueका उपयोग हतोत्साहित किया जाता है।
d, m, y = date_string.split '-'
Date.valid_date? y.to_i, m.to_i, d.to_i
is_valid?? 1.8, 2.0 और 2.1 की कोशिश की। उनमें से किसी को भी ऐसा नहीं लगता है। सभी को लगता है valid_date?, यद्यपि।
पार्सिंग तिथियां कुछ गोचरों में चल सकती हैं, खासकर जब वे एमएम / डीडी / वाईवाईवाईवाई या डीडी / एमएम / वाईवाईवाईवाई प्रारूप में होते हैं, जैसे कि यूएस या यूरोप में उपयोग की जाने वाली छोटी तिथियां।
Date#parse यह पता लगाने का प्रयास किया जाता है कि किसका उपयोग करना है, लेकिन पूरे वर्ष में एक महीने में कई दिन होते हैं जब प्रारूपों के बीच अस्पष्टता पार्स समस्याओं का कारण बन सकती है।
मैं यह पता लगाने की सलाह दूंगा कि उपयोगकर्ता का LOCALE क्या है, फिर, उसके आधार पर, आप जानेंगे कि कैसे समझदारी से उपयोग किया जाए Date.strptime। उपयोगकर्ता कहाँ स्थित है, यह पता लगाने का सबसे अच्छा तरीका है कि साइन-अप के दौरान उनसे पूछें, और फिर इसे बदलने के लिए उनकी प्राथमिकताओं में एक सेटिंग प्रदान करें। यह मानते हुए कि आप इसे कुछ चतुर विधर्मियों द्वारा खोद सकते हैं और उपयोगकर्ता को उस जानकारी के लिए परेशान नहीं कर सकते, असफलता का खतरा है।
यह एक परीक्षण है Date.parse। मैं अमेरिका में हूँ:
>> Date.parse('01/31/2001')
ArgumentError: invalid date
>> Date.parse('31/01/2001') #=> #<Date: 2001-01-31 (4903881/2,0,2299161)>
पहले अमेरिका के लिए सही प्रारूप था: मिमी / डीडी / yyyy, लेकिन दिनांक इसे पसंद नहीं था। दूसरा यूरोप के लिए सही था, लेकिन यदि आपके ग्राहक मुख्य रूप से यूएस-आधारित हैं, तो आपको बहुत खराब तारीखें मिलेंगी।
रूबी का Date.strptimeउपयोग इस तरह किया जाता है:
>> Date.strptime('12/31/2001', '%m/%d/%Y') #=> #<Date: 2001-12-31 (4904549/2,0,2299161)>
01/01/2014, तो कौन सा महीना है और कौन सा दिन है? अमेरिकी महीने में पहला होगा, बाकी दुनिया में यह दूसरा होगा।
Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
require "date"पहले या "अपरिभाषित विधि" प्राप्त करनी होगी।
Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
मैं Dateकक्षा का विस्तार करना चाहता हूं ।
class Date
def self.parsable?(string)
begin
parse(string)
true
rescue ArgumentError
false
end
end
end
Date.parsable?("10-10-2010")
# => true
Date.parse("10-10-2010")
# => Sun, 10 Oct 2010
Date.parsable?("1")
# => false
Date.parse("1")
# ArgumentError: invalid date from (pry):106:in `parse'
दिनांक मान्य करने का दूसरा तरीका:
date_hash = Date._parse(date.to_s)
Date.valid_date?(date_hash[:year].to_i,
date_hash[:mon].to_i,
date_hash[:mday].to_i)
सभी तिथियों के लिए regex आज़माएं:
/(\d{1,2}[-\/]\d{1,2}[-\/]\d{4})|(\d{4}[-\/]\d{1,2}[-\/]\d{1,2})/.match("31-02-2010")
अग्रणी शून्य के साथ केवल आपके प्रारूप के लिए, वर्ष अंतिम और डैश:
/(\d{2}-\d{2}-\d{4})/.match("31-02-2010")
[- /] का अर्थ है - या /, फॉरवर्ड स्लैश से बच जाना चाहिए। आप इस पर परीक्षण कर सकते हैं http://gskinner.com/RegExr/
निम्नलिखित पंक्तियों को जोड़ दें, वे सभी हाइलाइट होंगे यदि आप पहली रेगेक्स का उपयोग करते हैं, बिना पहले और अंतिम / (वे माणिक कोड में उपयोग के लिए हैं)।
2004-02-01
2004/02/01
01-02-2004
1-2-2004
2004-2-1
32-13-2010गलत है।
'00/00/0000'और '99-99/9999'संभावित उम्मीदवार हैं।
यदि आप अपेक्षित तारीख प्रारूप को निर्दिष्ट करते हैं, तो किसी तिथि की शुद्धता को सत्यापित करना आसान है। हालांकि, तब भी, रूबी मेरे उपयोग के मामले के लिए थोड़ा सहनशील है:
Date.parse("Tue, 2017-01-17", "%a, %Y-%m-%d") # works
Date.parse("Wed, 2017-01-17", "%a, %Y-%m-%d") # works - !?
स्पष्ट रूप से, इनमें से कम से कम एक तार गलत कार्यदिवस को निर्दिष्ट करता है, लेकिन रूबी खुशी से नजरअंदाज कर देती है।
यहाँ एक विधि है जो नहीं करता है; यह पुष्टि date.strftime(format)करता है कि यह उसी इनपुट स्ट्रिंग में परिवर्तित होता है, जिसके Date.strptimeअनुसार इसे पार्स किया गया था format।
module StrictDateParsing
# If given "Tue, 2017-01-17" and "%a, %Y-%m-%d", will return the parsed date.
# If given "Wed, 2017-01-17" and "%a, %Y-%m-%d", will error because that's not
# a Wednesday.
def self.parse(input_string, format)
date = Date.strptime(input_string, format)
confirmation = date.strftime(format)
if confirmation == input_string
date
else
fail InvalidDate.new(
"'#{input_string}' parsed as '#{format}' is inconsistent (eg, weekday doesn't match date)"
)
end
end
InvalidDate = Class.new(RuntimeError)
end
Date.today().iso8601); %mशून्य-गद्देदार है। यदि आप कुछ अलग चाहते हैं, तो ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…
इसे पोस्ट करना क्योंकि यह बाद में किसी के लिए उपयोग हो सकता है। कोई सुराग नहीं अगर यह करने के लिए एक "अच्छा" तरीका है या नहीं, लेकिन यह मेरे लिए काम करता है और विस्तार योग्य है।
class String
def is_date?
temp = self.gsub(/[-.\/]/, '')
['%m%d%Y','%m%d%y','%M%D%Y','%M%D%y'].each do |f|
begin
return true if Date.strptime(temp, f)
rescue
#do nothing
end
end
return false
end
end
स्ट्रिंग क्लास के लिए यह ऐड-ऑन आपको लाइन 4 में डेलिमेटर्स की अपनी सूची और फिर लाइन 5 में मान्य प्रारूपों की आपकी सूची को निर्दिष्ट करने देता है। रॉकेट साइंस नहीं, लेकिन यह वास्तव में विस्तार करना आसान बनाता है और आपको बस एक स्ट्रिंग की जांच करने देता है:
"test".is_date?
"10-12-2010".is_date?
params[:some_field].is_date?
etc.
require 'date'
#new_date and old_date should be String
# Note we need a ()
def time_between(new_date, old_date)
new_date = (Date.parse new_date rescue nil)
old_date = (Date.parse old_date rescue nil)
return nil if new_date.nil? || old_date.nil?
(new_date - old_date).to_i
end
puts time_between(1,2).nil?
#=> true
puts time_between(Time.now.to_s,Time.now.to_s).nil?
#=> false
आप निम्नलिखित कोशिश कर सकते हैं, जो सरल तरीका है:
"31-02-2010".try(:to_date)
लेकिन आपको अपवाद को संभालने की आवश्यकता है।
दिनांक.इस उदाहरण के लिए अपवाद नहीं उठाया गया:
Date.parse("12!12*2012")
=> Thu, 12 Apr 2018
Date.parse("12!12&2012")
=> Thu, 12 Apr 2018
मैं इस समाधान को पसंद करता हूं:
Date.parse("12!12*2012".gsub(/[^\d,\.,\-]/, ''))
=> ArgumentError: invalid date
Date.parse("12-12-2012".gsub(/[^\d,\.,\-]/, ''))
=> Wed, 12 Dec 2012
Date.parse("12.12.2012".gsub(/[^\d,\.,\-]/, ''))
=> Wed, 12 Dec 2012
तरीका:
require 'date'
def is_date_valid?(d)
Date.valid_date? *"#{Date.strptime(d,"%m/%d/%Y")}".split('-').map(&:to_i) rescue nil
end
उपयोग:
config[:dates].split(",").all? { |x| is_date_valid?(x)}
यह सच है या गलत है अगर विन्यास [: दिनांक] = "12/10 / 2012,05 / 09/1520"