Проблемы формата даты и культуры

У меня были проблемы с работой с датами. Мне нужен экземпляр DateTime в формате «дд-мм-гггг». Я НЕ прошу иметь строку моего экземпляра даты в «дд-мм-гггг», которую я знаю.

Мне нужно посеять мой объект даты через структуру Entity, которая вызывает хранимую процедуру, которая получает параметр, который является датой...

Я всегда могу изменить свою хранимую процедуру для получения Varchar вместо Date, но мне нужна безопасность типов.

Следующий код может помочь вам понять проблему:

Dim s1 As String = CurrentUICulture.ToString() 'pt-PT
Dim s2 As String = CurrentCulture.ToString()'pt-PT
Dim odate As Date = DateTime.ParseExact(sdate, CurrentUICulture.DateTimeFormat.ShortDatePattern, CurrentUICulture) 'sdate = 19/03/2009
'CurrentUICulture = pt-PT - ShortDatePattern = "dd-MM-yyyy"
'odate is 03/19/2009 !!!

Convert.ToDateTime(sdate, CurrentUICulture)
'its the same!

ПОМОЩЬ!


person Txugo    schedule 06.03.2009    source источник
comment
пожалуйста, сделайте отступ в коде, чтобы его было легче читать...   -  person Peter Miehle    schedule 06.03.2009


Ответы (3)


DateTimes не имеет формата. Они также не являются экземплярами, поскольку DateTime является типом значения.

Мне кажется, вы считаете, что DateTime «неправильно отформатирован» (вы утверждаете, что это 19.03.2009). Как вы проверили значение odate? Распечатав его как odate.ToString() или проверив его значение в окне отладчика? Попробуйте распечатать его с помощью:

Debug.Print odate.ToString(_
   Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern, _
   Globalization.CultureInfo.CurrentUICulture)

odate - это просто DateTime - он содержит количество секунд, прошедших с какой-то давней даты (которую я не могу вспомнить прямо сейчас). Он не имеет информации о форматировании, поэтому будет отформатирован на выходе.

То, что дата 19.03.2009, означает, что ваш парсинг удался. 19.03.2009 - это всего лишь 19 марта 2009 года (3 число 19 месяца - неверная дата). Так что перестаньте волноваться и идите дальше ;-)

person Tor Haugen    schedule 06.03.2009
comment
Мне кажется, вы думаете, что DateTime "неправильно отформатирован" (я не думаю... Я знаю! Я проверял в режиме отладки. Кстати: конструктор DateTime (Int32, Int32, Int32, Int32, Int32, Int32, Calendar) Инициализирует новый экземпляр структуры DateTime. - person Txugo; 06.03.2009
comment
к указанному году, месяцу, дню, часу, минуте и секунде для указанного календаря. Пример! И у него есть информация о форматировании. И мне это нужно, чтобы у меня не было исключения переполнения из sql srv. Так что, если вы недостаточно умны, чтобы ответить или даже понять вопрос... не ленитесь писать. - person Txugo; 06.03.2009

Всякий раз, когда вы имеете дело с датами и SQL Server (я полагаю, что вы тоже здесь), я бы рекомендовал использовать формат ISO-8601 — он должен работать независимо от вашего языка, культуры или других настроек.

ISO-8601 определяет формат даты: ГГГГ-ММ-ДД (с тире или без него; также допустим ГГГГММДД).

Это работает?

Dim oDate as Date = DateTime.Parse("2009-03-06")

на дату 6 марта 2009 года.

См. также: http://www.w3.org/TR/NOTE-datetime

и: http://www.cl.cam.ac.uk/~mgk25/iso-time.html

person marc_s    schedule 06.03.2009

Проблема решена... потому что проблемы изначально не было!

Дело в том, что я использовал функцию, которая выглядит примерно так

GetFormatedDate(ByVal sdate As String) As Date

и... если sdate ничего (или null), у меня была неверная дата, когда она достигла хранимой процедуры SQL.

ValueTypes ничего не имеет значения... но можно сделать так:

GetFormatedDate(ByVal sdate As String) As Global.System.Nullable(Of Date)

с этим я больше не получаю недопустимое исключение параметра.

Да!

person Txugo    schedule 11.03.2009