C# 文化日期时间变化
我有一个VSTO应用程序,可以执行邮件合并和其他操作 邮件合并数据库是一个Excel数据库,有一些C# 文化日期时间变化,c#,vsto,C#,Vsto,我有一个VSTO应用程序,可以执行邮件合并和其他操作 邮件合并数据库是一个Excel数据库,有一些DateTime字段存储为(dd/MM/YYYY)(例如,2012年4月29日)。我的问题是,在Excel中日期看起来不错,但在Word中它以其他格式显示(MM/dd/yyyy)(例如2012年4月29日)。当尝试在我的VSTO应用程序上获取此日期时,它会抛出一个转换错误,表明字符串的格式错误 所有这些都发生在同一台机器上。如果我将VSTO中的文化信息更改为en US,则效果良好 // This w
DateTime
字段存储为(dd/MM/YYYY)(例如,2012年4月29日)。我的问题是,在Excel中日期看起来不错,但在Word中它以其他格式显示(MM/dd/yyyy)(例如2012年4月29日)。当尝试在我的VSTO应用程序上获取此日期时,它会抛出一个转换错误,表明字符串的格式错误
所有这些都发生在同一台机器上。如果我将VSTO中的文化信息更改为en US,则效果良好
// This way fails
edictoActual.FechaEdicto = Convert.ToDateTime(fields(fieldFechaEdicto).value);
// This way Works
IFormatProvider Formato = new System.Globalization.CultureInfo("en-US", true);
edictoActual.FechaEdicto = Convert.ToDateTime(fields(fieldFechaEdicto).value,Formato);
为什么会这样 你能
format
你想要的预期输出的日期吗?不,日期以字符串字段(fieldFechaEdicto)的形式出现在我的面前。它存储在mailmerge数据源中。Juan我将发布一个示例,你可以使用一个简单的switch语句来确定如何做到这一点。。基于此示例,您应该能够看到我正在尝试的内容,并且您可以根据自己的意愿添加到示例中。您可以关注代码中的案例10:
,这是我多次编写和使用的内容,因为在处理传入数据时,某些数据始终不会以10位数的日期格式出现。。希望这个例子能给你一个想法。。此外,在代码中,您还可以编写自己的方法来解析/构建子字符串以传回正确的日期格式。。选择是无止境的。你怎么知道“02/03/2012”
是指3月2日还是2月3日?非常感谢你的帮助,似乎一定要使用文化。Tks一个LotDo Word和Excel有不同的默认区域性,如果没有提供,则会接管它们?Tks Ryan。真的不明白注释上面的代码不是很有用,因为格式“M/d/yyyy”
即使月号和/或日期号有两位数字也可以使用。还有,为什么要使用“英语(美国)”文化?该应用程序是否针对美国讲英语的人。?我建议使用CultureInfo.InvariantCulture
,它具有以下特点:(1)使用gregorianalendar
。(2) 使用字符串“/”
(斜杠)作为日期分隔符
。Jeepe该代码在m/d/yyyy
中不是他的问题的一部分,但是如果您查看根据Case
语句格式化的日期,该代码将起作用。。你会看到它会起作用的。。并非每个人都能以传统的mm/dd/yyyy
格式获得Dates
,我们在美国文化中看到这种格式
我发布了答案,为OP提供了一种额外的选项/方式,可以根据日期格式修复代码。。创造性思考
string DateString = "29/04/2012"; //DateString needs to be replaced with your fields value as a string
var dateLength = DateString.Length;
IFormatProvider culture = new CultureInfo("en-US", true);
DateTime dateVal;
switch (dateLength)
{
case 8:
{
dateVal = DateTime.ParseExact(DateString, "M/d/yyyy", culture);
break;
}
case 9:
{
// he you can add your own additional if(){} condition to check if date value Day has a length of 2
// if so then you know that the date is in m/dd/yyyy format
// otherwise you know it's in mm/d/yyyy but
dateVal = DateTime.ParseExact(DateString, "M/dd/yyyy", culture);
break;
}
case 10:
{
dateVal = DateTime.ParseExact(DateString, "MM/dd/yyyy", culture);
//or change the above to look like the following
//dateVal = DateTime.ParseExact(DateString, "dd/MM/yyyy", culture);
break;
}
}