将日期从西班牙语转换为英语

时间:2018-03-13 05:58:06

标签: c# asp.net

我的应用程序的当前文化设置为西班牙语,但我需要将我的日期转换为英语才能执行数据库操作。

目前的日期将采用以下格式:" 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。

1 个答案:

答案 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;

虽然我不推荐这样做。