2013-03-21 41 views
5

Tôi đã có một mảng lớn của văn bản như thế này:Phân tích loại chuỗi thành DateTime - "Thứ sáu ngày 22 tháng ba năm 2013" (C#)

.... khuyên rằng thứ Sáu ngày 22 tháng ba năm 2013 có tiềm năng được tuyên bố một ngày .....

Tôi phải định vị và sau đó phân tích DateTime trong đó (Thứ Sáu ngày 22 tháng 3 năm 2013). Tôi có thể định vị nó và sử dụng DateTime.TryParse để có được gần như tất cả mọi thứ, nhưng các hậu tố thứ tự (st, nd, rd, th) đang ném tôi đi.

Khi tôi đang xây dựng chuỗi định dạng trước khi gọi phương thức TryParse có bất kỳ ký tự đại diện nào tôi có thể sử dụng để tính đến các hậu tố đó không? Hoặc bất kỳ đề xuất nào khác?

Cảm ơn!

+1

Các bạn đã thử tháo gỡ chúng chỉ hậu tố sử dụng string.replace hoặc regex? Đó có phải là một lựa chọn không? –

Trả lời

2

Làm cách nào để thay thế các ký tự không mong muốn bằng cách sử dụng regex?

Ví dụ: regex sau sẽ thực hiện công việc: "(?<=\d)[a-z]{2}".

Ví dụ mã

string date = "Friday 22nd March 2013"; 
var r = new Regex(@"(?<=\d)[a-z]{2}"); 
String result = r.Replace(date, ""); 
Console.WriteLine(DateTime.Parse(result, CultureInfo.InvariantCulture)); 

Output:

22/03/2013 00:00:00 

này nên chăm sóc của hầu hết các trường hợp, nhưng hãy chắc chắn để kiểm tra nó đúng cách.

+1

Và khi bạn có chủ nhật, "nd" sẽ được thay thế bằng "" và sau đó kaboom! –

+0

@NikolaDavidovic Bạn đã đọc câu trả lời đầy đủ của tôi chưa? Đọc phần cuối cùng một lần nữa. :) – eandersson

+0

Câu trả lời bạn đề xuất là sai, nhưng khái quát về sau là tốt. Tại sao bạn không đề xuất regex? –

1

Bạn luôn có thể Brute Buộc nó.

LƯU Ý: Tôi sẽ mượn một số mã của Fuji để chúng tôi có cùng giao diện.

string date = "Friday 22nd March 2013"; 
string[] split = date.Split(' '); 
string dayOfWeek = split[0]; // throw away & don't need 
int day = Convert.ToInt32(split[1].SubString(0, split[1].Length - 2); 
int month = 0; 
switch (split[2]) { 
    case "January": month = 1; break; 
    case "February": month = 2; break; 
    case "March": month = 3; break; 
    case "April": month = 4; break; 
    case "May": month = 5; break; 
    case "June": month = 6; break; 
    case "July": month = 7; break; 
    case "August": month = 8; break; 
    case "September": month = 9; break; 
    case "October": month = 10; break; 
    case "November": month = 11; break; 
    case "December": month = 12; break; 
} 
int year = Convert.ToInt32(split[3]); 
var dateTime = new DateTime(year, month, day); 
Console.WriteLine(dateTime); 

Không 100% Tôi có hàm dựng mới "DateTime" chính xác. Tôi không có IDE của tôi đang chạy.

0

an overload of DateTime.Parse that allows multiple format strings - bạn có thể vượt qua trong các ordinals như chuỗi chữ, giống như phương pháp helper này (mà sử dụng ngôn ngữ chủ đề để tìm ra tháng/tên ngày chính tả):

private static DateTime ParseOrdinalDateTime(string dt) 
{ 
    string[] expectedFormats = new[] { 
             "dddd d'st' MMMM yyyy", 
             "dddd d'nd' MMMM yyyy", 
             "dddd d'rd' MMMM yyyy", 
             "dddd d'th' MMMM yyyy" 
             }; 

    return DateTime.ParseExact(dt, expectedFormats, null, DateTimeStyles.None); 
} 
Các vấn đề liên quan