从 vba 迁移到 vb.net - 使用 Iserror 的正确逻辑
Migration from vba to vb.net - correct logic for using 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
我的目标是仅当 "Convert.ToDateTime" 给出有效值时才将值分配给 "MyString" 但代码不会这样做:当字符串未被识别为有效的 DateTime 时它会停止而不是执行 "else" 代码。
你应该使用 DateTime.TryParse:
https://msdn.microsoft.com/en-us/library/9h21f14e%28v=vs.110%29.aspx
如果您不确切知道接收字符串的格式是什么,那么您需要向 DateTime.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
以上代码将匹配“08/05/2015”、“8/5/2015”、“08/05/15”以及具有两位数或一位数格式的时间部分的相同字符串
诀窍在于传递一组可能的格式,这些格式可用于解释您的 CurrentCulture 中的日期(我假设您的 PC 具有与上述格式匹配的文化,但是,如果不是这种情况只需初始化一个新的 CultureInfo 变量并在 TryParseExact 中使用它)
我要感谢莱昂纳多的小费。这是我成功使用的代码:
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
该代码适用于 "italian style" 和 "MyString" 中的任何类型的日期,我得到一个 date/time 格式为 mySql 需要(对于时间戳字段)。
我正在尝试使用此代码:
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
我的目标是仅当 "Convert.ToDateTime" 给出有效值时才将值分配给 "MyString" 但代码不会这样做:当字符串未被识别为有效的 DateTime 时它会停止而不是执行 "else" 代码。
你应该使用 DateTime.TryParse:
https://msdn.microsoft.com/en-us/library/9h21f14e%28v=vs.110%29.aspx
如果您不确切知道接收字符串的格式是什么,那么您需要向 DateTime.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
以上代码将匹配“08/05/2015”、“8/5/2015”、“08/05/15”以及具有两位数或一位数格式的时间部分的相同字符串
诀窍在于传递一组可能的格式,这些格式可用于解释您的 CurrentCulture 中的日期(我假设您的 PC 具有与上述格式匹配的文化,但是,如果不是这种情况只需初始化一个新的 CultureInfo 变量并在 TryParseExact 中使用它)
我要感谢莱昂纳多的小费。这是我成功使用的代码:
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
该代码适用于 "italian style" 和 "MyString" 中的任何类型的日期,我得到一个 date/time 格式为 mySql 需要(对于时间戳字段)。