无效格式字符串的日期时间格式字符串

DateTime format string for invalid Format string

我正在尝试使用

格式化日期时间字符串
date.ToString(format)

如果用户输入格式错误,例如"YYYY MM DDr" 我想知道我是否可以使用该格式转换日期时间,而不是返回

2015 04 DDr

因为

DateTime.ToString(format)

总是returns 一个有效的字符串。

例如,是否有任何方法可能会在转换失败时抛出异常,以便我可以捕获并决定不显示我的输出字符串,而不是显示类似

的内容
2015 04 DDr

如果您假设格式中插入的所有字母都是分隔符或应转换为 DatePart 的字母,您可以检查在转换日期后是否仍有未转换的非分隔符字符,如下所示:

public static class DateTimeExtension
    {
        public static string ToStringExt(this DateTime p_Date, String format)
        {
            char[] separators = { ' ', '/', '-' };

            String stringDate = p_Date.ToString(format);

            foreach (char dateChar in format)
            {
                if (stringDate.Contains(dateChar) && !separators.Contains(dateChar))
                {
                    throw new FormatException("Format Error");
                }
            }
            return stringDate;
        }
    }

根据@Vladimir Mezentsev 观察编辑:

此代码假设您只转换为数字,如果您正在做的事情将转换为像星期二这样的日期字符串,逻辑可能会失败。为了解决这种情况,代码会变得更复杂一些,但也可以通过这样的方式实现:

public static string ToStringExt(this DateTime p_Date, String format)
{
    foreach (string dateFormatPart in getFormatStrings(format))
    {
        if (p_Date.ToString(dateFormatPart) == dateFormatPart)
        {
            throw new FormatException("Format Error");
        }
    }
    return p_Date.ToString(format);
}

private static IEnumerable<string> getFormatStrings(String format)
{
    char[] separators = { ' ', '/', '-' };
    StringBuilder builder = new StringBuilder();

    char previous = format[0];
    foreach (char c in format)
    {
        if (separators.Contains(c) || c != previous)
        {
            string formatPart = builder.ToString();
            if (!String.IsNullOrEmpty(formatPart))
            {
                yield return formatPart;
                builder.Clear();
            }
        }
        if(!separators.Contains(c))
        {
            builder.Append(c);
        }
        previous = c;
    }
    if (builder.Length > 0)
        yield return builder.ToString();
}

看看https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx。特别是这部分...

如果您想要验证用于格式化 DateTime 对象的字符串,那么您可能必须使用提供的 link 编写您自己的字符串以了解可接受的格式,并对待任何其他格式字符错误。

没有invalid格式,因为您可以解析具有完全相同格式的格式化字符串。即使在解析之后你没有丢失日期的任何部分,也不能形成最终决定 - validinvalid 格式。

你应该仔细考虑什么是适合用户的,甚至给他机会从一些预定义的块中构建格式。可能会显示带有确认的示例转换。

对于特定格式,您可以创建一些扩展方法,您可以在其中应用业务规则并在需要时抛出异常。