2015-03-02 3 views
1

Я использую vb.net, и я создаю список месяцев (3 символьное представление), используя следующую функцию.VB.Net Date.ParseExact Culture issue

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

Если вы используете DateTime.ParseExact, вы должны использовать правое DateSeparator.

Для pt-PT, это не /, но -.

/ может работать по умолчанию DateSeparator, но только если вы используете CultureInfo.InvariantCulture. Но если вы это сделаете, вы не сможете проанализировать сокращенную дату для конкретной культуры.

Вот почему ваш код не удался.


Для генерации месяц сокращений, простое использование DateTimeFormatInfo.AbbreviatedMonthNames или DateTimeFormatInfo.AbbreviatedMonthGenitiveNames; не нужно писать метод самостоятельно.

Кроме того, вы должны изучить String.Join (другое, что вам не нужно изобретать).

Для разбора тетиву, вы могли бы использовать что-то вроде

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

Нет необходимости в день/год, если вы просто использовать MMM для строки формата.