【问题标题】:Convert string to DateTime with Convert.ToDateTime使用 Convert.ToDateTime 将字符串转换为 DateTime
【发布时间】:2013-02-12 00:07:49
【问题描述】:

我很沮丧。我在玩 xml 文件。所以这是我自动创建的 xml 文件:

<Files>
<Lists>
    <oList>
      <Object>
        <Name>test1</Name>
        <DateCreated>2/11/2013 4:35:05 PM</DateCreated>
        <DateDeadline>2/17/2013 12:00:00 AM</DateDeadline>
        <Reward>none</Reward>
        <Description>chocolate amedei 9</Description>
      </Object>
    </oList>
  </Lists>
</Files>

开头的许多起始元素必须在那里,因为我想稍后扩展文件。所以现在我想读取这个 xml 文件并创建一个类的对象(ThingsToDoObjects,它应该有一天会成为一个待办事项列表),它需要存储在 xml 文件中的参数。此对象应存储在列表中。这就是我目前所拥有的:

XmlDocument xmlListDoc = new XmlDocument();
            xmlListDoc.Load(xmlFilePath);
            foreach (XmlNode xnode in xmlListDoc.SelectNodes("Files/Lists/oList/Object"))
            {
                string n = xnode.SelectSingleNode("Name").InnerText.ToString();
                DateTime c = Convert.ToDateTime(xnode.SelectSingleNode("DateCreated").InnerText.ToString());
                DateTime d = Convert.ToDateTime(xnode.SelectSingleNode("DateDeadline").InnerText.ToString());

                string r = xnode.SelectSingleNode("Reward").InnerText.ToString();
                string de = xnode.SelectSingleNode("Description").InnerText.ToString();
                ThingsToDoObjects NeuObject = new ThingsToDoObjects(n, c, d, r, de);
                o.Add(NeuObject);
            }

现在当我调试时会发生以下情况: n 创建良好, c 创建良好。但是 d 不起作用。它给出了一个错误:

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

(这是我从德语翻译过来的,所以这个错误可能会被称为有点不同。这是怎么回事?我希望我只是犯了一些愚蠢的错误。

顺便说一句:我尝试了ParseExactly() 方法,但它也不起作用并给出了同样的错误。

提前感谢所有回答的人。

【问题讨论】:

  • 你试过使用 DateTime.TryParse() 吗?
  • 你能把字符串xnode.SelectSingleNode("DateDeadline").InnerText.ToString()的具体内容贴出来吗?
  • 我也是这门语言的初学者,很抱歉我的小问题,也许你已经做到了,但是:你试过 datetime.parse(xnode.SelectSingleNode("DateCreated").InnerText. ToString())?
  • 我还没有解析,只是精确解析。但是让我们感到奇怪的是,对于相似的字符串来说,同样的事情是不一样的。
  • 字符串 xnode.SelectSingleNode("DateDeadline").InnerText.ToString() 是它在 xml 中所说的,2013 年 2 月 17 日上午 12:00:00。我知道 ToString() 在那里没有必要,这只是我沮丧的尝试之一。

标签: c# xml xml-parsing


【解决方案1】:

(我假设您不能更改 XML 格式本身。按照 dtb 的建议,使用标准格式会好多更好。)

如果您有已知格式的文本,请使用DateTime.ParseExactDateTime.TryParseExact。如果您为它们提供正确的格式,它们起作用。在这些情况下,我通常也使用不变的文化进行解析——你不希望用户文化的日期分隔符等把事情搞砸。在这种情况下,您想要的格式字符串看起来是"M/d/yyyy h:mm:ss tt"

示例代码:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        string text = "2/17/2013 12:00:00 AM";
        string format = "M/d/yyyy h:mm:ss tt";
        DateTime value = DateTime.ParseExact(text, format,
                                             CultureInfo.InvariantCulture,
                                             DateTimeStyles.None);
        Console.WriteLine(value);
    }
}

如果可以的话,我也强烈建议使用 LINQ to XML。它将使您的 XML 处理比您当前的代码简单得多。

【讨论】:

  • 太好了,这行得通。虽然我还有一些问题:为什么是 M/d/yyyy 而不是 mm/dd/yyyy?你能告诉我为什么我的 Convert.ToDateTime()-idea 对一个有效,而对另一个无效? _它适用于 c,而不适用于 d。我觉得这很奇怪。
  • 我猜这就是回答所有与此相关的问题的链接:msdn.microsoft.com/en-us/library/az4se3k1.aspx。我真的很感谢你回答了我迄今为止在这里提出的几乎所有的 C# 问题。你真的帮了我很多,谢谢你。
  • @user1953145:更多的是:msdn.microsoft.com/en-us/library/8kb3ddd4.aspx - 至于为什么 c “工作” - 可能是因为 2/11/2013 可以解析为 d/M/yyyy... 而2/17/2013 不能。
【解决方案2】:

由于您提到从德语翻译,我假设您在德国。您可能正在尝试将日期解析为“您”。我的意思是使用德国文化格式化程序 (dd/mm/yyyy) 解析日期,并且没有第 17 个月可以解析。

尝试改用这个:

Convert.ToDateTime(value, CultureInfo.InvariantCulture.DateTimeFormat);

【讨论】:

  • 格雷特,这也很好。但为什么是第 17 个月。是十六进制的吗?
  • 因为被解析的日期是 2/17/2013 12:00:00 AM,但解析器试图将其解析为 dd/mm/yyyy,所以 17 位于月份位置。
  • 啊,好的。当您不知道时,这会令人困惑:-)。谢谢。
【解决方案3】:

有一个standard way to format date/time values in XML

<DateCreated>2013-11-02T04:35:05</DateCreated>

你可以使用XmlConvert.ToDateTime Method解析这种格式:

DateTime result = XmlConvert.ToDateTime("2013-11-02T04:35:05",
                                        XmlDateTimeSerializationMode.Utc);

或者,更好的是,看看LINQ-to-XML 并使用XElement to DateTime Explicit Conversion

DateTime result = (DateTime)obj.Element("DateCreated");

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 2011-10-16
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多