我有以下不同格式的字符串:
16/05/2014 21-Jun-2014 2014-05-16 16-05-2014 5/19/2014 14 May 2014
我需要在c#中将所有上述字符串转换为mm / dd / yyyy格式。
我在C#中尝试使用DateTime.ParseExact
作为DateTime dt = DateTime.ParseExact("16-05-2014", "mm/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture)
,但我得到的异常是“字符串未被识别为有效的DateTime”。
我也尝试使用Convert.ToDateTime()
,但它也无效。
我们可以在C#中编写/提供任何方法或功能,将上述字符串格式转换为单一日期格式,即“mm / dd / yyyy”格式吗?
对此的任何帮助将不胜感激。
答案 0 :(得分:3)
它在格式字符串的第一个字段上失败,它告诉函数处理" 16"作为分钟并查找输入中不存在的小时,分钟和秒。
您有多种不同的日期格式,因此需要ParseExact() overload that accepts several different format strings:
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" s是几分钟。如果你想要几个月,你需要一个大写" M"。有关格式字符串的完整文档如下:
最后,我怀疑你在将输出格式化为字符串方面已经超前了。尽可能长时间地将这些值保存为DateTime对象,并且在向用户显示之前,仅在最后可能的时刻格式化为字符串。如果你真的想要一个字符串,至少坚持使用ISO 8601 standard format.
答案 1 :(得分:1)
您的主要问题是格式字符串错误。一小部分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);
有了这个,您可以一次解析所有格式。 有关格式设置的详细信息,请参阅官方docs。
答案 2 :(得分:1)
少数事情:
您的输入日期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);
答案 3 :(得分:0)
在DateTime
对象上,您可以拨打.ToString("MM/dd/yyyy")
。给定您拥有的字符串,您可以先为每个字符串创建新的DateTime
对象,然后调用.ToString("MM/dd/yyyy")
。例如:
var dateAsMmDdYyyy = DateTime.Now.ToString("MM/dd/yyyy");
答案 4 :(得分:0)
您可能会发现以下方法可用于接受您想要的任何日期格式并将其转换为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,那么您可以删除该位。它存在的原因是你不能将null转换为DateTime。就我而言,我无法确定它是否存在,所以我也需要能够捕获空值。
你可以像这样使用它:
DateTime? MyDateTime = DTNullable(MyStartDate, "dd/MM/yyyy");
如果你想要你可以改变方法来接受一个字符串数组,只需遍历每个字符串并将它们全部返回到列表中,如果它们具有相同的格式。
正如其他人所指出的,月数是MM而不是mm(分钟)。