2013-04-01 38 views
74

Tôi mới dùng DotNet và C#. Tôi muốn chuyển đổi một chuỗi ở định dạng mm/dd/yyyy thành đối tượng DateTime. Tôi đã thử các chức năng phân tích cú pháp như dưới đây nhưng nó là ném một lỗi thời gian chạy.Chuyển đổi chuỗi định dạng dd/mm/yyyy thành Ngày giờ

DateTime dt=DateTime.Parse("24/01/2013"); 

Bất kỳ ý tưởng nào về cách tôi có thể chuyển đổi thành ngày giờ?

Trả lời

198

Bạn cần phải sử dụng DateTime.ParseExact với định dạng "dd/MM/yyyy"

DateTime dt=DateTime.ParseExact("24/01/2013", "dd/MM/yyyy", CultureInfo.InvariantCulture); 

nó an toàn hơn nếu bạn sử dụng d/M/yyyy cho định dạng, vì đó sẽ xử lý cả hai chữ số đơn và đôi chữ số ngày/tháng. Nhưng điều đó thực sự phụ thuộc nếu bạn đang mong đợi các giá trị số đơn/đôi.


định dạng ngày tháng của bạn day/Month/Year có thể là một dạng ngày chấp nhận được đối với một số nền văn hóa. Ví dụ đối với văn hóa Canada en-CADateTime.Parse sẽ làm việc như:

DateTime dt = DateTime.Parse("24/01/2013", new CultureInfo("en-CA")); 

Hoặc

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-CA"); 
DateTime dt = DateTime.Parse("24/01/2013"); //uses the current Thread's culture 

Cả dòng trên sẽ làm việc vì định dạng của chuỗi là chấp nhận được đối en-CA văn hóa. Vì bạn không cung cấp bất kỳ nền văn hóa nào cho cuộc gọi DateTime.Parse, văn hóa hiện tại của bạn được sử dụng để phân tích cú pháp không hỗ trợ định dạng ngày. Đọc thêm về nó tại DateTime.Parse.


Một phương pháp để phân tích cú pháp được sử dụng DateTime.TryParseExact

DateTime dt; 
if (DateTime.TryParseExact("24/01/2013", 
          "d/M/yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, 
    out dt)) 
{ 
    //valid date 
} 
else 
{ 
    //invalid date 
} 

Các TryParse nhóm các phương pháp trong khuôn khổ Net không ném ngoại lệ trên các giá trị không hợp lệ, thay vào đó họ trả về một giá trị bool cho thấy sự thành công hay thất bại trong phân tích cú pháp.

Thông báo rằng tôi đã sử dụng một lần dM cho ngày và tháng tương ứng. Độc thân dM hoạt động cho cả hai chữ số đơn/đôi ngày và tháng.Vì vậy, cho định dạng d/M/yyyy giá trị hợp lệ có thể là:

  • "24/01/2013"
  • "24/1/2013"
  • "2013/04/12" // ngày 4 tháng 12 năm 2013
  • "2013/04/12"

Đối với đọc thêm bạn sẽ thấy: Custom Date and Time Format Strings

+0

Cảm ơn rất nhiều. Tôi đã thử DateTime.ParseExact() nhưng tôi đoán mẹo là với null là đối số thứ ba. Tôi đã sử dụng CultureInfo.InvariantCulture thay vào đó sẽ cung cấp cho tôi một lỗi biên dịch. –

+1

@ user1872530, bạn được chào đón, nó nên đã làm việc cho bạn, nhưng tôi đoán bạn đang thiếu bằng cách sử dụng tuyên bố cho System.Globalization, vì vậy hãy thử 'System.Globalization.CultureInfo.InvariantCulture' thay vào đó, – Habib

+1

Cảm ơn. Tôi đã sử dụng "dd/MM/yyyy" và phân tích cú pháp không thành công cho "3/12/2016", thay đổi thành "d/M/yyyy" làm giá trị ngày và tháng <10 không còn cần phải được thêm trước bằng 0. – ComeIn

8

sử dụng DateTime.ParseExact

string strDate = "24/01/2013"; 
DateTime date = DateTime.ParseExact(strDate, "dd/MM/YYYY", null) 

null sẽ sử dụng nền văn hóa hiện nay, trong đó có phần nguy hiểm. Cố gắng cung cấp một nền văn hóa cụ thể

DateTime date = DateTime.ParseExact(strDate, "dd/MM/YYYY", CultureInfo.InvariantCulture) 
+0

Bạn nên sử dụng "dd/MM/yyyy" thay vì "dd/MM/YYYY". – Phoenician

5

Bạn có thể sử dụng định dạng "dd/MM/yyyy" để sử dụng định dạng DateTime.ParseExact.

Chuyển đổi chuỗi đại diện theo quy định của một ngày và thời gian để DateTime của nó tương đương bằng cách sử dụng định dạng cụ thể và thông tin định dạng văn hóa cụ thể. Định dạng của biểu diễn chuỗi phải khớp chính xác với định dạng .

DateTime date = DateTime.ParseExact("24/01/2013", "dd/MM/yyyy", CultureInfo.InvariantCulture); 

Đây là một DEMO.

Để biết thêm thông tin, hãy xem Custom Date and Time Format Strings

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