2015-09-16 41 views
1

在vb.net中有一個奇怪的問題。使用ParseExact將字符串格式轉換爲日期

這樣,我沒有問題,轉換使用ParseExact,一些日期格式和CultureInfo的一個字符串日期:使用DataReader

While dr.Read 
    Dim f As String = String.Format("{0:dd-MMM-yyyy}", dr.Item("fec_estado_insc"))) 

    ' Value of f is "30-mar-2012" 

    xdate = DateTime.ParseExact(
         f, 
         "dd-MMM-yyyy", 
         System.Globalization.CultureInfo.InvariantCulture) 

End While 

出現錯誤時

Dim f As String = "30-mar-2012" 

    ' Value of f is "30/03/2012" 

    xdate = DateTime.ParseExact(
         f, 
         "dd-MMM-yyyy", 
         System.Globalization.CultureInfo.InvariantCulture) 

問題開始:「字符串未被識別爲有效的日期時間「

如您所見,變量f是一個字符串,其值來自數據讀取器的一行,但是仍然是一個字符串。

這怎麼可能?

編輯

我發現一個黑客的方式來獲得最新的 「DD-MMM-YYYY」 格式與成龍的幫助。我要創建這樣的功能:

Public Shared Function Giveme_Date_dd_MMM_yyyy(ByVal XobjValue As Object) As Nullable(Of Date) 

     If XobjValue Is System.DBNull.Value Then 
      Return Nothing 
     ElseIf XobjValue Is Nothing Then 
      Return Nothing 
     ElseIf XobjValue.ToString.Trim.Equals("") Then 
      Return Nothing 
     End If 

     Dim f As String = String.Format("{0:dd-MMM-yyy}", XobjValue) 

     Dim dtResult As Date, xdate As Date 

     If DateTime.TryParse(f, dtResult) Then 
      xdate = CDate(dtResult.ToString("f", System.Globalization.CultureInfo.InvariantCulture)) 

     End If 

     Return xdate 

    End Function 

而在數據庫中,不得不改變SELECT查詢這樣:

OPEN r_cursor FOR 
     SELECT to_char(fec_estado_insc,'dd/mm/yyyy') AS fec_estado_insc, 
     blah 
     blah 
     blah 

然而,原來的問題仍然存在。一些vb.net的錯誤?

+0

也許試試這個? 'Dim f As String = CStr(String.Format(「{0:dd-MMM-yyy}」,dr.Item(「fec_estado_insc」))。Clone())' –

+0

獲取同樣的錯誤:「字符串未被識別爲一個有效的日期時間「。這很奇怪。如果我直接設置變量f =「30-mar-2012」,則不會出錯。但是從DataReader填充f值時出現錯誤。 – Delmonte

+0

一旦你設置了'f'的值,它就是一個字符串。字符串是一個字符串,不管它是如何設置或來源的;它不會影響你的下一行。你正在做一些錯誤的事情......試着逐行檢查代碼並檢查變量值。 –

回答

0

你確定數據是日期時間嗎?如果它是空的呢?如何額外支票?

Dim f As String = "30-mar-2012" 
Dim dtResult As Date, xdate As Date 

If DateTime.TryParse(f, dtResult) Then 
    xdate = dtResult.ToString("f", System.Globalization.CultureInfo.InvariantCulture) 

End If 
+0

我在調試並確定String.Format(「{0:dd-MMM-yyyy}」,dr.Item(「fec_estado_insc」)))得到:「2012年3月30日」。問題是當這個值進入函數DateTime.ParseExact。 – Delmonte

0

您可以通過存儲DateDate,然後回讀爲Date避免整個問題。 Dates沒有格式,它們只是一個值,但你可以使用格式以任何方式顯示它們。

ID Name RealDate StringDate
1 Test1 3/30/2012 30-mar-2012

日期可以讀回的日期是這樣的:

' "SELECT Name, RealDate, StringDate FROM... 
Using rdr = cmd.ExecuteReader() 
    rdr.Read() 
    realDate = rdr.GetDateTime(1) 

    Console.WriteLine("realdate type: {0} value: {1} ", realDate.GetType, realDate) 
    Console.WriteLine(realDate.ToString("dd-MMM-yyyy")) 

不幸的是,型讀寫器方法只工作過的序號索引,但返回的值作爲日期。輸出:

realdate type: System.DateTime value: 3/30/2012 12:00:00 AM
30-Mar-2012

如果數據庫列是日期類型,那麼數據庫只接受日期類型到列中。要通過列名讀取它,你可以解析或只是轉換:

realDate = Convert.ToDateTime(rdr("realdate").ToString) 

當你「必須」從字符串轉換(假定「日期」是「DD-MMM-YYYY」):

stringDate = rdr("stringDate").ToString 
Console.WriteLine("String Date date: {0}", stringDate) 
Dim newDate = DateTime.ParseExact(stringDate, "dd-MMM-yyyy", CultureInfo.InvariantCulture) 
Console.WriteLine("String Date reparsed: {0}", newDate) 

輸出:

String Date date: 30-mar-2012
String Date reparsed: 3/30/2012 12:00:00 AM

如果數據在數據庫中的一些已知的數據格式,轉換/解析它迄今然後嘗試應用的格式。在一段代碼中,您正在使用String來執行DateTime的格式設置,並且使用Objectdr.Item返回對象)。沒有涉及Date類型。

相關問題