Các giá trị thập phân được nhận dạng là DateTime thay vì trả về false từ DateTime.Pude


9

Tôi cần thực hiện kiểm tra dựa trên giá trị chuỗi cho dù đó là ngày hay số thập phân nhưng phân tích ngày luôn trả về giá trị đúng cho số thập phân.

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

Nó trả về một ngày hợp lệ 3/5/2019.

Làm thế nào để xác thực chuỗi để biết ngày hợp lệ của nó khi định dạng ngày không được biết?


6
Kiểm tra số thập phân trước? Hoặc sử dụng DateTime.ParseExactnếu bạn biết định dạng nào có thể / nên dùng
Một người bạn

3
Bạn có thể sử dụng TryParseExactvà chỉ định các định dạng ngày hợp lệ.
juharr

5
Thật vậy - DateTime.Parsethử nhiều mẫu. Nếu bạn chỉ muốn nhận ra những cái cụ thể, hãy thử phân tích chúng một cách cụ thể.
Jon Skeet

Câu trả lời:


3

"Làm thế nào để xác thực chuỗi để biết ngày hợp lệ của nó?"

Vấn đề là "3.5" được coi là một ngày hợp lệ (và cũng là một số thập phân).

Nếu bạn muốn loại thập phân luôn "thắng" (nghĩa là bạn không muốn isDateisDecimalcả hai true), hãy bao gồm kiểm tra thập phân trong xác thực của bạn.

Một cách để làm điều đó là sử dụng các TryParsephương thức (trả về a boolnếu một chuỗi có thể được phân tích cú pháp thành kiểu và đặt outtham số thành giá trị được chuyển đổi) để xác định xem chuỗi có thể được chuyển đổi thành loại không, ví dụ:

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);

Tôi đã thử nhưng 3.5 là một ngày hợp lệ và một số thập phân hợp lệ vì vậy, nó không giúp ích gì cả.
Munawar

1
Trong mã trên, isDatefalsebởi vì nó bao gồm một kiểm tra cho isDecimal. Đó không phải là những gì bạn đang yêu cầu?
Rufus L

2
@Munawar - "3.5 là ngày hợp lệ và số thập phân hợp lệ" chính xác. Nếu chúng ta, như con người, được trình bày với chuỗi đó và không có bối cảnh nào khác, chúng ta không biết liệu nó có được dự định là một ngày, một số thập phân hoặc có thể là một cái gì đó khác . Bạn không thể mong đợi một máy tính kỳ diệu nhận được câu trả lời cho nó.
Damien_The_Unbeliever

Có, câu trả lời này là cụ thể cho vấn đề và giải quyết vấn đề của tôi mặc dù ParseExact sẽ phù hợp nhất nếu các định dạng được biết đến.
Munawar

Bạn vẫn gặp sự cố khi định dạng ngày là "12122019"
Athanasios Kataras

6

Kiểm tra tài liệu chính thức trên ParseExact

Nếu bạn biết đại diện chính xác, bạn có thể làm một cái gì đó như thế này:

  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);
  }

Nếu bạn không biết điều đó, thì bạn sẽ bị mắc kẹt với những khao khát văn hóa

Phân tích chuỗi ngày và thời gian bằng cách sử dụng các quy ước của một nền văn hóa cụ thể. Parse (String, IFormatProvider) quá tải (xem Phân tích cú pháp và quy ước văn hóa)


Định dạng không được biết nó có thể là bất kỳ dựa trên sở thích của người dùng.
Munawar

1
@Munawar bạn sẽ phân biệt thế nào giữa 1/3/2019 và 3/1/2019 trong tình huống đó?
Blaise

@Athanasios, ứng dụng được sử dụng cho các vùng và ngày khác nhau được lưu trữ được mã hóa. kể từ đó, người dùng có thể thay đổi định dạng ngày, do đó, không muốn gây rối với việc áp dụng định dạng cụ thể mặc dù ParseExact phù hợp nhất nếu định dạng được biết.
Munawar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.