Дата неправильно конвертируется в VB.net

Кажется, у меня продолжаются проблемы с датами. Я использую следующий код:

        Dim LocalDateCultureProvider As New CultureInfo(CultureInfo.CurrentCulture.ToString)
         Dim CurrentDate As DateTime = Convert.ToDateTime(System.DateTime.Now.ToString("dd/MM/yyyy"), System.Globalization.CultureInfo.InvariantCulture)

        ExpiryDate = DateTime.ParseExact(strDate, "dd/MM/yyyy", LocalDateCultureProvider)
        If DateTime.Compare(ExpiryDate, CurrentDate) < 0 Then

MsgBox("This file has expired.")
            Exit Sub
        End If

Здесь я читаю strDate как строку, и для одного примера значение этого параметра равно «29/09/2012». Однако в строке ExpiryDate оно преобразуется в #09/29/2012#, так что по сравнению с сегодняшней датой хранится (на мой взгляд, правильно) в CurrentDate как # 6/10/2012 # Я получаю, что условие If истинно (ошибочно).

Кстати, я также пробовал Dim LocalDateCultureProvider As New CultureInfo(System.Globalization.CultureInfo.InvariantCulture.ToString)

просто чтобы увидеть, не было ли это причиной проблемы. Я пытаюсь создать что-то, что будет работать во всех культурах. Независимо от того, каковы локальные настройки, я хочу проверить срок действия, сравнив текущую системную дату с датой истечения срока действия, которую я получаю в виде строки. Пожалуйста, скажите мне, как это сделать, чтобы я мог получить стабильные результаты.

ТИА, Чивда


person Chiwda    schedule 10.06.2012    source источник


Ответы (1)


Нет, вы неправильно анализируете CurrentDate. CultureInfo.InvariantCulture ожидает месяц до дня, но вы отформатировали его с первым днем. Вы пишете ненужный код, просто исправьте с помощью:

    If DateTime.Compare(ExpiryDate, DateTime.Now) < 0 Then
person Hans Passant    schedule 10.06.2012
comment
Но разве это не только в США? Например, в других странах системная дата указывается в формате дд/мм/гггг. - person Chiwda; 10.06.2012
comment
Вы использовали InvariantCulture, он везде одинаков. Просто не имеет смысла преобразовывать DateTime в строку, а затем обратно в DateTime. Ошибиться - это результат. - person Hans Passant; 10.06.2012
comment
VB.Net не позволит вам сделать If (ExpiryDate < DateTime.Now) then ? - person Brian; 10.06.2012
comment
О нет, это работает, но прямо сейчас у меня нет машины (будет в понедельник утром) с форматом даты, отличным от американского. Я подозреваю, что у меня будут проблемы, потому что в прошлом у меня были преобразования даты. - person Chiwda; 10.06.2012
comment
Как я и подозревал, возникла проблема с кодом на машине, системная дата которой представлена ​​в формате дд/мм/гггг. См. здесь l3media.tv/error.png - person Chiwda; 12.06.2012
comment
Если вы говорите по-английски в Индии, вы должны указать свои даты как 29-09-2012. Тире, а не косая черта. Почему вы продолжаете помещать даты в строки, очень трудно догадаться. - person Hans Passant; 12.06.2012
comment
Почему вы продолжаете помещать даты в строки, очень трудно догадаться, потому что я читаю дату из текстового файла. - person Chiwda; 12.06.2012
comment
Извините, я не понял, почему даты должны быть с - не / - person Chiwda; 12.06.2012
comment
Поскольку вы не используете InvariantCulture для преобразования строки, вы используете локальный язык и региональные параметры. В датах en-IN следует использовать тире, а не косую черту. - person Hans Passant; 12.06.2012
comment
Итак, что мне нужно изменить в приведенном выше коде, чтобы он работал в любой культуре? Есть ли документ с лучшими практиками, который я могу прочитать? Ценю вашу помощь. - person Chiwda; 18.06.2012