Я получаю Строку. FormatException, пытающийся преобразовывать/анализировать строку, когда культура отличается неамериканский. Нечетная вещь состоит в том, что строка была сгенерирована путем применения того же самого формата и культуры как те, которые используют проанализировать его назад в строку. В коде ниже, перестанут работать все эти версии:
const string culture = "ja-JP"; const string format = "dd MMM yyyy"; //error in orignal post included {0:} CultureInfo info = new CultureInfo(culture); Thread.CurrentThread.CurrentCulture = info; Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture); //string toParse = String.Format(info, format, DateTime.Now); //error in original post string toParse = DateTime.Now.ToString(format); System.Diagnostics.Debug.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse)); try { DateTime output = DateTime.ParseExact(toParse, format, CultureInfo.InvariantCulture); //DateTime output = DateTime.ParseExact(toParse, format, info); //DateTime output = DateTime.ParseExact(toParse, format, info, DateTimeStyles.None); //DateTime output = Convert.ToDateTime(toParse, info); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); }
Обратите внимание, что строка для en-США "25 февраля 2010". Строка для ja-мирового-судьи "25 2 2010".
Какая-либо идея, как вернуться "25 2 2010" в дату?
Заранее спасибо.
Edit1: Я должен отметить, что японская культура трудно кодируется здесь только как пример. Мне действительно нужно, это для работы с любой культурой установлено пользователем. То, в чем я нуждаюсь, является решением, где формат даты/времени работает независимо от того, что культура пользователя. Я думаю, что единственный M делает это.
Редактирование 2: M не работает на английский язык. Кто-либо знает строку формата, которая работает на все культуры?
Если вы измените:
DateTime output = DateTime.ParseExact(
toParse, format, CultureInfo.InvariantCulture);
на
DateTime output = DateTime.ParseExact(toParse, "dd MMM yyyy", info);
, дата будет правильно проанализирована.
Обратите внимание, что в вашем примере вы используете культуру (ja-JP) для преобразования в строку, но другую культуру для преобразования из строки. Другая проблема заключается в том, что String.Format
принимает строку составного формата ( «Моя строка для форматирования - {0: dd MMM yyyy}»
), но DateTime.ParseExact
] ожидает только формат даты и времени.
string text = "25 2 2009";
DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);
Шаблон формата, который вы передаете в DateTime.ParseExact
, должен быть просто шаблоном даты без заполнителя. А для языка JP вам нужно использовать только один M
, поскольку даты представлены числами, даже если MMM
указывается при преобразовании в строку.
const string culture = "ja-JP";
const string FROM_STRING_FORMAT = "dd M yyyy";
const string TO_STRING_FORMAT = "{0:" + FROM_STRING_FORMAT + "}";
CultureInfo info = new CultureInfo(culture);
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);
string toParse = String.Format(info, TO_STRING_FORMAT, DateTime.Now);
Console.WriteLine(string.Format("Culture format = {0}, Date = {1}", culture, toParse));
try
{
DateTime output = DateTime.ParseExact(toParse, FROM_STRING_FORMAT, CultureInfo.InvariantCulture);
Console.WriteLine(output);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Попробуйте использовать одну букву M при разборе даты. Именно это используется в примере для MonthDayPattern для японской культуры.
const string format = "{0:dd M yyyy}";