Еще одна проблема форматирования даты :( - PullRequest
1 голос
/ 13 апреля 2010

Кажется, у меня проблемы с форматированием даты каждый день!

Я запрашиваю таблицу и получаю дату обратно в формате дд / мм / гггг (как строка между прочим). Brilliant! это то, что я хочу. Но теперь я хочу преобразовать эту строку в дату, чтобы я мог сделать

dim dayNumber as integer = day.DayOfWeek 

Но когда я конвертирую его в дату, он меняет ее на # m / dd / yyyy #. Ааааа! как я могу это изменить?

вот мой код, который я пробовал

Dim ActivityDate As String
If dt.Rows(i)("Date") Is DBNull.Value Then
    ActivityDate = ""
Else
    ActivityDate = dt.Rows(i)("Date")
End If

Dim ci As New System.Globalization.CultureInfo("en-CA")
Dim theDate As Date = Date.Parse(ActivityDate, ci)

Dim day As Integer = theDate.DayOfWeek

Приветствия

Ответы [ 7 ]

4 голосов
/ 13 апреля 2010

Brilliant! вот что я хочу

Это не то, что вы хотите. Это худший формат для даты, потому что это ужасно неоднозначно. Форматы строки даты зависят от текущей культуры. «01.04.2010» - это день единорога в SO, в Европе - январь. «# 4/1/2010 #» - это устаревший формат VB6.

Всегда храните даты в DateTime в вашем коде. Всегда хранить даты в столбце базы данных типа datetime в вашей базе данных. Не бывает никакой двусмысленности, и вам будет легко с членами DateTime манипулировать датами.

1 голос
/ 13 апреля 2010

Правильное решение здесь (по крайней мере, пока вы не сообщите нам, почему это невозможно) - обновить базу данных, чтобы использовать тип столбца datetime, а не varchar. Теперь мы также знаем, что в этом столбце нет значений NULL, потому что в противном случае вы будете жаловаться на исключения в вашем вызове Date.Parse(). После применения обоих этих предложений вы можете обрезать весь этот код до простой строки:

Dim day As Integer = DirectCast(dt.Rows(i)("Date"), DateTime).DayOfWeek

Могу я также спросить, почему вы просматриваете таблицу строка за строкой? Я работал в магазине, где это было нормой, но с тех пор, как я уехал оттуда, я сталкиваюсь с альтернативами, и все больше и больше я прихожу к выводу, что перебирать данные можно просто неправильно. Это старый императивный стиль кодирования, и обычно вы хотите использовать декларативный стиль кодирования.

1 голос
/ 13 апреля 2010

Если вы преобразуете строку в дату, вы всегда можете вывести ее обратно в исходный формат, используя строку нестандартного формата: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

0 голосов
/ 13 апреля 2010

Я предполагаю, что вы видите # m / dd / yyyy # в отладчике, как на скриншоте ниже. Не волнуйся!

Переменная Date не сохраняется в виде строки. Отладчик должен преобразовать ваш Date в строку для его отображения, и он настаивает на отображении дат в формате # m / dd / yyyy #. Но это никак не влияет на поведение вашей программы во время выполнения.

Снимок экрана отладчика Visual Studio http://img707.imageshack.us/img707/6205/debugger.gif

0 голосов
/ 13 апреля 2010

Убедитесь, что вы указали точный формат разбора примерно так:

Console.WriteLine(DateTime.ParseExact("17/12/2010", "dd/mm/yyyy", null));

Я не уверен, что является последним параметром, но его можно игнорировать.

0 голосов
/ 13 апреля 2010

Если культура вашей системы не использует этот формат даты, вы должны получить эту строку даты в качестве фактической даты:

' canadian date format is dd/mm/yyyy 
Dim ci As New System.Globalization.CultureInfo("en-CA")
Dim theDate As Date = Date.Parse("13/04/2010", ci)
0 голосов
/ 13 апреля 2010

Вы анализируете это так:

Dim newDate as DateTime = DateTime.Parse(myDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...