我的应用程序的当前文化设置为西班牙语,但我需要将我的日期转换为英语才能执行数据库操作。
目前的日期将采用以下格式:" Dic 13,2017"
我需要将其转换为:" 2017年12月13日"
到目前为止我一直在尝试
var input = objDMSampleA.RequestDateFrom;
var format = "MMM dd, yyyy";
var dt = DateTime.ParseExact(input, format, new CultureInfo("es-ES"));
var result = dt.ToString(format, new CultureInfo("en-US"));
但是ParseExact给出错误
字符串未被识别为有效的DateTime。
答案 0 :(得分:6)
"短"给定文化的月份名称存储在CultureInfo.DateTimeFormat.AbbreviatedMonthNames
中。对于es-ES
文化,这些名称最后可能包含点(例如:" dic。"而不是" dic")。出于这个原因,解析你的字符串失败了 - " Dic"没有那个点。
要解决此问题,一种方法是修改这些名称:
var esCulture = new CultureInfo("es-ES");
var monthNames = esCulture.DateTimeFormat.AbbreviatedMonthNames;
for (int i = 0; i < monthNames.Length; i++) {
monthNames[i] = monthNames[i].TrimEnd('.');
}
esCulture.DateTimeFormat.AbbreviatedMonthNames = monthNames;
monthNames = esCulture.DateTimeFormat.AbbreviatedMonthGenitiveNames;
for (int i = 0; i < monthNames.Length; i++)
{
monthNames[i] = monthNames[i].TrimEnd('.');
}
esCulture.DateTimeFormat.AbbreviatedMonthGenitiveNames = monthNames;
然后您的代码将按预期工作:
var input = "Dic 13, 2017";
var format = "MMM dd, yyyy";
var dt = DateTime.ParseExact(input, format, esCulture);
var result = dt.ToString(format, new CultureInfo("en-US"));
最好将修改后的文化存储在某些静态字段中并重复使用,而不是每次都创建它并进行更改。
如果要修改所有线程的当前区域性,请使用
CultureInfo.DefaultThreadCurrentCulture = esCulture;
虽然我不推荐这样做。