2

我的应用程序中有以下代码从 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 上,没有错误,但在实时服务器上,此过程总是抛出错误:

字符串未被识别为有效的日期时间。

它正在查看的价值是:

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

看到它在我的开发电脑上运行良好,我应该怎么做才能找出环境中有什么不同,以及如何重新编码这部分以在任何地方工作?

4

2 回答 2

4

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

当您在字符串中存储数字/日期/区域设置特定数据时,您应该始终考虑客户文化。为了使事情更清楚,我建议您InvarianCulture用于存储/转换特定于文化的数据。

存储在字符串字段中的不变日期示例:

var invariantStringDate = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture.DateTim‌​‌​eFormat);
于 2013-11-13T11:42:12.467 回答
2

Convert.ToDateTime Method (String)

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

在您的情况下,您当前的文化中似乎没有描述这种格式。我的钱是为了你的文化需要 13 一个月 :)

取而代之的是,您可以使用DateTime.ParseExactwith CultureInfo.InvariantCulturelike;

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.

于 2013-11-13T11:43:48.363 回答