2009-08-14 33 views
8

Tôi đã tạo một trình phân tích cú pháp chung để phân tích các tệp ascii. Khi tôi muốn phân tích ngày, tôi sử dụng hàm ParseExact trong đối tượng DateTime để phân tích cú pháp, nhưng tôi gặp vấn đề với năm.Phân tích chuỗi ngày giờ

Văn bản để phân tích cú pháp tức là "090812" bằng chuỗi parseExact "yyMMdd".

Tôi hy vọng sẽ nhận được đối tượng DateTime cho biết "12/8-2009", nhưng tôi nhận được "12/8-1909". Tôi biết, rằng tôi có thể làm một giải pháp xấu xí bằng cách phân tích cú pháp sau đó, và do đó sửa đổi năm ..

Bất cứ ai biết cách thông minh để giải quyết vấn đề này ??

Thanks in advance ..

Søren

+0

Tài liệu và các bài đăng khác đề xuất rằng tài liệu này sẽ hoạt động cho ngày bạn đã cung cấp (ví dụ: 2009 cho 09). Bạn có thể đăng cuộc gọi chính xác của ParseExact mà bạn đang thực hiện không? – Joe

+1

Thông tin thêm tại đây: http://msdn.microsoft.com/en-us/library/system.globalization.gregoriancalendar.tofourdigityear.aspx – Joe

Trả lời

17

Về mặt lý thuyết cách thực hiện điều này: thay đổi thuộc tính TwoDigitYearMax của Calendar được sử dụng bởi DateTimeFormatInfo bạn đang sử dụng để phân tích văn bản. Ví dụ:

CultureInfo current = CultureInfo.CurrentCulture; 
DateTimeFormatInfo dtfi = (DateTimeFormatInfo) current.DateTimeFormat.Clone(); 
// I'm not *sure* whether this is necessary 
dtfi.Calendar = (Calendar) dtfi.Calendar.Clone(); 
dtfi.Calendar.TwoDigitYearMax = 1910; 

Sau đó, sử dụng dtfi trong cuộc gọi đến DateTime.ParseExact.

Cách thực tế để thực hiện việc này: thêm "20" vào đầu dữ liệu nhập của bạn và phân tích cú pháp bằng "yyyyMMdd".

+0

Tôi thích giải pháp lý thuyết của bạn. 'DateTimeFormatInfo' chỉ là một thiết lập một lần anyway. Nó cũng cho phép cắt giảm khác nhau hơn là chỉ giả định tất cả mọi thứ là trong thế kỷ này. – Thorarin

+0

Hình đẹp .. Không hoàn toàn chắc chắn, những gì bạn đang cố gắng làm ..!? Nhưng dù sao, dtfi.Calendar.TwoDigitYearMax chỉ có thể được đặt thành một số trên 99 .. :-(.. Và tôi không hài lòng về giải pháp chỉ bằng cách thêm "20" ở phía trước, vì tôi không thể garantee này không phải là ong được sử dụng để xem dữ liệu cũ hơn

+0

@MullerDK: Xin lỗi, nó phải được đặt thành 2000 ... hoặc có thể năm 1910 nếu bạn muốn 100812 là 1910, vv –

2

Bạn sẽ cần phải xác định một số loại ngày ngưỡng thích hợp cho dữ liệu của bạn. Nếu ngày được phân tích trước ngày này, hãy thêm 100 năm. Một cách an toàn để làm điều đó là tiền tố chuỗi đầu vào với thế kỷ thích hợp. Trong ví dụ này, tôi đã chọn năm 1970 là cắt:

string input = ...; 
DateTime myDate; 

if (Convert.ToInt32(input.Substring(0, 2)) < 70) 
    myDate = DateTime.ParseExact("20" + input, ...); 
else 
    myDate = DateTime.ParseExact("19" + input, ...); 

Jon Skeet cũng đăng tải một tấm gương đẹp bằng DateTimeFormatInfo rằng tôi đã trong giây lát quên :)

2

Vâng, nếu bạn xác định rằng tất cả các bạn ngày nguồn là thế kỷ này, sau đó bạn có thể sử dụng parseExact dựa vào chuỗi nguồn "-prefixed" 20 ".

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