2015-05-08 98 views
0

我想使用此代碼正確的邏輯:遷移從VBA到vb.net - 使用ISERROR

If Not IsError(Convert.ToDateTime(DatiBase(i).innertext.substring(DatiBase(i).innertext.indexof(":") + 1).trim(), New CultureInfo("it-IT"))) Then 
    MyString = "'" & Convert.ToDateTime(DatiBase(i).innertext.substring(DatiBase(i).innertext.indexof(":") + 1).trim(), New CultureInfo("it-IT")).ToString("yyyy-MM-dd") & "'" 
Else 
    'Do something else 
End If 

我的目標是將值分配給「MyString的」只有「Convert.ToDateTime」給出一個有效的值,但代碼不會這樣做:當String未被識別爲有效的DateTime而不是執行「else」代碼時停止。

+2

DateTime.TryParse,DateTime.TryParseExact。忘記舊的VBA/VB6代碼並使用庫 – Steve

+0

@Steve我無法在'DateTime.TryParse方法(String,IFormatProvider,DateTimeStyles,DateTime)'和'DateTime.TryParse方法(String,DateTime)之間做正確的選擇。 '。我的日期字符串始終是意大利風格('日/月/年],但每次可能會非常不同('01/12/2014'或'1/12/14'或'01/12/14'或' 01/12/2014 10:30'等) – genespos

+0

您應至少有一組可能的格式,然後將其用於轉換。我會用一些例子提供一個答案 – Steve

回答

0

我想感謝萊昂納多的提示。這是我成功使用的代碼:

Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture("it-IT") 
Dim DateResult As DateTime 
Dim styles As DateTimeStyles = DateTimeStyles.None 
Dim mTmpDate As String 

mTmpDate = DatiBase(i).innertext.substring(DatiBase(i).innertext.indexof(":") + 1).trim() 

If DateTime.TryParse(mTmpDate, culture, styles, DateResult) Then 
    MyString = "'" & DateResult.ToString("yyyy-MM-dd HH:mm") & "'" 
Else 
    'Do something else 
End If 

的代碼可與任何一種方式的「意大利風格」,並在「MyString的」我得到格式化的日期/時間爲MySQL需要(爲一個時間戳字段)。

0

如果你不知道到底是什麼在你收到你的字符串,那麼你需要提供一組可能的格式的日期時間格式.TryParseExact。

下面這個例子是您的代碼的簡化測試版本以上

Sub Main 
    Dim dateConverted as DateTime 
    Dim testDate = "asdfasldka:08/05/2015 13:10" 
    Dim yourWannaBeDate = testDate.Substring(testDate.IndexOf(":") + 1).Trim() 
    Dim possibleFormats = new string() {"d/M/yyyy", "d/M/yyyy H:m", "d/M/yy", "d/M/yy H:m"} 
    if DateTime.TryParseExact(yourWannaBeDate, possibleFormats, CultureInfo.CurrentCulture, DateTimeStyles.None, dateConverted) then 
     Console.WriteLine(dateConverted.ToString("yyyy-MM-dd")) 
    else 
     Console.WriteLine("Not a date") 
    End if 
End Sub 

上面的代碼將匹配「2015年8月5日」,「2015年8月5日」,「15年8月5日「和相同的字符串與兩個或一個數字格式的時間部分

訣竅在於傳遞一組可能的格式,可用於解釋CurrentCulture中的日期(我假設您的PC具有文化與上述格式相匹配,但是,如果不是這種情況,只需初始化一個新的CultureInfo變量並在TryParseExact中使用它)

+0

謝謝。我已經嘗試過,但我不覺得這種編碼方式的主人。我會繼續努力學習更多(我使它在.net小提琴上工作,但不在我的項目中,我不知道爲什麼),但目前,我的問題是:1)它是一種非常糟糕的方式來使用「convert.toDateTime」,因爲那會自動調整日期? 2)我如何攔截失敗的轉換? – genespos

+0

是的,它是不好的。如果Convert.ToDateTime無法解析您的日期,則會失敗並顯示異常。捕獲異常並嘗試用另一個Convert進行解析就像是在一個洞內部螺旋狀下降。另外,如果你設法正確的話,表演會很糟糕。鑑於你期望處理的衆多格式,我可以想象的唯一方式就是通過DateTime.TryParseExact。但我可能是錯的。 – Steve

+0

感謝您的提示和時間。經過多次嘗試後,我能夠使用「DateTime.TryParse」編寫一個工作代碼,似乎不需要指示原始日期格式。不過,我會繼續研究並記住你的建議。 – genespos