C# 转换为日期时间

C# 转换为日期时间,c#,datetime,C#,Datetime,我想将字符串转换为DateTime对象。我的字符串格式为“2016年7月18日”(日期可以更改)。显然,.Net不将此作为有效的日期格式。有没有不使用任何第三方库就可以轻松转换的方法?解决方法: string dateStr = "18th Jul 2016"; dateStr = dateStr.Replace("th", "").Replace("st", "").Replace("rd", "").Replace("nd", ""); DateTime date; if (DateTim

我想将字符串转换为DateTime对象。我的字符串格式为“2016年7月18日”(日期可以更改)。显然,.Net不将此作为有效的日期格式。有没有不使用任何第三方库就可以轻松转换的方法?

解决方法:

string dateStr = "18th Jul 2016";
dateStr = dateStr.Replace("th", "").Replace("st", "").Replace("rd", "").Replace("nd", "");

DateTime date;
if (DateTime.TryParseExact(dateStr, "dd MMM yyyy", CultureInfo.CurrentCulture, 
                                                  DateTimeStyles.AssumeLocal, out date))
{

}
else
{
    // error
}

我不会使用
String.Replace
,因为如果当前区域性的月份名称包含要替换的字符串,则可能会出现问题

相反,您可以从字符串中删除此部分:

string input = "18th Jul 2016";
string[] token = input.Split();  // split by space, result is a string[] with three tokens
token[0] = new string(token[0].TakeWhile(char.IsDigit).ToArray());
input = String.Join(" ", token);
DateTime dt;
if(DateTime.TryParseExact(input, "dd MMM yyyy", null, DateTimeStyles.None, out dt))
{
    Console.WriteLine("Date is: " + dt.ToLongDateString());
}

如果将
null
作为
IFormatProvider
传递给当前区域性的datetimeformat,则会使用。如果你想强制使用英文名称,你可以传递
CultureInfo.InvariantCulture

这有点假,但是

string result = System.Text.RegularExpressions.Regex.Replace(dt, "[st|th|nd|rd]{2} ", " ", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
DateTime d = DateTime.Parse(result);

我加入了这个空间,这样它就不会试图编辑这个月。。我确实从[0-9]{1,2}开始,并用数字替换它,但这似乎有些过分了

您是否检查了该方法?相关:替换方法容易受到本地化问题的影响,可能有些国家使用
st
nd
th
rd
以月份的名义。此解决方案看起来不错,因为我的代码应该运行在一台内部机器上,我们不希望出现任何本地化问题,输入将始终采用此格式。谢谢你的帮助!比
CultureInfo.CurrentCulture
更好的方法是使用
CultureInfo.InvariantCulture
@Ghasan:不更好,但在强制使用英文名称时正确;)谢谢你的修复
string dateString = "18th Jul 2016";
dateString = Regex.Replace(dateString, @"^(\d{2})(st|nd|rd|th)", "$1");
var result = DateTime.ParseExact(dateString, "dd MMM yyyy", CultureInfo.InvariantCulture);