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

C# 将日期从西班牙语转换为英语,c#,asp.net,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")); va

我的应用程序的当前区域设置为西班牙语,但我需要将日期转换为英语,以便执行数据库操作

当前日期以这种格式出现:“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给出的错误是

字符串未被识别为有效的日期时间

给定区域性的“短”月名存储在
CultureInfo.DateTimeFormat.缩写月名中。对于
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;
最好将修改后的区域性存储在某个静态字段中并重用,而不是每次都创建和更改

如果要修改所有线程的当前区域性,请使用

CultureInfo.DefaultThreadCurrentCulture = esCulture;
尽管我不建议这样做。

给定区域性的“短”月名存储在
CultureInfo.DateTimeFormat.缩写月名中。对于
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;
最好将修改后的区域性存储在某个静态字段中并重用,而不是每次都创建和更改

如果要修改所有线程的当前区域性,请使用

CultureInfo.DefaultThreadCurrentCulture = esCulture;

虽然我不建议这样做。

看起来
Dic。2017年12月13日
生效。我知道这没有多大帮助,但需要继续。上面的代码工作正常,您需要检查
RequestDateFrom
@FaizanRabbani的值,请证明您的声明。@MAK请参阅:@FaizanRabbani,如果您像这样初始化您的区域性:
new CultureInfo(“es”,false)?它还能正常工作吗?看起来
Dic。2017年12月13日
生效。我知道这没有多大帮助,但需要继续。上面的代码工作正常,您需要检查
RequestDateFrom
@FaizanRabbani的值,请证明您的声明。@MAK请参阅:@FaizanRabbani,如果您像这样初始化您的区域性:
new CultureInfo(“es”,false)?它还能正常工作吗?谢谢你的回复。我有一个问题,我应该在哪里执行您提到的操作,以便它成为我当前文化的一部分,并在当前会话期间继续执行应用程序?设置Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo(strucultureName)时是否应该这样做@MAK我真诚地建议您不要这样做,而是将此修改后的区域性存储在静态字段中,并在必要时使用。但是如果您愿意,您可以通过以下方式修改所有线程的当前区域性:
CultureInfo.DefaultThreadCurrentCulture=esCulture(应用程序启动时的某个地方)。然后可以使用
var dt=DateTime.ParseExact(输入、格式、CultureInfo.CurrentCulture)进行解析感谢您的回复。我有一个问题,我应该在哪里执行您提到的操作,以便它成为我当前文化的一部分,并在当前会话期间继续执行应用程序?设置Thread.CurrentThread.CurrentCulture=new System.Globalization.CultureInfo(strucultureName)时是否应该这样做@MAK我真诚地建议您不要这样做,而是将此修改后的区域性存储在静态字段中,并在必要时使用。但是如果您愿意,您可以通过以下方式修改所有线程的当前区域性:
CultureInfo.DefaultThreadCurrentCulture=esCulture(应用程序启动时的某个地方)。然后可以使用
var dt=DateTime.ParseExact(输入、格式、CultureInfo.CurrentCulture)进行解析