将字符串转换为mm/dd/yyyy格式
本文关键字:dd 格式 yyyy mm 字符串 转换 | 更新日期: 2023-09-27 18:16:21
我有以下不同格式的字符串:
<>之前16/05/2014截止2014年6月21日2014-05-1616-05-20145/19/20145月14日之前我需要将上述所有字符串转换为c#中的mm/dd/yyyy格式。我已经尝试在c#中使用DateTime.ParseExact
作为DateTime dt = DateTime.ParseExact("16-05-2014", "mm/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture)
,但我得到的异常是"字符串未被识别为有效的日期时间"。
我也试过使用Convert.ToDateTime()
,但它也不工作。
它在格式字符串的第一项失败,该项告诉函数将"16"视为分钟,并查找输入中不存在的小时、分钟和秒。
您有几种不同的日期格式,因此需要ParseExact()重载来接受几种不同的格式字符串:
string[] formats= {"dd/MM/yyyy", "dd-MMM-yyyy", "yyyy-MM-dd",
"dd-MM-yyyy", "M/d/yyyy", "dd MMM yyyy"};
string converted = DateTime.ParseExact("16-05-2014", formats, CultureInfo.InvariantCulture, DateTimeStyles.None).ToString("MM/dd/yyyy");
还要记住小写的"m"表示分钟。如果你想要月份,你需要一个大写的"M"。关于格式字符串的完整文档在这里:
http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
最后,我怀疑您在将输出格式化为字符串方面做得有些超前。尽可能长时间地将这些值保持为DateTime对象,并且只有在向用户显示它们之前的最后一刻才格式化为字符串。如果您确实需要一个字符串,至少要坚持使用ISO 8601标准格式。
您的主要问题是您的格式字符串错误。小的m
代表分钟,大的M
代表月。
尝试在数组中传递所有格式。例如:
DateTime.ParseExact("16-05-2014",
new[] {"dd/MM/yyyy", "dd-MMM-yyyy", "yyyy-MM-dd",
"dd-MM-yyyy", "M/d/yyyy", "dd MMM yyyy"},
CultureInfo.InvariantCulture, DateTimeStyles.None);
用这个你可以一次解析所有的格式。有关格式设置的更多信息,请参阅官方文档。
几点:
您输入的日期16/05/2014
与您的格式Month/Day/Year
不匹配-怎么会有第16个月?
其次,您使用的mm
代表Minutes
,而不是Months
。你应该使用MM
。
最后,您的示例字符串16-05-2014
与提供的格式不匹配,您使用了连字符-
而不是正斜杠/
提供与您的输入相匹配的不同格式的集合:
string[] formats = new [] { "MM/dd/yyyy", "dd-MMM-yyyy",
"yyyy-MM-dd", "dd-MM-yyyy", "dd MMM yyyy" };
DateTime dt = DateTime.ParseExact("05-16-2014", formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
您可能会发现以下方法很有用,可以接受您想要的任何日期格式并将其转换为DateTime:
public DateTime? DTNullable(string DateTimestring, string CurrDateTimeFormat)
{
if (string.IsNullOrEmpty(DateTimestring)) return null;
else
{
DateTime datetimeNotNull;
DateTime.TryParseExact(DateTimestring, CurrDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out datetimeNotNull);
return datetimeNotNull;
}
}
传入你想要转换为DateTime的字符串以及它的当前日期时间格式,这将返回一个可空的DateTime。如果你确定传入的字符串不会为空,那么你可以移除那个位。它存在的原因是您不能将null转换为DateTime。在我的情况下,我不能确定它是否会,所以我也需要捕获空值的能力。
你可以这样使用:
DateTime? MyDateTime = DTNullable(MyStartDate, "dd/MM/yyyy");
如果你愿意,你可以改变方法,接受一个字符串数组,并简单地遍历每个字符串,如果它们的格式相同,则返回一个列表。
正如其他人所指出的,月是MM而不是MM(分钟)。
在DateTime
对象上可以调用.ToString("MM/dd/yyyy")
。给定字符串,您可以首先为每个字符串创建新的DateTime
对象,然后调用.ToString("MM/dd/yyyy")
。例如:
var dateAsMmDdYyyy = DateTime.Now.ToString("MM/dd/yyyy");