2014-06-19 173 views
3

考慮下面的代碼片斷:意外行爲()

DateTime dt = Convert.ToDateTime("06/16/2014 -0:10"); 
Console.Write (dt.ToString()); 
Console.ReadKey(); 

輸出是6/15/2014 8:10:00 PM

這是在Web應用程序測試期間允許手動輸入一天中的時間(日期,HH和MM在單獨的ASP.Net文本框控件中)以及字符最初不限於數字(ASP .net驗證器控件接受「-0」爲0..23範圍內的整數)。

有人可以解釋如何將該字符串轉換爲這個日期/時間的邏輯?我要麼期望拋出異常,要麼「6/16/2014 12:10:00 AM」考慮「-0」與「0」相同(「06/16/2014 0:10」轉換爲「6/16/2014 12:10:00 AM「正如人們所期望的那樣)。

+1

不要」不要讓用戶將日期作爲自由文本插入,或者至少使用非常明確的格式對其進行驗證。有大約兩百萬種衝突的方式來表示時間和日期,你不想開始搞清楚用戶輸入了什麼。 01/02/2014 - 是二月二號還是一號? –

+0

那麼,每個人都認爲-0:10被視爲時區偏移量是正確的。如果使用** 06/16/2014 00:00 -0:10 **作爲輸入字符串,則輸出相同。它需要06/16/2014作爲日期,假定時間在午夜,因爲它沒有被指定(全部用UTC表示)。然後它會佔用我當地時間(UTC-4)並通過** - 0:10 **調整時區** –

+0

AK_:我同意您的說法。 FWIW日期不作爲自由文本輸入,日期部分的文本框設置爲只讀,並且從jQuery datepicker控件捕獲值。 –

回答

4

According to MSDN我想你已經設置了時區-10分鐘。

dateString = "2009-05-01T07:54:59.9843750-04:00"; 
Convert.ToDateTime(dateString); 
// '2009-05-01T07:54:59.9843750-04:00' converts to 5/1/2009 4:54:59 AM Local time. 
1

我相信文本的-0部分是作爲相對於當地時間的時區。這會導致程序在當地時間內將分鐘設置爲字符串中給出的十個分鐘。

2

正如@LIUFA已經提到的,這是首先解析字符串並轉換爲本地時間的結果。 -0:10被解釋爲-10分鐘時區偏移量,時間部分根本不被指定,因此被解釋爲午夜。

要看看會發生什麼是說明性的字符串第一解析爲DateTimeOffset

> DateTimeOffset.Parse("06/16/2014 -0:10", CultureInfo.InvariantCulture) 
16.06.2014 00:00:00 -00:10 

,然後將轉換爲本地時間(GMT-4:00在你的情況)

> time.ToLocalTime() 
15.06.2014 20:10:00 -04:00 
+0

所有這些都是正確的,除了你在輸出中錯過了這個日期是6/15並且原始字符串是6/16。我當地的時間是格林威治標準時間-4 –

+0

@JoeSchmoe我還不習慣上午/下午標記。 – CodesInChaos