在非美国文化中使用DateTime的String.FormatException

时间:2010-02-25 22:06:18

标签: c# datetime culture

当文化不是非美国时,我收到一个String.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-US的字符串是“2010年2月25日”。 ja-JP的字符串是“25 2 2010”。

任何想法如何让“25 2 2010”回到约会?

提前致谢。

Edit1:我应该注意日本文化在这里只是作为一个例子进行硬编码。我真的需要这个来处理用户设置的任何文化。我需要的是一个解决方案,无论用户的文化是什么,日期时间格式都有效。我认为单身M就是这样做的。

编辑2:M不适用于英语。任何人都知道适用于所有文化的格式字符串吗?

4 个答案:

答案 0 :(得分:3)

如果你改变:

DateTime output = DateTime.ParseExact(
    toParse, format, CultureInfo.InvariantCulture);

DateTime output = DateTime.ParseExact(toParse, "dd MMM yyyy", info);

正确解析日期。

请注意,在您的示例中,您使用文化(ja-JP)转换为字符串,但另一种文化要转换为字符串。另一个问题是String.Format接受复合格式字符串("My string to format - {0:dd MMM yyyy}"),但DateTime.ParseExact只期望日期时间格式。

答案 1 :(得分:0)

解析日期时尝试使用单个M.这就是日本文化中MonthDayPattern的例子。

const string format = "{0:dd M yyyy}";

答案 2 :(得分:0)

string text = "25 2 2009";
DateTime date = DateTime.ParseExact(text, "d M yyyy", CultureInfo.InvariantCulture);

答案 3 :(得分:0)

传递给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);
        }