2012-06-30 11 views
5

Tôi mắc kẹt với một vấn đề mà tôi không thể phân tích ngày tháng và thời gian từ một chuỗi, mà tôi đang đọc từ một tệp văn bản. Chuỗi Tôi nhận được là ở định dạng sau:Ngày phân tích cú pháp từ chuỗi định dạng ddMMMyyyy hhmm (với Month-Name)

05SEP1998 2400

và tôi đang cố gắng để phân tích chuỗi thông qua đoạn mã sau:

string dateTimeStr = "05SEP1998 2400" 

var provider = CultureInfo.InvariantCulture; 

const string Format = "ddMMMyyyy hhmm"; 

var dateTime = DateTime.ParseExact(dateTimeStr, Format, provider); 

Nhưng khi phân tách, các mã trên ném một FormatException:

String was not recognized as a valid DateTime.

có thể ai xin h giúp tôi khắc phục vấn đề này?

+0

Ừ cùng lỗi ở cuối của tôi cho mã này. –

+0

Ngày giờ chỉ có 23 giờ không 24. –

Trả lời

1

hh là 12 giờ, HH là 24 giờ. Tuy nhiên, nó phải nằm trong phạm vi từ 0-23, không 24. Nếu bạn không thể dễ dàng thay đổi như thế nào những chuỗi ngày được tạo ra, bạn có thể phân tích nó bằng tay:

string dateTimeStr = "05SEP1998 2400"; 

var provider = CultureInfo.InvariantCulture; 

const string Format = "ddMMMyyyy HHmm"; 
int HourPos = Format.IndexOf("HH"); 
var hour = dateTimeStr.Substring(HourPos, 2); 
bool addDay = hour == "24"; 
if (addDay) 
    dateTimeStr = dateTimeStr.Substring(0, HourPos) + "00" + dateTimeStr.Substring(HourPos + 2); 
var dateTime = DateTime.ParseExact(dateTimeStr, Format, provider); 
if (addDay) 
    dateTime += TimeSpan.FromHours(24); 

Lưu ý rằng điều này sẽ ném ngoại lệ nếu dateTimeStr không có số lượng ký tự phù hợp. Bạn có thể muốn xử lý tốt hơn.

+0

Tôi tìm thấy cách tiếp cận của bạn sai. Tại sao? Bởi vì trong đoạn mã này ví dụ như "05SEP1998 2400", bạn giả sử rằng 24 là ngày thứ 0 của ngày 5 tháng 9. Nhưng Infact nó là giờ thứ 6 của ngày 6 tháng 9. Do đó, nó là "06SEP1998 0000" ' –

+0

Đó là lý do tại sao tôi có' dateTime + = TimeSpan.FromHours (24); '. Ngày ví dụ giải quyết thành '9/6/1998 12:00:00 AM' (hoặc' 06SEP1998 0000'). –

+0

OK. Bây giờ nó rõ ràng. –

0

Có 24 giờ trong ngày. Nhưng trong khi viết, chúng tôi nói từ 0-23. Nó được đưa ra ngoại lệ trên định dạng giờ.

Tôi phát hiện ra bằng cách nào?

tôi đã cố gắng tạo ra một đối tượng DateTime từ chuỗi của bạn như

DateTime dt = new DateTime(1998, 9, 5, 24, 0, 0); 

Nó đã cho lỗi trên Hours rằng Hour. minute and second parameters descrive an un-representable DateTime