C# Parse总是在特定区域性中引发异常

C# Parse总是在特定区域性中引发异常,c#,.net,C#,.net,我有一些旧的日志文件需要解析-显然日期和时间是这样保存的: 2012年12月18日11:09:39——我所有解析这些的尝试都失败了。 我完全迷失在这一点上-任何帮助或指导都将是伟大的 CultureInfo cultureInfo = new CultureInfo( "es-MX" , true ); string date = "18/12/2012 11:09:39 p.m."; DateTime dt = new DateTime( 2012 , 12

我有一些旧的日志文件需要解析-显然日期和时间是这样保存的: 2012年12月18日11:09:39——我所有解析这些的尝试都失败了。 我完全迷失在这一点上-任何帮助或指导都将是伟大的

 CultureInfo cultureInfo = new CultureInfo( "es-MX" , true );
        string date = "18/12/2012 11:09:39 p.m.";

        DateTime dt = new DateTime( 2012 , 12 , 18 , 11 , 9 , 39 ).AddHours( 12 );

        this.richTextBox1.Text += date + Environment.NewLine;
        this.richTextBox1.Text += dt.ToString( cultureInfo ) + Environment.NewLine;
        this.richTextBox1.Text += dt.ToString() + Environment.NewLine;

        foreach ( var item in richTextBox1.Lines )
        {
            try
            {
               DateTime d=  DateTime.Parse( item );
               this.richTextBox1.Text += d.ToString() + Environment.NewLine ;

            }
            catch ( Exception ee)
            {
                this.richTextBox1.Text += ee.Message + Environment.NewLine ;

            }
        }

尝试使用DateTime.TryParseExact()。下面是我在LINQPad中运行的一个示例

void Main()
{
    System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo( "es-MX" , true );
    string date = "18/12/2012 11:09:39 p.m.";

    DateTime dt = new DateTime( 2012 , 12 , 18 , 11 , 9 , 39 ).AddHours( 12 );

    DateTime d;
    string[] styles = {"dd/MM/yyyy hh:mm:ss tt"}; // This doesn't have to be an array - could be string
    DateTime.TryParseExact(date, styles, cultureInfo, System.Globalization.DateTimeStyles.None, out d);

    d.Dump();
}

尝试使用cultureInfo变量作为Parse的第二个参数。这将使用区域性作为格式提供程序

DateTime d =  DateTime.Parse( item, cultureInfo );

问题是您没有指定要在对Parse()的调用中使用的区域性。您的调用使用当前线程的CurrentCulture属性:

DateTime d=  DateTime.Parse( item );
你需要的魔法咒语是:

DateTime instance = DateTime.Parse( text , CultureInfo.GetCultureInfo("es-MX") ) ;
另一种选择是更改当前线程的区域性:

CultureInfo mexico = CultureInfo.GetCultureInfo( "es-MX" );
Thread.CurrentThread.CurrentCulture = mexico;

在调用
DateTime.Parse()之前。在启动时这样做,您就可以开始了(只要使用墨西哥西班牙语对您的目的有好处。请注意,更改当前区域性不会改变显示方式:这是线程的CurrentUICulture属性的责任。

日志文件中的某些日期是正确的)有些格式奇怪,以下午或下午结束。。 以上所有方法似乎都失败了——是的,我都试过了:( 这是我对该问题的破解/修复:

     CultureInfo cultureInfo = new CultureInfo( "es-MX" , true );
     Date = DateTime.Parse( date.Replace( "p. m." , "PM" ).Replace( "p.m." , "PM" ).Replace( "." , "" ).ToUpper() , cultureInfo );

总是……嗯……在特定的文化中。+1你捕捉到了异常,对吗?是什么?50%的时间里,我的代码100%的时间都在工作。@Brian在读了你的评论几秒钟后,我认为这是Op的评论……哇..@Brian Extra lolz假设你的姓是Fontana。@Nicholas-不幸的是,我没有在下面展开评论提交前的原始问题。Tony Hopkinson在我们两人面前发布了该问题。添加该问题会产生一个例外:该字符串未被识别为有效的日期时间。有一个从索引20开始的未知单词。您是否仍在解析该示例,还是正在尝试解析正在处理的日志文件?这也会失败-与我发布的代码…d={1/1/0001 12:00:00 AM}-我猜tryparse失败了…@BillyDvd只是复制、粘贴并在LINQPad中运行,它运行正常。尝试这样做。仍然会产生异常:该字符串未被识别为有效的日期时间。有一个未知单词从索引20开始。@BillyDvd,您检查了失败字符串中的实际字符吗?您的示例字符串是
p.m.
中的小写字母“p”。我愿意承认您在某个地方有错误数据。字符串中是否嵌入了多个空格?您可能希望使用支持指定
datetimestyle
Parse()
重载之一来放松空白处理。