我的应用程序中有以下代码,它从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"
看到它在我的开发电脑上工作正常,我该怎么做才能找出环境中的不同之处,以及如何将这部分重新编码以便在任何地方工作?
答案 0 :(得分:3)
问题出在特定的机器文化中。 Convert.ToDateTime
将使用系统定义的文化解析字符串。对于一个系统 11/13/2013 将是一个有效的日期,但对于另一个系统(乌克兰语,例如,其中月份应该在第二位:) :)它不是有效的应该 13 /二千零十三分之十一强>
当您将数字/日期/语言环境特定数据存储在字符串中时,应始终考虑客户端文化。为了使事情更清楚,我建议您使用InvarianCulture
来存储/转换特定于文化的数据。
存储在字符串字段中的不变日期样本:
var invariantStringDate = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat);
答案 1 :(得分:2)
来自Convert.ToDateTime Method (String)
如果value不为null,则返回值是调用的结果 使用a中的格式信息对值的DateTime.Parse方法 为当前区域性初始化的DateTimeFormatInfo对象。 value参数必须包含日期和时间的表示 以DateTimeFormatInfo主题中描述的格式之一。
在您的情况下,看起来您的当前文化中没有描述此格式。我的钱是你的文化需要13个月 :)
您可以将DateTime.ParseExact
与CultureInfo.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
。