字符串未在一台PC上识别为有效的DateTime

时间:2016-07-19 11:41:36

标签: c# visual-studio date datetime date-formatting

语言: C#, .Net框架: 4.5,使用的方法: DateTime.ParseExact

因此,在我们的一个项目中,我们使用以下函数将字符串解析为DateTime:

private DateTime FormatDate(string date, string format)
{
    try
    {
        IFormatProvider culture = new CultureInfo("en-US", true);
        DateTime dt = DateTime.ParseExact(date, format, culture);
        return dt;
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

并将其称为:

DateTime startDate = FormatDate("01/17/2016", "M/d/yyyy");

在我们的3台PC上,当每台PC上的日期格式为dd / MM / yyyy时,此代码可以正常工作,但是在2台PC上,当它们的日期格式为dd-MMM-yy时,它会在尝试执行时产生错误ParseExact:

  

字符串未被识别为有效的DateTime。

即使使用dd-MMM-yy格式,它仍然在第三台PC上工作。 我比较了所有3台PC上的日期和时间设置,设置都相同,唯一的区别在于我们在第三台Visual Studio 2015上使用Visual Studio 2013的2台PC上。

例外详情:

消息:字符串未被识别为有效的DateTime。

InnerException:没有内部异常

Stack:at System.DateTime.ParseExact(String s,String format,IFormatProvider provider)    at AssetTracking.PopUpWindows.AddItem_Warranty.MakeReminder(TrackersDataContext atdc,Items ni,string itemId)在d:\ Solutions \ Trackers \ Trackers \ PopUpWindows \ AddItem_Warranty.xaml.cs:第807行    在Trackers.PopUpWindows.AddItem_Warranty。<> c__DisplayClass8.b__3()在d:\ Solutions \ Tackers \ Trackers \ PopUpWindows \ AddItem_Warranty.xaml.cs:第685行

问题: 我不确定,这是问题的不同IDE部分吗?或者其他什么东西可以在某些PC上产生这个bug,而不是在其他具有完全相同的日期和时间设置的人身上产生这个bug?

1 个答案:

答案 0 :(得分:0)

首先,你的异常处理被破坏了:

private DateTime FormatDate(string date, string format)
{
    try
    {
        IFormatProvider culture = new CultureInfo("en-US", true);
        return DateTime.ParseExact(date, format, culture);
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

catch块中没有任何操作,所以它只是打破了栈跟踪。全部删除:

private DateTime FormatDate(string date, string format)
{
    IFormatProvider culture = new CultureInfo("en-US", true);
    return DateTime.ParseExact(date, format, culture);
}

第二点是,您提供的值实际上与您指定的模式dd-MMM-yy 不匹配。显然DateTime.ParseExact函数抛出了一个适当的异常。以下是有效输入值的示例:

var startDate = FormatDate("11-Mar-16", "dd-MMM-yy");

如果您将月份视为数字,请删除额外的M