Saya punya string: "31-02-2010"
dan ingin memeriksa apakah itu tanggal yang valid atau tidak. Apa cara terbaik untuk melakukannya?
Saya membutuhkan metode yang mengembalikan nilai true jika string adalah tanggal yang valid dan salah jika tidak.
ruby-on-rails
ruby
string
date
Salil
sumber
sumber
Jawaban:
sumber
Berikut ini satu baris sederhana:
Saya mungkin tidak akan merekomendasikan melakukan hal ini persis dalam setiap situasi dalam kehidupan nyata karena Anda memaksa penelepon untuk memeriksa nihil, misalnya. terutama saat memformat. Jika Anda mengembalikan tanggal default | kesalahan itu mungkin lebih ramah.
sumber
Date.strptime(date, '%d/%m/%Y') rescue nil
rescue
tidak dianjurkan.sumber
is_valid?
? Mencoba 1.8, 2.0 dan 2.1. Tak satu pun dari mereka tampaknya memiliki yang itu. Semua tampaknya begituvalid_date?
.Tanggal parsing dapat mengalami beberapa gotcha, terutama jika dalam format MM / DD / YYYY atau DD / MM / YYYY, seperti tanggal pendek yang digunakan di AS atau Eropa.
Date#parse
mencoba untuk mencari tahu mana yang akan digunakan, tetapi ada banyak hari dalam sebulan sepanjang tahun ketika ambiguitas antar format dapat menyebabkan masalah penguraian.Saya akan merekomendasikan mencari tahu apa itu LOCALE pengguna, kemudian, berdasarkan itu, Anda akan tahu cara parsing menggunakan secara cerdas
Date.strptime
. Cara terbaik untuk menemukan di mana pengguna berada adalah dengan bertanya kepada mereka saat mendaftar, dan kemudian memberikan pengaturan dalam preferensi mereka untuk mengubahnya. Dengan asumsi Anda dapat menggalinya dengan beberapa heuristik pintar dan tidak mengganggu pengguna untuk informasi itu, rentan terhadap kegagalan jadi tanyakan saja.Ini adalah tes menggunakan
Date.parse
. Saya di AS:Yang pertama adalah format yang benar untuk AS: bb / hh / tttt, tetapi Date tidak menyukainya. Yang kedua benar untuk Eropa, tetapi jika pelanggan Anda sebagian besar berbasis di AS, Anda akan mendapatkan banyak tanggal yang diuraikan dengan buruk.
Ruby
Date.strptime
digunakan seperti:sumber
01/01/2014
, bulan apa dan hari apa? Di AS, bulan akan menjadi yang pertama, seluruh dunia akan menjadi yang kedua.Date.valid_date? *date_string.split('-').reverse.map(&:to_i)
sumber
require "date"
terlebih dahulu atau Anda akan mendapatkan "metode tidak ditentukan".Date.valid_date? *Array.new(3).zip(date_string.split('-')).transpose.last.reverse.map(&:to_i)
Saya ingin memperpanjang
Date
kelas.contoh
sumber
Cara lain untuk memvalidasi tanggal:
sumber
Coba regex untuk semua tanggal:
Hanya untuk format Anda dengan nol di depan, tahun terakhir dan tanda hubung:
[- /] berarti - atau /, garis miring harus di-escape. Anda dapat mengujinya di http://gskinner.com/RegExr/
tambahkan baris berikut, semuanya akan disorot jika Anda menggunakan regex pertama, tanpa yang pertama dan terakhir / (untuk digunakan dalam kode ruby).
sumber
32-13-2010
yang salah.'00/00/0000'
dan'99-99/9999'
merupakan kandidat yang mungkin.Solusi yang lebih ketat
Lebih mudah untuk memverifikasi kebenaran tanggal jika Anda menentukan format tanggal yang Anda harapkan. Namun, meskipun demikian, Ruby agak terlalu toleran untuk kasus penggunaan saya:
Jelasnya, setidaknya satu dari string ini menetapkan hari kerja yang salah, tetapi Ruby dengan senang hati mengabaikannya.
Berikut adalah metode yang tidak; itu memvalidasi yang
date.strftime(format)
mengubah kembali ke string input yang sama yang diurai denganDate.strptime
sesuaiformat
.sumber
Date.today().iso8601
);%m
empuk nol. Jika Anda menginginkan sesuatu yang berbeda, lihat ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/…Memposting ini karena mungkin berguna untuk seseorang nanti. Tidak ada petunjuk apakah ini cara yang "baik" untuk melakukannya atau tidak, tetapi ini berhasil untuk saya dan dapat diperpanjang.
Pengaya untuk kelas String ini memungkinkan Anda menentukan daftar pembatas di baris 4 dan kemudian daftar format yang valid di baris 5. Bukan ilmu roket, tetapi membuatnya sangat mudah untuk diperpanjang dan memungkinkan Anda mencentang string seperti ini:
sumber
sumber
Anda dapat mencoba yang berikut ini, yang merupakan cara sederhana:
Tapi Anda perlu menangani pengecualian tersebut.
sumber
Date.parse tidak memunculkan pengecualian untuk contoh ini:
Saya lebih suka solusi ini:
sumber
Metode:
Pemakaian:
Ini mengembalikan benar atau salah jika config [: tanggal] = "12/10 / 2012,05 / 09/1520"
sumber