C#读取XML中dd-mm-yyyy格式日期时月份显示为00如何解决?
核心问题原因
你遇到的月份显示为00的问题,是DateTime格式化字符串使用错误导致的:小写mm对应的是时间单位分钟,月份的格式化符需要使用大写MM。你转字符串时没有传递时间参数,分钟默认值为00,因此替换了原本的月份位,才会出现04-00-2021这类错误输出。
方案1:快速修复现有自定义日期格式逻辑
如果你需要保留dd-MM-yyyy的自定义日期格式,直接修改两处格式化字符串,同时改用ParseExact指定格式解析,避免不同系统区域设置导致的解析异常:
修复后的读取方法
public void ShowDateOfLatestDataAction(TextBox pTextBox, int childNodeIndex) { XmlDocument doc = new XmlDocument(); doc.Load("./DatesAndLocations.xml"); string date = ""; // 可以直接用XPath定位节点,无需遍历 XmlNode datesNode = doc.SelectSingleNode("/configs/dates"); if (datesNode != null) { var latestDate = datesNode.ChildNodes[childNodeIndex]; string dateStr = latestDate.Attributes[0].Value; // 指定格式解析,避免区域格式不兼容 DateTime dateVal = DateTime.ParseExact(dateStr, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture); date = dateVal.ToString("dd-MM-yyyy"); } pTextBox.Text = date; }
修复后的写入方法
public void UpdateDateOfLatestDataAction(int childNodeIndex) { XmlDocument doc = new XmlDocument(); doc.Load("./DatesAndLocations.xml"); XmlNode datesNode = doc.SelectSingleNode("/configs/dates"); if (datesNode != null) { var elementToUpdate = datesNode.ChildNodes[childNodeIndex]; // 用大写MM表示月份 elementToUpdate.Attributes[0].Value = DateTime.Now.ToString("dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture); } doc.Save("./DatesAndLocations.xml"); }
方案2:遵循XML标准的日期读写(使用XmlConvert)
你提到的XmlConvert相关方法并未完全弃用,只是旧的无参数重载被弃用,现在推荐使用指定XmlDateTimeSerializationMode的重载,输出符合XML Schema规范的日期格式,兼容性更强:
读取示例
// 从XML属性读取标准格式日期 DateTime dateVal = XmlConvert.ToDateTime(attributeValue, XmlDateTimeSerializationMode.Local);
写入示例
// 转为XML标准格式写入属性 elementToUpdate.Attributes[0].Value = XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Local);
注意:该方案生成的日期为ISO 8601标准格式(如
2024-05-20),如果需要保留你自定义的dd-MM-yyyy格式,选择方案1即可。
内容的提问来源于stack exchange,提问作者Dasph
相关产品推荐
相关产品推荐

