Как сделать DateTime независимым от текущей культуры? - PullRequest
5 голосов
/ 05 мая 2011

Я пытаюсь преобразовать дату и время в строку и обратно, но делаю так, чтобы она работала для всех культур.

В основном у меня есть Textbox (tbDateTime) и метка (lbDateTime).Метка сообщает пользователю, в каком формате программа ожидает ввод tbDateTime.Ввод текстового поля будет использоваться для команды MySQL.

В настоящее время он работает следующим образом:

lbDateTime.Text = "DD.MM.YYYY hh:mm:ss";   // I live in germany
DateTime date = Convert.ToDateTime(tbDateTime.Text);
String filter = date.ToString("yyyy-MM-dd HH:mm:ss");

Теперь мой вопрос:

  • Возможно ли этоопределить строку формата для lbDateTime.Text на основе текущей культуры?
  • Какой формат использует функция Convert.ToDateTime?

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

Ответы [ 3 ]

7 голосов
/ 05 мая 2011

Вместо использования метода Convert.ToDateTime вы можете использовать методы DateTime.Parse или DateTime.ParseExact. Оба позволяют вам передать культуру, которая сообщает, как вы ожидаете, что дата будет отформатирована.

Метод DateTime.ParseExact также позволяет указать ожидаемый формат, так что вы можете анализировать более или менее любой формат с помощью этого метода.

Edit:
Относительно Convert.ToDateTime. В документации говорится, что при анализе используется текущая культура: http://msdn.microsoft.com/en-us/library/xhz1w05e.aspx

Текущую культуру можно найти с помощью свойства System.Threading.Thread.CurrentThread.CurrentCulture.

Edit2:
Ой. Вы также можете использовать DateTime.TryParse и DateTime.TryParseExact, если не уверены, что данный формат недействителен.

Edit3:
Здесь много правок ... Я вижу, что вы хотите определить строку культуры, соответствующую дате, которую ввел пользователь. Здесь нет общего решения, которое гарантированно сработало бы здесь. Скажем, например, что пользователь ввел дату 01.02.11. Невозможно быть уверенным, указана ли эта дата в формате day.month.year или month.day.year или year.month.day и т. Д.

Лучшее, что вы можете сделать, - это составить список ожидаемых культур ввода и начать с наиболее вероятного и попытаться проанализировать дату, используя это. Если это не помогло, вы можете попробовать второе, скорее всего, и так далее ...

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

5 голосов
/ 05 мая 2011

Метод Convert.ToDateTime вызовет DateTime.Parse для анализа строки с использованием текущей культуры (CultureInfo.Current).

Вы можете указать культуру при разборе строки.Пример:

DateTime data = DateTime.Parse(tbDateTime.Text, new CultureInfo("en-GB"));

Вы можете использовать DateTime.ParseExact (или DateTime.TryParseExact) для анализа строки с использованием пользовательского формата даты.Пример:

DateTime data = DateTime.ParseExact(tbDateTime.Text, "dd'.'MM'.'yyyy HH':'mm':'ss", CultureInfo.InvariantCulture);
0 голосов
/ 27 октября 2015

Другое решение:

// Specify the current language (used in the current system you are working on)
CultureInfo currentCulture = CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.ToString());
// Specify the language that we need
CultureInfo myLanguage = CultureInfo.GetCultureInfo("en-US");

// Adapt the DateTime here, we will use the current time for this example
DateTime currentDate = DateTime.Now;
// The date in the format that we need
string myDate = DateTime.Parse(currentDate.ToString(), currentCulture).ToString(myLanguage);
...