VB.Net Date.ParseExact文化问题

时间:2015-03-02 12:43:12

标签: vb.net

我正在使用vb.net并使用以下函数创建月份列表(3个字符表示)。

Public Function getMonths() As Array
    Dim months As String = ""
    For i = 1 To 12
        months += StrConv(MonthName(i, True), VbStrConv.ProperCase) + ","
    Next
    months = months.Substring(0, months.Length - 1)
    getMonths = months.Split(",")
End Function

这很好用,因为我正在建设的网站可以动态改变语言等。

然而,当我尝试将月份更改回数值以使用此函数进行处理时

Public Function monthToNumber(ByVal monthin As String, ByVal culture As System.Globalization.CultureInfo) As Integer
    monthToNumber = DateTime.ParseExact("01/" + monthin + "/1999", "dd/MMM/yyyy", culture).Month
End Function

,date.ParseExact抛出日期输入的异常不在有效字符串中。

这个月正在由文化化产生,所以我无法理解失败。这只发生在{pt-PT}的文化中。这个过程适用于西班牙,英国,法国,意大利。

1 个答案:

答案 0 :(得分:1)

如果您使用DateTime.ParseExact,则必须使用正确的DateSeparator

对于pt-PT,它不是/,而是-

/可以作为默认DateSeparator使用,但前提是您使用CultureInfo.InvariantCulture。但是,如果这样做,则无法解析特定于文化的日期缩写。

这就是你的代码失败的原因。


要生成月份缩写,请使用DateTimeFormatInfo.AbbreviatedMonthNamesDateTimeFormatInfo.AbbreviatedMonthGenitiveNames;不需要自己编写方法。

此外,你应该研究String.Join(你不需要重新发明的另一件事)。

要解析回字符串,可以使用类似

的内容
monthToNumber = DateTime.ParseExact(monthin, "MMM", culture).Month

如果您只是使用MMM作为格式字符串,则无需每天/每年。