2011-01-17 16 views
54

Tôi có ngày sau ở định dạng chuỗi "2011-29-01 12:00 sáng". Bây giờ tôi đang cố gắng để chuyển đổi đó để định dạng datetime với đoạn mã sau:DateTime.TryParse vấn đề với ngày của định dạng yyyy-dd-MM

DateTime.TryParse(dateTime, out dt); 

Nhưng tôi alwayws nhận dt như {1/1/0001 00:00:00}, bạn có thể vui lòng cho tôi biết tại sao? và làm thế nào tôi có thể chuyển đổi chuỗi đó cho đến nay.

EDIT: Tôi vừa thấy mọi người được đề cập để sử dụng đối số định dạng. Tôi sẽ đề cập đến bây giờ rằng tôi không thể sử dụng tham số định dạng như tôi có một số thiết lập để chọn tùy chỉnh dateformat những gì người dùng muốn, và dựa trên người dùng đó có thể nhận được ngày trong textbox trong định dạng đó tự động thông qua jQuery datepicker.

+3

Bằng cách này, bạn có thể xác định xem việc chuyển đổi thất bại bằng cách kiểm tra giá trị trả về của 'TryParse'. Đó là 'bool success = DateTime.TryParse (...);'. –

Trả lời

131

này nên làm việc dựa trên ví dụ của bạn "2011-29-01 00:00"

DateTime dt; 
DateTime.TryParseExact(dateTime, 
         "yyyy-dd-MM hh:mm tt", 
         CultureInfo.InvariantCulture, 
         DateTimeStyles.None, 
         out dt); 
+7

Đánh tôi với nó. Nếu bạn biết định dạng của chuỗi đầu vào, bạn hầu như luôn sử dụng các phương thức TryParseExact/ParseExact. –

+0

okay, vì vậy định dạng ngày của tôi tương tự như định dạng ngày, nhưng nếu giá trị ngày hoặc tháng là một chữ số, thì trình phân tích cú pháp DateTime sẽ trả về lỗi, vì nó tìm hai chữ số khi chỉ có một chữ số. Bạn sẽ đề xuất điều gì trong kịch bản này? –

+9

Để trả lời câu hỏi của riêng tôi, trong trường hợp này nếu bạn sử dụng một ký tự đơn trong định dạng, nó hoạt động cho cả ngày ký tự đơn và kép. ví dụ: d/m/yyyy hoạt động cho 13/11/2012 –

4

Từ DateTime trên MSDN:

Loại: System.DateTime% Khi phương pháp này trở về, chứa giá trị DateTime tương đương với ngày và thời gian chứa đựng trong s, nếu chuyển đổi thành công, hoặc MINVALUE nếu chuyển đổi không thành công. Việc chuyển đổi không thành công nếu tham số s là rỗng, là một chuỗi rỗng (""), hoặc không chứa một biểu diễn chuỗi hợp lệ của ngày và giờ. Thông số này được thông qua chưa được khởi tạo.

Sử dụng parseexact với chuỗi định dạng "yyyy-dd-MM hh:mm tt" thay thế.

+1

upvote cho giá trị trả lại chuyển đổi không thành công –

9

Bạn cần sử dụng ParseExact method. Này có một chuỗi như là đối số thứ hai của nó mà xác định các định dạng datetime là, ví dụ:

// Parse date and time with custom specifier. 
dateString = "2011-29-01 12:00 am"; 
format = "yyyy-dd-MM h:mm tt"; 
try 
{ 
    result = DateTime.ParseExact(dateString, format, provider); 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
catch (FormatException) 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 

Nếu người dùng có thể chỉ định một định dạng trong giao diện người dùng, sau đó bạn cần phải dịch mà thành một chuỗi, bạn có thể vượt qua vào phương pháp này. Bạn có thể thực hiện điều đó bằng cách cho phép người dùng nhập chuỗi định dạng trực tiếp - mặc dù điều này có nghĩa là chuyển đổi có nhiều khả năng thất bại vì họ sẽ nhập chuỗi định dạng không hợp lệ - hoặc có hộp tổ hợp hiển thị chúng với các lựa chọn có thể và bạn thiết lập chuỗi định dạng cho các lựa chọn này.

Nếu nó có khả năng rằng các đầu vào sẽ không chính xác (đầu vào người sử dụng chẳng hạn) nó sẽ là tốt hơn để sử dụng TryParseExact chứ không phải là trường hợp ngoại lệ để xử lý các trường hợp lỗi:

// Parse date and time with custom specifier. 
dateString = "2011-29-01 12:00 am"; 
format = "yyyy-dd-MM h:mm tt"; 
DateTime result; 
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result)) 
{ 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
else 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 
3

đó làm việc:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture); 
0

Nếu bạn cho người dùng cơ hội thay đổi định dạng ngày/giờ, thì bạn sẽ phải tạo một chuỗi định dạng tương ứng để sử dụng để phân tích cú pháp. Nếu bạn biết định dạng ngày có thể (tức là người dùng phải chọn từ danh sách), thì điều này dễ dàng hơn nhiều vì bạn có thể tạo các chuỗi định dạng đó tại thời gian biên dịch.

Nếu bạn cho phép người dùng thiết kế định dạng tự do định dạng ngày/giờ, thì bạn sẽ phải tạo các chuỗi định dạng DateTime tương ứng khi chạy.

+0

Đúng jim Nếu bạn cho phép người dùng thiết kế định dạng tự do của định dạng ngày/giờ, thì bạn sẽ phải tạo các chuỗi định dạng DateTime tương ứng khi chạy. – Pinal

2

Hãy thử sử dụng phương pháp TryParseExact an toàn

DateTime temp; 
string date = "2011-29-01 12:00 am"; 

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp); 
1
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture); 
Các vấn đề liên quan