2010-03-31 24 views
7

Tôi đang viết một ứng dụng đọc RSS và Thư trong C# (về mặt kỹ thuật MonoTouch).Thư viện phân tích cú pháp DateTime mạnh mẽ cho .NET

Tôi đã gặp vấn đề phân tích cú pháp DateTime s. Tôi thấy rất nhiều khác biệt về cách ngày được trình bày trong tự nhiên và đã bắt đầu viết một chức năng như thế này:

static string[] DateTimeFormats = new string[] { 
    "ddd, d MMM yyyy H:mm:ss \"GMT+00:00\"", 
    "d MMM yyyy H:mm:ss \"EST\"", 
    "yyyy-MM-dd\"T\"HH:mm:ss\"Z\"", 
    "ddd MMM d HH:mm:ss \"+0000\" yyyy", 
}; 
public static DateTime ParseTime(string timeStr) { 

    var r = DateTime.MinValue; 

    var styles = DateTimeStyles.AdjustToUniversal | 
       DateTimeStyles.AllowWhiteSpaces; 

    if (DateTime.TryParse(timeStr, 
          CultureInfo.InvariantCulture, 
           styles, 
           out r)) { 
     return r; 
    } 
    else {    
     if (DateTime.TryParseExact(timeStr, 
            DateTimeFormats, 
            CultureInfo.InvariantCulture, 
            styles, 
            out r)) { 
      return r; // BUGGY! Ignores time zone!! 
     } 
    } 

    Console.WriteLine ("BAAAAAAAAAAAAD"); 
    return DateTime.MinValue; 
} 

Điều này, tốt, làm cho tôi bị bệnh. Hai điểm. (1) Thật ngớ ngẩn khi tôi nghĩ rằng tôi có thể thu thập một danh sách định dạng sẽ bao gồm mọi thứ ở đó. (2) Nó sai rồi! Lưu ý rằng tôi đang xử lý thời gian ngày EST là UTC (vì .NET dường như không biết đến múi giờ).

Tôi đang tìm thư viện hiện có (chỉ nguồn), được biết là xử lý một loạt các định dạng này.

Ngoài ra, tôi muốn tiếp tục sử dụng Ngày giờ UTC trong suốt mã của mình để bất kỳ thư viện nào được đề xuất đều có thể tạo Ngày giờ.

Có điều gì ở đó như thế này không?

Cập nhật Dường như tôi không rõ yêu cầu của tôi. Tôi đang tìm thư viện biết rất nhiều các chuỗi định dạng hoang dã này. DateTime.Parse/DateTime.TryParse chỉ biết một vài định dạng và chắc chắn chúng không hiểu múi giờ (bạn có thể thấy tôi đã sử dụng nó). Tôi cần một thứ mạnh hơn DateTime.Parse/DateTime.TryParse.

Cập nhật 2 Mọi người đều ở trên thực tế là tôi đã sử dụng Parse thay vì TryParse. Tôi đã chuyển mã. Nhưng nó vẫn còn sai và không đầy đủ.

+1

Cuối cùng Noda-thời gian có thể cung cấp một số chức năng này: http://code.google.com/p/noda-time/ – TrueWill

+0

Có thể muốn xem [datetime-tryparse-all-possible-type-of-date] (http://stackoverflow.com/questions/2326127/datetime-tryparse-all-possible-type-of- date) – nawfal

Trả lời

2

Bạn đã thử chỉ sử dụng DateTime.TryParse? Hàm đó đã xử lý hầu hết các định dạng.

+0

Tôi gọi Parse (kiểm tra mã). Đó là sự khác biệt về ** những gì được hỗ trợ **. Mỗi một chuỗi định dạng mà tôi cung cấp không thành công DateTime.Parse. Tôi cần một cái gì đó với nhiều kiến ​​thức hơn. –

1

Bạn có thể sử dụng:

DateTime.TryParse() 

thay vì

DateTime.Parse() 

chứ không phải là một try/catch

+0

Tôi đã làm điều đó (xem mã). Nhưng Parse sẽ vẫn thất bại cho các định dạng kỳ lạ hơn. Tôi có thể sống với những ngoại lệ, những gì tôi muốn có nhiều định dạng hơn. –

+0

Thật sao? Tôi đề nghị bạn thực hiện TryParse và TryParseExact thay vì thử/nắm bắt. – hunter

+0

Phân tích cú pháp so với TryParse. Họ giống nhau! Một ném một ngoại lệ, khác không. Tương tự cho ParseExact và TryParseExact. Họ sử dụng cùng một cơ sở dữ liệu định dạng. Vì vậy, có, nó giúp điểm của tôi # 3, nhưng trường hợp ngoại lệ không phải là mối quan tâm thực sự của tôi. Tôi cần một trình phân tích cú pháp biết nhiều định dạng. –

3

Ngoài TryParse trên DateTime, Net cũng cung cấp các struct DateTimeOffset mà cung cấp truy cập vào giá trị UTC như một thuộc tính khác trên cấu trúc, cho phép bạn lưu trữ thông tin múi giờ và thông tin datetime cùng nhau.

+0

Tôi chỉ đang cố tránh tạo cơ sở dữ liệu định dạng của riêng mình. Chắc chắn ai đó đã phải thực hiện công việc này rồi? Nhưng cảm ơn vì thông tin, nếu tôi phải tự viết nó, điều này sẽ hữu ích. –

+0

+1 Joel! Tránh xa các câu hỏi của tôi, bạn sẽ sumbitch! – hunter

0

tôi đã phát triển một thư viện (NaturalDate) cho phân tích số ngày nhưng nó có thể không phải những gì bạn đang tìm kiếm vì nó là mục tiêu của hình thức đầu vào con người, chứ không phải máy tính tạo ra hình thức. IIRC nó thậm chí không thể phân tích cú pháp các biểu mẫu bạn đã trình bày ở trên. Ngoài ra, trang web của xuống cho thời gian được (nó là điều duy nhất trên máy chủ đó).

Nếu tôi có thời gian (có thể, vì tôi thậm chí có thể được trả tiền cho nó), tôi sẽ cố gắng và hồi sinh nó như một dự án được duy trì tích cực.

+0

bạn có thể muốn thêm vào đây [strong-datetime-parser-library-for-net] (http://stackoverflow.com/questions/7297622/robust-datetime-parser-library-for-net) – nawfal

1

Tôi đã gặp vấn đề tương tự với nguồn cấp dữ liệu rss bao gồm ngày có tên múi giờ, không phải là khoảng trống.Tôi đã nghĩ đến việc tạo trình phân tích cú pháp DateTime của riêng mình cho tình huống này, nhưng tôi tin rằng có thể ai đó đã tạo ra nó. Sau một vài giờ tìm kiếm tôi tìm thấy những điều sau

C#: Phân tích DateTime với TimeZone
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

Tôi hiện đang sử dụng mã này từ url trước trong một dự án. Mặc dù dự án đã không đi vào sản xuất, mã dường như hoạt động.

BarDev

1

Frank, để phân tích các múi giờ bạn muốn sử dụng zz hoặc zzz.

phiên bản tương lai của MonoTouch cũng sẽ hỗ trợ mới "K" modifier (đó là một bí danh cho zzz)

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