我正在使用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}的文化中。这个过程适用于西班牙,英国,法国,意大利。
答案 0 :(得分:1)
如果您使用DateTime.ParseExact
,则必须使用正确的DateSeparator
。
对于pt-PT
,它不是/
,而是-
。
/
可以作为默认DateSeparator
使用,但前提是您使用CultureInfo.InvariantCulture
。但是,如果这样做,则无法解析特定于文化的日期缩写。
这就是你的代码失败的原因。
要生成月份缩写,请使用DateTimeFormatInfo.AbbreviatedMonthNames
或DateTimeFormatInfo.AbbreviatedMonthGenitiveNames
;不需要自己编写方法。
此外,你应该研究String.Join
(你不需要重新发明的另一件事)。
要解析回字符串,可以使用类似
的内容monthToNumber = DateTime.ParseExact(monthin, "MMM", culture).Month
如果您只是使用MMM
作为格式字符串,则无需每天/每年。