Оптимальный конвертер DateTime для всех культур

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

На самом деле в одном конвертере у меня есть такая дата 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, чтобы она генерировала только время из дат, верно?

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


person Houman    schedule 17.05.2011    source источник


Ответы (1)


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

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 является вашим сервером базы данных, пока вы храните даты как даты, а не строки, культура снова позаботится о вас.

person Adam Houldsworth    schedule 17.05.2011
comment
Привет Адам, спасибо за ваш ответ. Я пробовал date.Date, однако время в конце все еще там и не обрезается. 05.17.2011 00:00:00 Очевидно, я мог бы использовать подстроку и вырезать ее сам, но я хотел использовать более чистый способ получения даты без времени. - person Houman; 18.05.2011
comment
Что касается культуры, я проверил App.config и Web.config и нигде не смог найти культуру, установленную на США. На самом деле EF4 установил культуру = нейтральную для своих служб. До сих пор исследую это... - person Houman; 18.05.2011
comment
Если вы хотите получить дату в виде строки, вы можете использовать DateTime.Now.ToShortDateString. Это соответствует локали. - person Adam Houldsworth; 18.05.2011
comment
Простите за поздний ответ. Я все еще борюсь за правильную культуру. Культура по-прежнему установлена ​​​​на США. Как я могу заставить его читать культуру моего ПК? Хотелось бы чтобы было так, чтобы любой пользователь из любой точки мира видел локальный привычный формат даты и времени. Я не хочу навязывать тот или иной способ. Если вы понимаете, о чем я? - person Houman; 24.05.2011
comment
@Kave, привет, я не совсем понимаю, почему он продолжает выбирать для тебя другую культуру. Я предполагаю, что это где-то настроено без вашего ведома. Лучше всего опубликовать вопрос только с этим, и вы должны получить несколько быстрых ответов. - person Adam Houldsworth; 24.05.2011