将字符串转换为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(),但它也不工作。

是否有任何方法或函数,我们可以在c#中编写/可用,将上述字符串格式转换为单一日期格式,即"mm/dd/yyyy"格式?

将字符串转换为mm/dd/yyyy格式

它在格式字符串的第一项失败,该项告诉函数将"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");