Оптимальный DateTime Converter для всех культур - PullRequest
2 голосов
/ 18 мая 2011

Я собираюсь создать конвертер для перевода даты в пользовательский формат.

На самом деле в одном конвертере у меня есть дата, подобная этой 17.05.2011, 00:00:00, которую я хотел бы преобразовать просто в 17.05.2011. Однако культура также должна быть принята во внимание.

В моем примере выше у меня была британская культура, но если пользователь американец, то он будет преобразован в 17.05.2011.

По сути, мне также понадобится ConvertBack для преобразования даты обратно, независимо от культуры, в дружественный формат базы данных, чтобы сохранить ее универсально и безопасно, без недопонимания.

Это была моя первая попытка, которая уже не удалась:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(value == null)
                return null;

            DateTime date = DateTime.Parse(value.ToString(), culture);

            return date;
        }

Также удивительным является то, что приведенный выше параметр CultureInfo имеет значение Us-en, несмотря на то, что в Windows для всех параметров установлено значение United Kingdom. Кстати, я использую этот конвертер для Silverlight 4, возможно, получение культуры здесь не так ... Тем не менее, достаточно странно, что я получаю исключение: «Строка не была распознана как допустимый DateTime». Я думаю, что это из-за американской культуры, которая у меня там, которая не понимает 17 как месяц. Как настроить свою местную культуру в приложении silverlight?

И тогда мне понадобится второй преобразователь, чтобы возвращать только время, аналогичное указанному выше. я подумал, что мог бы использовать перегрузку DateTimeStyles.NoCurrentDateDefault для него, чтобы генерировать только время из дат, правильно?

Большое спасибо за вашу помощь,

1 Ответ

1 голос
/ 18 мая 2011

Настройка культуры может быть выполнена в текущем потоке, каждый поток в приложении может быть в другой культуре.

http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture(v=VS.100).aspx

Любопытно, если ваш компьютер в en-gb, а ваше приложение в en-us, я бы предположил, что приложение явно вводится в эту культуру, возможно, с помощью файла конфигурации. Если приложению не задана культура, оно принимает культуру ОС.

Я помню, что в веб-приложениях ASP.NET вы могли также указать культуру в файле конфигурации.

Ваша конечная цель - просто отрезать временную часть DateTime? В этом случае доступно свойство DateTime.Date, и вы можете выполнить преобразование с помощью поддержки культуры по умолчанию .NET.

Метод ConvertBack может сэкономить время как UTC, на DateTime есть различные методы для сохранения в UTC. UTC содержит информацию о часовом поясе и поставляется в одном формате, подходящем для баз данных.

http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx

Хотя, если честно, если SQL Server является вашим сервером баз данных, если вы храните даты в виде дат, а не строк, опять же, культура заботится о вас.

...