Строка. FormatException с DateTime в не американская Культура

Я получаю Строку. 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 не работает на английский язык. Кто-либо знает строку формата, которая работает на все культуры?

8
задан sydneyos 26 February 2010 в 18:29
поделиться

4 ответа

Если вы измените:

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 ] ожидает только формат даты и времени.

3
ответ дан 6 December 2019 в 00:55
поделиться
string text = "25 2 2009";
DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);
0
ответ дан 6 December 2019 в 00:55
поделиться

Шаблон формата, который вы передаете в 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);
        }
0
ответ дан 6 December 2019 в 00:55
поделиться

Попробуйте использовать одну букву M при разборе даты. Именно это используется в примере для MonthDayPattern для японской культуры.

const string format = "{0:dd M yyyy}";
0
ответ дан 6 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: