2010-08-23 44 views
8
DateTime dt = DateTime.ParseExact("1122010", "Mddyyyy", System.Globalization.CultureInfo.CurrentCulture); 

Ném ngoại lệ này: Chuỗi không được nhận dạng là Ngày giờ hợp lệ.Phân tích ngày giờ đơn giản

Tôi chắc rằng đó là thiếu 0 hàng đầu trong tháng. Chuỗi định dạng chính xác là gì?

+0

Mẫu mã của bạn có thể chứng minh loại chuỗi mà bạn đang phân tích cú pháp. Nhưng nếu bạn thực sự định nghĩa mã của bạn theo cách này, thì hãy ngừng làm điều đó :) Sử dụng các hàm tạo/phương thức 'DateTime' cho phép bạn chỉ định ngày một cách rõ ràng. –

+0

@Merlyn, tôi cho rằng anh ta nhận được dữ liệu từ một nguồn bên ngoài như một tệp phẳng, dịch vụ, v.v. Tôi không nghĩ rằng điều này sẽ được mã hóa cứng. –

+0

Có, đó là từ tệp có độ dài cố định. Nó sẽ là câm để parseexact một chuỗi cứng mã hóa có được một trường hợp datetime. – Darthg8r

Trả lời

11

Tôi khuyên bạn nên sử dụng định dạng "MMddyyyy" và đảm bảo tham số nhập của bạn có ít nhất 8 ký tự. Ví dụ:

DateTime dt = DateTime.ParseExact("1122010".PadLeft(8, '0'), "MMddyyyy", System.Globalization.CultureInfo.CurrentCulture); 

Nếu bạn đang sử dụng nguồn dữ liệu thiếu hàng đầu trong tháng, điều này sẽ thêm nguồn nếu thiếu.

+0

Đây là trường hợp đặc biệt và có lẽ là giải pháp duy nhất có thể xảy ra. MSDN: Nếu bạn không sử dụng dấu phân tách ngày hoặc thời gian trong mẫu định dạng tùy chỉnh, hãy sử dụng văn bản bất biến cho thông số nhà cung cấp và biểu mẫu rộng nhất của từng định dạng tùy chỉnh định dạng. Ví dụ: nếu bạn muốn chỉ định giờ trong mẫu, hãy chỉ định biểu mẫu rộng hơn, "HH", thay vì biểu mẫu hẹp hơn, "H". – chilltemp

+0

Lưu ý rằng padding chỉ hoạt động trong tháng thấp hơn số 10. Nếu bạn thử cùng với số lượng ngày nhỏ hơn 10, các ngày lẻ có thể hiển thị. Hoặc thậm chí cả hai: '' 112010 '->' 00112010'' Tôi đồng ý đảm bảo tám nhân vật. – Caramiriel

4

Vấn đề là bạn không cung cấp cho ParseExact đủ thông tin để làm việc.

"M" có nghĩa là tháng 1 hoặc 2 chữ số. Nhưng chuỗi của bạn bắt đầu bằng "1122". Có phải là ngày 12 tháng 1 hoặc ngày 22 tháng 11 không?

Giải pháp duy nhất, như Anthony cho thấy, là để đệm bằng 0 khi cần.

1

Chuỗi định dạng "M" duy nhất không được chấp nhận vì không phải tất cả các tháng đều có thể được biểu diễn duy nhất bằng một chữ số hoặc ký tự. Như đã đề xuất trước đây, bạn sẽ phải sử dụng "MMddyyyy" và nhấn vào chuỗi bên trái khi cần.

Các vấn đề liên quan