2013-04-04 21 views
5

tôi biết các thủ tục chuẩn để hiển thị một DateTime trong một định dạng tùy chỉnh, như vậy:Không có ngày giờ? .ToString (chuỗi) quá tải?

MessageBox.Show(dateSent.ToString("dd/MM/yyyy hh:mm:ss"));

Tuy nhiên, khi tôi thay đổi biến từ một DateTime đến một DateTime? để chấp nhận giá trị null, tôi đã làm mất định nghĩa cho quá tải ToString(string). Tôi cần sử dụng DateTime? vì tôi đang đọc từ cơ sở dữ liệu có khả năng có giá trị null - nếu trường trong cơ sở dữ liệu có giá trị null, thì tôi cũng cần gán giá trị null cho biến đó.

Vì vậy, tôi có hai câu hỏi:

1) Ra khỏi tò mò, không ai biết nếu có một lý do tại sao DateTime? không chứa một tình trạng quá tải cho ToString(string)?

2) Có ai có thể đề xuất phương pháp thay thế cho những gì tôi đang cố gắng đạt được không?

+4

Bởi vì nó có thể có thể là null. 'Null.ToString()' là gì? –

+1

'Bởi vì nó có thể có thể là null.' không phải là một câu hỏi tu từ. Câu hỏi thực tế không phải là hùng biện. Nếu bạn có thể cho tôi biết những gì null.ToString() Tôi nghĩ rằng nó sẽ rất hữu ích. –

+0

có thể trùng lặp của [Làm thế nào tôi có thể định dạng một DateTime nullable với ToString()?] (Http://stackoverflow.com/questions/1833054/how-can-i-format-a-nullable-datetime-with-tostring) –

Trả lời

10

DateTime? là cú pháp đường cho Nullable<DateTime> và đó là lý do tại sao nó không bị quá tải ToString(format).

Tuy nhiên, bạn có thể truy cập cơ bản DateTime cấu trúc sử dụng thuộc tính Value. Nhưng trước khi sử dụng HasValue để kiểm tra, nếu giá trị tồn tại.

MessageBox.Show(dateSent.HasValue ? dateSent.Value.ToString("dd/MM/yyyy hh:mm:ss") : string.Empty) 
+0

Rõ ràng 'DateTime' không chứa định nghĩa cho' HasValue'? –

+1

Nhưng 'Datetime? 'Hiện, bởi vì nó được chuyển đổi' Nullable ' bởi trình biên dịch. – MarcinJuraszek

+0

Ahhh, tôi hiểu, tôi bắt đầu biết rằng có khá nhiều sự khác biệt giữa 'DateTime' và' DateTime? '- cảm ơn :) –

1

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

variableName.Value.ToString(customFormat); 
+6

Nhưng chỉ khi bạn rất tự tin rằng biến của bạn không chứa null tại thời điểm đó. – KingCronus

+0

Vâng, tôi giả định rằng mọi người hiểu một loại null là gì – GLlompart

+0

Vâng tôi chỉ có thể làm một 'if (variableName!= null) 'và phương thức này cũng hoạt động tốt. Cảm ơn bạn đã giải quyết! +1 –

6

Thay vì phải tự thực hiện một kiểm tra null mọi thời gian, bạn có thể viết một phương pháp mở rộng.

public static string ToStringFormat(this DateTime? dt, string format) 
{ 
     if(dt.HasValue) 
     return dt.Value.ToString(format); 
     else 
     return ""; 
} 

Và sử dụng nó như thế này (với bất cứ định dạng chuỗi bạn muốn)

Console.WriteLine(myNullableDateTime.ToStringFormat("dd/MM/yyyy hh:mm:ss")); 
+0

Đây là lần đầu tiên tôi đã gặp phải một phương pháp mở rộng. Nó có lẽ là một chút overkill cho nhu cầu của tôi (như tình trạng này datetime nullable là một cuộc gặp gỡ hiếm hoi trong ứng dụng của tôi) nhưng câu trả lời của bạn là thanh lịch và đã được một kinh nghiệm học tập cho tôi. Cảm ơn! +1 –

+0

@Teifi - Bạn được chào đón :) Các phương thức mở rộng phải nằm trong một lớp tĩnh (tôi đã tạo một lớp tĩnh mới chứa nhiều phương thức ext và nhập chúng vào các dự án của tôi). Để tạo ra một phương thức ext, nó phải là tĩnh và phải có từ 'this'. Tham số đầu tiên là kiểu sẽ bị ảnh hưởng (ở đây là 'DateTime?') Vì vậy, bây giờ, khi bạn có một đối tượng 'DateTime?', Bạn có thể nhấn '.' và nó sẽ liệt kê các phương thức thông thường cũng như các phương thức ext. Thông tin thêm tại đây http://msdn.microsoft.com/en-gb/library/vstudio/bb383977.aspx Hữu ích cho các thao tác lặp lại trên các loại. – keyboardP

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