无效格式字符串的DateTime格式字符串

时间:2015-05-12 12:57:35

标签: c# datetime format type-conversion

我正在尝试使用

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

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

2015 04 DDr

因为

DateTime.ToString(format)

始终返回有效的String。

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

的内容
2015 04 DDr

3 个答案:

答案 0 :(得分:3)

如果您认为以您的格式插入的所有字母都是分隔符或应转换为DatePart的字母,您可以检查转换日期后是否还有未转换的非分隔符字符,如下所示: / p>

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观察后编辑:

此代码假设您只转换为Numbers,如果您正在执行将转换为Day字符串的内容,例如星期二,则逻辑可能会失败。为了解决这种情况,代码会变得更复杂,但也可以通过以下方式实现:

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();
}

答案 1 :(得分:2)

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

enter image description here

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

答案 2 :(得分:1)

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

您应该仔细考虑哪些适合用户,甚至让他有机会从一些预定义的块构建格式。也许用确认显示样品转换。

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