Nilai desimal dikenali sebagai DateTime alih-alih menghasilkan false dari DateTime.Parse

9

Saya perlu melakukan pemeriksaan berdasarkan nilai string apakah itu tanggal atau desimal tetapi tanggal parse selalu mengembalikan true untuk desimal.

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

Ini mengembalikan tanggal yang valid 3/5/2019.

Bagaimana cara memvalidasi string untuk mengetahui tanggal yang valid ketika format tanggal tidak diketahui?

Munawar
sumber
6
Periksa desimal dulu? Atau gunakan DateTime.ParseExactjika Anda tahu format mana yang dapat / harus diambil
A Friend
3
Anda dapat menggunakan TryParseExactdan menentukan format tanggal yang valid.
juharr
5
Memang - DateTime.Parsemencoba beberapa pola. Jika Anda hanya ingin mengenali yang spesifik, coba parsing secara khusus.
Jon Skeet

Jawaban:

3

"Bagaimana cara memvalidasi string untuk mengetahui tanggal yang valid?"

Masalahnya adalah bahwa "3.5" ini dianggap sebagai tanggal yang valid (dan juga desimal).

Jika Anda ingin jenis desimal untuk selalu "menang" (yaitu Anda tidak ingin isDatedan isDecimaluntuk kedua be true), termasuk cek desimal dalam validasi Anda.

Salah satu cara untuk melakukannya adalah dengan menggunakan TryParsemetode (yang mengembalikan a booljika string dapat diuraikan ke jenis, dan yang menetapkan outparameter ke nilai yang dikonversi) untuk menentukan apakah string dapat dikonversi ke suatu jenis, misalnya:

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);
Rufus L
sumber
Saya sudah mencoba tetapi 3.5 adalah tanggal yang valid dan desimal yang valid jadi, itu tidak membantu sama sekali.
Munawar
1
Dalam kode di atas, isDateini falsekarena itu termasuk cek untuk isDecimal. Bukankah itu yang kamu minta?
Rufus L
2
@Munawar - "3.5 adalah tanggal yang valid dan desimal yang valid" persis. Jika kita, sebagai manusia, disajikan dengan string itu dan tidak ada konteks lain, kita tidak tahu apakah itu dimaksudkan sebagai tanggal, desimal atau kemungkinan sesuatu yang lain . Anda tidak dapat mengharapkan komputer untuk secara ajaib mendapatkan jawabannya.
Damien_The_Unbeliever
Ya, jawaban ini khusus untuk masalah ini, dan menyelesaikan masalah saya meskipun ParseExact paling cocok jika format diketahui.
Munawar
Anda masih memiliki masalah ketika format tanggal adalah "12122019"
Athanasios Kataras
6

Periksa dokumentasi resmi tentang ParseExact

Jika Anda tahu representasi yang tepat, Anda dapat melakukan sesuatu seperti ini:

  format = "ddd dd MMM yyyy h:mm tt zzz";
  try {
     result = DateTime.ParseExact(dateString, format, provider);
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("{0} is not in the correct format.", dateString);
  }

Jika Anda tidak mengetahuinya, maka Anda terjebak dengan konvensi budaya

Pisahkan string tanggal dan waktu dengan menggunakan konvensi budaya tertentu. Parse (String, IFormatProvider) kelebihan beban (lihat Parsing dan Konvensi Budaya)

Athanasios Kataras
sumber
Format tidak diketahui itu bisa apa saja berdasarkan preferensi pengguna.
Munawar
1
@Munawar bagaimana Anda membedakan antara 1/3/2019 dan 3/1/2019 dalam situasi itu?
Blaise
@Aanasia, aplikasi digunakan untuk berbagai wilayah dan tanggal yang disimpan terenkripsi. karena, pengguna dapat mengubah format tanggal sehingga tidak ingin dipusingkan dengan menerapkan format tertentu meskipun ParseExact paling cocok jika format diketahui.
Munawar