2013-03-21 34 views
1

我在VB中使用Date.Parse/ParseExact功能有點頭痛。 爲了推測,我有一個ASP.Net 4.0應用程序,在其中一個頁面上有一個用戶選擇日期和時間的日曆控件,這些都被輸入到一個字符串(strReqDeadline),該字符串需要以下歐洲/英國日期時間格式:DD/MM/YYYY HH:MM:SS.FFFDate.Parse/ParseExact不會改變日期的奇怪問題(ASP.Net)

因此,例如strReqDeadline的內容將是:29/03/2013 16:30:00.000

我然後需要插入到這SQL日期時間列,所以顯然它需要從英國轉換爲美國/日期時間格式。我一直試圖用Date.Parse和Date.ParseExact來做到這一點,但沒有成功。下面工作根據研究,我已經做了:

strReqDeadline = "29/03/2013 16:30:00.000" 
Dim usDate = As Date = Date.ParseExact(strReqDeadline, "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture) 

然而,實際發生在運行時的bizzare,該Date.ParseExact功能從時間剪掉分形秒(據我可以看到它不應該這樣做,因爲過濾器指定.fff),否則保持整個字符串完全不變。 所以,如果usDate的價值輸出,它顯示如下:29/03/2013 16:30:00

它所應該包含爲datetime:2013年3月29日4:30 PM

真是個奇怪的事情是,如果我把usDate手錶和啓動應用程序,在開發環境中它的值顯示爲#3 /二千零十三分之二十九4:30 PM#,無論是在觀察名單,當在源窗口中懸停,但任何形式的輸出都會顯示原始字符串,只是減去秒的小數部分,而不會轉換爲日期時間。

從我讀'InvariantCulture'規範應該否定任何特定於語言環境的輸出問題,但爲了防止出現這種問題,我還嘗試使用System.Globalization.CultureInfo.CreateSpecificCulture(「en- GB「)(也嘗試過FR-FR),但這沒有什麼區別。如果這與客戶端和服務器上的Windows區域設置有任何相關性,則設置爲英國。

也許我錯過了很明顯的東西,但我不明白爲什麼我會得到這個輸出,Date.ParseExact不會拋出任何異常或抱怨字符串不被識別,但我掙扎要理解它爲什麼只是刪除分數秒並且什麼也不做,尤其是因爲輸入彈簧與指定的掩碼完全匹配。

我會非常感興趣的是,如果有人遇到過這樣的奇怪問題以及您對它做了什麼!

謝謝:)

編輯:用SQL部分的完整代碼如下:

strReqDeadline = "29/03/2013 16:30:00.000"  
Dim usDate As Date = Date.ParseExact(strReqDeadline, "dd/MM/yyyy HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture) 

'SQL 
Dim con As New Data.SqlClient.SqlConnection("data source=XXXXX;initial catalog=YYYYY;Integrated Security=True") 
Dim cmd As New Data.SqlClient.SqlCommand() 

cmd.Connection = con 

cmd.CommandText = "INSERT INTO Requests (ReqOwnerID, ReqDeadline, ReqStatus)" _ 
& "VALUES ('" & UserID & "', '" & usDate & "', '1')" 

con.Open() 
Dim NewReqID = cmd.ExecuteScalar() 

con.Close() 

'

+0

如果你打算在Sql date列中存儲這個日期,爲什麼要先將它轉換爲字符串? – 2013-03-21 14:24:11

+0

不幸的是,它被以前由某人添加的自定義日曆控件作爲字符串輸出。我將考慮用可以處理日期類型的本地代碼來替代它,但現在我只需要將它整理並運行即可。你完全正確,但是沒有意義的任務! :) – 2013-03-21 16:44:01

回答

2

爲什麼你瘦它不工作呢?這些都是所有相同的底層日期/時間:

29/03/2013 16:30:00.000 

29/03/2013 16:30:00 

3/29/2013 4:00PM 

你不能依靠什麼徘徊在一個非字符串變量顯示,以確定其內在價值。所有你看到的是ToString()的評估。如果您希望字符串顯示分數秒,則需要撥打ToString()並指定格式「dd/MM/yyyy HH:mm:ss.fff」。默認情況下,DateTime類型如果不轉換爲String時不顯示分數秒。


如果你不使用的參數(你應該),然後注射日期時間後,最終的SQL語句會是這樣的:

INSERT INTO MyTableWithDate 
    (column1 
    ,column2 
    ,MyDateCol) 
VALUES 
    ('a' 
    ,'b' 
    ,'20130329 16:30:00.557') 

正如我前面提到的, Date數據類型不是字符串。這是一個對象(或者說是一個DateTime結構,由我離題)。您必須調用正確的ToString() meth0d。

嘗試使用此withing您的SQL字符串:

& "VALUES ('" & UserID & "', '" & usDate.ToString("yyyyMMdd HH:mm:ss.fff") & "', '1')" 

當然,還有一點一點將字符串轉換成Date對象立即再次將其轉換回一個字符串,但是這個代碼應該工作。

+0

嗨,謝謝你,弦的事情解釋了分形秒被截斷。我認爲它不能正常工作的原因是,當我嘗試將usDate的內容插入到SQL datetime列中時,服務器會拋出'將日期時間的varchar數據類型轉換失敗'。當我手動輸出SQL插入字符串的內容時,usDate顯示爲'29/03/2013 16:30:00' - 是否它不是以日期時間格式(即M/d/yyyy hh:mm:ss)如果Date.ParseExact已經處理它,該怎麼辦? – 2013-03-21 12:08:17

+0

保留分形秒不是必需的,但如果我在過濾器中忽略它們,並且只有dd/MM/yyyy HH:mm:ss,那麼將引發FormatException'String不被識別爲有效的DateTime',所以我只是將它們保留在。如果有一種方法可以放棄它們併成功轉換爲日期時間而不會出錯,我很樂意這樣做。 – 2013-03-21 12:15:09

+1

您需要發佈與SQL相關的代碼,即問題所在。 – tcarvin 2013-03-21 12:16:23

2

usDate是DateTime類型的對象,它似乎存儲正確的值。當您檢查它時,您會看到該日期時間值的字符串表示形式。它不包含29/03/2013 16:30:00或2013年3月29日下午4:30,這些只是它包含的兩個有效表示。

你說

任何形式輸出的顯示原始字符串

這是不正確的。實際上,當您調用ToString()時,您可以控制它的輸出方式,其中可以指定格式

+0

謝謝,這是有道理的,並解釋了調試輸出和應用程序本身顯示的值之間的差異。在將對象插入到SQL查詢字符串時使用.ToString是可取的,還是僅僅把對象名稱本身(例如usDate)足夠了# – 2013-03-21 13:09:20

+0

建議使用將值插入到SQL中的類型安全方法,例如像提到的tcarvin一樣將其添加爲參數。這樣,您不必擔心格式,因爲您正在向數據庫提供它知道如何處理的正確類型。 – 2013-03-21 13:23:39

+0

謝謝,我會研究參數化查詢,因爲tcarvin和你自己建議的,它更整潔,並且應該在將來防止這種場景,另一個有用的指針:) – 2013-03-21 13:45:01

1

您正在做的事看起來正確,即使用Date.ParseExact將英國格式的日期轉換爲Date類型。你遇到的問題是,當它顯示爲一個字符串時,它顯示在你的本地文化中(調試器似乎總是希望以美國格式顯示),但是你設置的日期是正確的。