Vb.net 字符串到日期的转换-.NET的不同行为
请参阅以下代码:Vb.net 字符串到日期的转换-.NET的不同行为,vb.net,Vb.net,请参阅以下代码: Dim dtEstComplDate As Date Try dtEstComplDate = "08-mar-16" Catch ex As Exception MessageBox.Show(ex.Message) End Try 如果我将计算机的本地格式设置为英语(美国),'08-mar-16'将被分配到dtEstComplDate作为\3/82016 现在,如果我将我的计算机格式更改为意大利语,此作业将导致以下异常: 从字符串“08-mar-
Dim dtEstComplDate As Date
Try
dtEstComplDate = "08-mar-16"
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
如果我将计算机的本地格式设置为英语(美国),'08-mar-16'
将被分配到dtEstComplDate
作为\3/82016
现在,如果我将我的计算机格式更改为意大利语,此作业将导致以下异常:
从字符串“08-mar-16”转换为类型“Date”无效
我试过使用意大利设置的
08-mrz-16
。它不起作用。原因是mar
是英语中三月的缩写,而不是意大利语
不要使用字符串初始化日期。相反,您应该将选项Strict
更改为On
。然后,您将了解许多有关.NET方法和类型的知识,以及如何编写类型安全代码。如果要初始化日期,可以使用构造函数:dtEstComplDate=newdate(2016,3,8)
如果确实需要将字符串解析为Date
请使用Date.parse
/Date.TryParse
或/Date.TryParseExact
:
dtEstComplDate = Date.ParseExact("08-mar-16", "dd-MMM-yy", DateTimeFormatInfo.InvariantInfo)
我使用的是
InvariantInfo
,因为它源于英语格式。原因是mar
是英语中三月的缩写,而不是意大利语
不要使用字符串初始化日期。相反,您应该将选项Strict
更改为On
。然后,您将了解许多有关.NET方法和类型的知识,以及如何编写类型安全代码。如果要初始化日期,可以使用构造函数:dtEstComplDate=newdate(2016,3,8)
如果确实需要将字符串解析为Date
请使用Date.parse
/Date.TryParse
或/Date.TryParseExact
:
dtEstComplDate = Date.ParseExact("08-mar-16", "dd-MMM-yy", DateTimeFormatInfo.InvariantInfo)
我使用的是
InvariantInfo
,因为它是从英文格式派生出来的。试试看,将任何格式转换为日期更简单MsgBox(CDate(“01/02/16”)。ToString(“yyyy-MM-dd”)
cdate函数将文本转换为日期尝试此操作将任何文本转换为日期更简单
MsgBox(CDate(“01/02/16”)。ToString(“yyyy-MM-dd”)
cdate函数会将文本转换为日期我希望下面的示例能帮助您理解。。为什么会发生这些事。。在区域设置中更改区域时。。同样的事情发生在这里的点网络代码
Dim dtEstComplDate As Date
Try
'Will be the country name you set using datetimesetting
MessageBox.Show(System.Threading.Thread.CurrentThread.CurrentCulture.Name)
Dim ukCulture As System.Globalization.CultureInfo
Dim itCulture As System.Globalization.CultureInfo
ukCulture = New Globalization.CultureInfo("en-GB")
itCulture = New Globalization.CultureInfo("it-IT")
Dim strDate = "08-mar-16"
'forcing to use uk culture when converting string to date
System.Threading.Thread.CurrentThread.CurrentCulture = ukCulture
dtEstComplDate = strDate
MessageBox.Show(dtEstComplDate)
'forcing to use italian culture when converting string to date
System.Threading.Thread.CurrentThread.CurrentCulture = itCulture
dtEstComplDate = strDate
MessageBox.Show(dtEstComplDate)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
我希望下面的例子能帮助你理解。。为什么会发生这些事。。在区域设置中更改区域时。。同样的事情发生在这里的点网络代码
Dim dtEstComplDate As Date
Try
'Will be the country name you set using datetimesetting
MessageBox.Show(System.Threading.Thread.CurrentThread.CurrentCulture.Name)
Dim ukCulture As System.Globalization.CultureInfo
Dim itCulture As System.Globalization.CultureInfo
ukCulture = New Globalization.CultureInfo("en-GB")
itCulture = New Globalization.CultureInfo("it-IT")
Dim strDate = "08-mar-16"
'forcing to use uk culture when converting string to date
System.Threading.Thread.CurrentThread.CurrentCulture = ukCulture
dtEstComplDate = strDate
MessageBox.Show(dtEstComplDate)
'forcing to use italian culture when converting string to date
System.Threading.Thread.CurrentThread.CurrentCulture = itCulture
dtEstComplDate = strDate
MessageBox.Show(dtEstComplDate)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
同意。但如果我提供了March的意大利语缩写,它应该可以正常工作?@Sameer:是的,所以这取决于你是否想确保即使当前的文化是意大利语,你也可以解析英文名称,或者如果你想同时解析两种文化,那么你必须知道源格式。我同意数据。解析方法,但坚持我的旧观点,我在几个网站上查到了意大利月名缩写。其中大多数只列出“Mar”。如上所述,我也尝试过使用“Mrz”。两者都不起作用。@Sameer:你说得对,我不懂意大利语,但似乎缩写是一样的。因此,即使您使用
Date.ParseExact(“2016年3月8日”,“年3月8日”,“年3月8日”,“文化信息”(“it”))
也可以使用意大利文化。但这并不意味着从字符串到日期的隐式转换就是这样工作的。不要使用这种神奇的转换。更改为option strict并修复编译器错误。你将来会从中受益的。同意。但如果我提供了March的意大利语缩写,它应该可以正常工作?@Sameer:是的,所以这取决于你是否想确保即使当前的文化是意大利语,你也可以解析英文名称,或者如果你想同时解析两种文化,那么你必须知道源格式。我同意数据。解析方法,但坚持我的旧观点,我在几个网站上查到了意大利月名缩写。其中大多数只列出“Mar”。如上所述,我也尝试过使用“Mrz”。两者都不起作用。@Sameer:你说得对,我不懂意大利语,但似乎缩写是一样的。因此,即使您使用Date.ParseExact(“2016年3月8日”,“年3月8日”,“年3月8日”,“文化信息”(“it”))
也可以使用意大利文化。但这并不意味着从字符串到日期的隐式转换就是这样工作的。不要使用这种神奇的转换。更改为option strict并修复编译器错误。我同意Date.Parse是通过传递cultureInfo参数将字符串转换为日期的更好方法。但在我上面的问题中,我给出了一段遗留代码。因此,如果一个区域性接受直接字符串到日期的分配,那么其他区域性也应该接受,因为字符串值的格式正确。可能是我的示例方法错误。。我不建议在此处使用date.parse
。。我只是想帮你。。它起作用了。。为什么你会有例外。。请看我的编辑。。。我觉得现在好多了……)您的回答让我深入研究了代码,我发现在初始化过程中,他们设置了:Thread.CurrentThread.CurrentUICulture=New CultureInfo(“en-US”)CultProvider=New CultureInfo(“it”)。因此,看看您的示例,设置CurrentThread.CurrentCulture=en US就是导致问题的那一行。是吗?@Sameer。。太好了。。我的目的也是告诉你为什么。。不同的行为..我同意Date.Parse是通过传递cultureInfo参数将字符串转换为日期的更好方法。但在我上面的问题中,我给出了一段遗留代码。因此,如果一个区域性接受直接字符串到日期的分配,那么其他区域性也应该接受,因为字符串值的格式正确。可能是我的示例方法错误。。我不建议在此处使用date.parse
。。我只是想帮你。。它起作用了。。为什么你会有例外。。请看我的编辑。。。我觉得现在好多了……)你的答复使我感到惊讶