2011-09-30 18 views
7

Tôi nhận được kết quả không mong muốn khi sử dụng DateTime.ParseExact. Đây là mã thử nghiệm của tôi:Sử dụng DateTime.ParseExact để chỉ nhận thời gian (không có ngày)

Dim MinVal As DateTime = #12:00:01 AM# 
Dim MaxVal As DateTime = #11:59:59 PM# 
Dim TooBig1, Equal1 As Boolean 
Dim TooBig2, Equal2 As Boolean 

Dim dt1 As DateTime = #12:00:01 AM# 
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", Globalization.DateTimeFormatInfo.InvariantInfo) 

TooBig1 = (dt1.CompareTo(MaxVal) > 0) 
Equal1 = (dt1.CompareTo(MinVal) = 0) 

TooBig2 = (dt2.CompareTo(MaxVal) > 0) 
Equal2 = (dt2.CompareTo(MinVal) = 0) 

Kết quả là tốt cho dt1:

  • nó cho thấy trong trình gỡ lỗi như # 12: 00: 01 PM # (không có ngày)
  • TooBig1 là false
  • Equal1 là True

Nhưng kết quả là (sai?) bất ngờ cho DT2:

  • nó cho thấy trong trình gỡ lỗi như # 9/30/2011 12:00:01 #
  • TooBig2 là True
  • Equal2 là False

Dường như đó là vì ngày là được ParseExact thêm vào một cách hệ thống mặc dù tôi chỉ chỉ định thời gian ở định dạng.

Câu hỏi của tôi là: Làm thế nào tôi có thể đọc thời gian bằng DateTime.ParseExact?

Trả lời

4

Documentation tiểu bang:

Nếu định dạng xác định thời gian không có phần tử ngày và hoạt động phân tích thành công, giá trị ngày giờ kết quả có ngày DateTime.Now.Date.

Nếu bạn muốn có một thời gian không có ngày, bạn có thể sử dụng:

var parsedDate = DateTime.ParseExact(...); 
var timeOnly = parsedDate - parsedDate.Date; 
+2

Đó trở thành một 'đối tượng TimeSpan' Mặc dù vậy, không phải là một' DateTime'. Thực tế bạn chú ý đến chi tiết quan trọng này một lần nữa cho thấy việc sử dụng các biến không định kiểu là một thực tế khủng khiếp. – Nyerguds

+0

@Nyerguds: Bạn nói đúng là kết quả là 'TimeSpan'. Rõ ràng đó là những gì OP muốn, hoặc anh nhanh chóng tìm ra cách để tạo ra một 'DateTime' mới từ nó. Không có biến không định kiểu trong đoạn mã đó; cả hai đều được gõ mạnh mẽ, vì trình biên dịch sẽ làm cho rõ ràng rõ ràng lần đầu tiên bạn cố gắng sử dụng 'timeOnly' như một' DateTime'. Bạn có lẽ muốn nói rằng lợi dụng suy luận kiểu là một điều xấu? –

+3

Có, với "untyped" tôi có nghĩa là "không được nhập vào mã", điều này thực sự có nghĩa là suy luận kiểu. Đây cũng là một ví dụ hoàn hảo về nó; nó không hiển thị ở tất cả từ mã đó 'DateTime' trừ' DateTime' bằng _not_ một 'DateTime'. – Nyerguds

2

Nếu bạn không chỉ định một ngày, nó rõ ràng là giả ngày hôm nay. (Không phải bất hợp lý nếu bạn đang viết, nói rằng, phần mềm theo dõi thời gian.)

Nếu bạn chỉ muốn phần thời gian, bạn có thể phân tích cú pháp như bạn đang làm, và sau đó chỉ lấy thời gian trong ngày phần:

' Existing code: 
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", _ 
    Globalization.DateTimeFormatInfo.InvariantInfo) 
' Now grab just the time: 
Dim ts2 As TimeSpan = dt2.TimeOfDay 

đó sẽ là một TimeSpan thay vì một DateTime, nhưng nếu bạn không thực sự cần nó như là một DateTime, TimeSpan là thích hợp hơn cho một cái gì đó chỉ vài giờ/phút/giây nhưng không phải ngày .

(Bạn cũng có thể thử sử dụng TimeSpan.ParseExact ở nơi đầu tiên, nhưng nó không được xây dựng để xử lý AM/PM và sẽ phân tích 12:00:01 là 12 giờ. Vì vậy, bạn có thể muốn DateTime. ParseExact tiếp theo .TimeOfDay)


Nếu bạn thực sự làm cần phải thể hiện nó như là một DateTime -. với một phần ngày, nói, 1/1/0001 - bạn luôn có thể chuyển đổi TimeSpan rằng quay lại DateTime theo cách thủ công:

Dim dt3 As New DateTime(1, 1, 1, ts2.Hours, ts2.Minutes, ts2.Seconds, ts2.Milliseconds) 
Các vấn đề liên quan