无效格式字符串的日期时间格式字符串
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
格式,因为您可以解析具有完全相同格式的格式化字符串。即使在解析之后你没有丢失日期的任何部分,也不能形成最终决定 - valid
或 invalid
格式。
你应该仔细考虑什么是适合用户的,甚至给他机会从一些预定义的块中构建格式。可能会显示带有确认的示例转换。
对于特定格式,您可以创建一些扩展方法,您可以在其中应用业务规则并在需要时抛出异常。
我正在尝试使用
格式化日期时间字符串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
格式,因为您可以解析具有完全相同格式的格式化字符串。即使在解析之后你没有丢失日期的任何部分,也不能形成最终决定 - valid
或 invalid
格式。
你应该仔细考虑什么是适合用户的,甚至给他机会从一些预定义的块中构建格式。可能会显示带有确认的示例转换。
对于特定格式,您可以创建一些扩展方法,您可以在其中应用业务规则并在需要时抛出异常。