日期字符串无法解析为有效的DateTime

时间:2013-11-13 11:38:23

标签: c# .net string parsing datetime

我的应用程序中有以下代码,它从xml文件中读取日期时间:

private void getConfig()
    {
    XDocument xdocument = XDocument.Load(@"C:\Salesforce\SFDIAuto\config.xml");
    IEnumerable<XElement> tasks = xdocument.Elements();
    foreach (var task in tasks)
        {
       IEnumerable<XElement> query = task.Elements("Triggers").Elements("CalendarTrigger");
       foreach (XElement result in query)
           {            
            CalendarTrigger[0] = (result.Element("Next").Value != "") ? Convert.ToDateTime(result.Element("Next").Value).ToString("MM/dd/yyyy HH:mm:ss") :
                    DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss");
            dScanDate.Value = Convert.ToDateTime(CalendarTrigger[0]);
            dScanTime.Value = Convert.ToDateTime(CalendarTrigger[0]);

            CalendarTrigger[1] = (result.Element("Last").Value != "") ? Convert.ToDateTime(result.Element("Last").Value).ToString("dd/MM/yyyy HH:mm:ss") : "";
            CalendarTrigger[2] = result.Element("Result").Value;
            CalendarTrigger[3] = "Ready";
            if (Convert.ToDateTime(result.Element("Next").Value) < DateTime.Now)
                    CalendarTrigger[3] = "Missed/Overdue";

                CalendarTrigger[4] = result.Element("ScheduleByDay").Element("DaysInterval").Value;

xml配置文件具有以下格式:

<?xml version="1.0" encoding="utf-8"?>
<config>
    <Triggers>
        <CalendarTrigger>
            <Start>2012-07-02T18:00:00</Start>
            <Next>2013-11-13T21:00:00</Next>
            <Last>2013-11-12T21:00:00</Last>
            <Result>Success</Result>
            <Enabled>true</Enabled>
            <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
            </ScheduleByDay>
       </CalendarTrigger>
    </Triggers>

在我的开发PC上,没有错误,但在实时服务器上,此过程总是会抛出错误:

  

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

它所看到的价值是:

CalendarTrigger[0] = "11/13/2013 21:00:00"

看到它在我的开发电脑上工作正常,我该怎么做才能找出环境中的不同之处,以及如何将这部分重新编码以便在任何地方工作?

2 个答案:

答案 0 :(得分:3)

问题出在特定的机器文化中。 Convert.ToDateTime将使用系统定义的文化解析字符串。对于一个系统 11/13/2013 将是一个有效的日期,但对于另一个系统(乌克兰语,例如,其中月份应该在第二位:) :)它不是有效的应该 13 /二千零十三分之十一

当您将数字/日期/语言环境特定数据存储在字符串中时,应始终考虑客户端文化。为了使事情更清楚,我建议您使用InvarianCulture来存储/转换特定于文化的数据。

存储在字符串字段中的不变日期样本:

var invariantStringDate = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture.DateTim‌​‌​eFormat);

答案 1 :(得分:2)

来自Convert.ToDateTime Method (String)

  

如果value不为null,则返回值是调用的结果   使用a中的格式信息对值的DateTime.Parse方法   为当前区域性初始化的DateTimeFormatInfo对象。    value参数必须包含日期和时间的表示   以DateTimeFormatInfo主题中描述的格式之一。

在您的情况下,看起来您的当前文化中没有描述此格式。我的钱是你的文化需要13个月 :)

您可以将DateTime.ParseExactCultureInfo.InvariantCulture一样使用,而不是这样;

string s = "11/13/2013 21:00:00";
DateTime dt = DateTime.ParseExact(s, "MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
Console.WriteLine(dt);

输出将是;

11/13/2013 9:00:00 PM

这里有 demonstration