আমার একটি স্ট্রিং রয়েছে: "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)>
প্রথমটি ছিল মার্কিন যুক্তরাষ্ট্রে সঠিক ফর্ম্যাট: মিমি / ডিডি / ইয়ে, কিন্তু তারিখটি এটি পছন্দ করে না। দ্বিতীয়টি ইউরোপের পক্ষে সঠিক ছিল তবে আপনার গ্রাহকরা যদি মূলত মার্কিন-ভিত্তিক হন তবে আপনি প্রচুর খারাপভাবে পার্সড তারিখ পেয়ে যাবেন।
রুবি এর 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)
সমস্ত তারিখের জন্য রেজেক্স চেষ্টা করুন:
/(\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'
সম্ভাব্য প্রার্থীরা।
আপনি যে তারিখের ফর্ম্যাটটি প্রত্যাশা করেছেন তা নির্দিষ্ট করে যদি তারিখের সঠিকতা যাচাই করা সহজ easier তবে তারপরেও রুবি আমার ব্যবহারের ক্ষেত্রে কিছুটা সহনশীল:
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
এটি পোস্ট করা কারণ এটি পরে কারওর কাজে লাগতে পারে। এটি করার একটি "ভাল" উপায় যদি না হয় তবে কোনও চিহ্ন নেই, তবে এটি আমার পক্ষে কাজ করে এবং প্রসারিত is
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"