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
。。我只是想帮你。。它起作用了。。为什么你会有例外。。请看我的编辑。。。我觉得现在好多了……)你的答复使我感到惊讶